Цитата(novartis @ Mar 21 2017, 18:31)

Есть поток данных 32 бит шириной. Данные в нем передаются по специфическому протоколу.
Поток характеризуется тремя наборами бит:
State - лежит в диапазоне от 1 до 20. Выделил 5 бит на этот сигнал.
Switch - четыре бита, возможны все варианты от 0 до 15
Skip - 15 бит. Если младший бит единица, то все остальные тоже единицы. Если второй бит - единица, то с 3 по 15 бит - тоже единицы. И так далее. Такая треугольная матрица получается.
На каждом такте из входного потока я вытаскиваю Switch (это старшие биты байт).
Еще если State = 1, то я переопределяю вектор Skip на основе принятого слова из потока данных.
Итак на каждом такте мне нужно перерасчитать State.
Может можно как то также (мысли вслух)?
Не вдаваясь в Ваши тонкости...
Представим, что принимаем Ethernet. И там есть 6 байт адреса, если я не ошибаюсь... Давно дело было...

Так вот, можно принять данные в регистр, потом сделать на эти 6 байт схему сравнения... И угробить немеряно ресурсов и быстродействия.
А можно сделать сдвиговый регистр, куда перед приемом пакета записывать адрес с которым надо сравнивать. И схема сравнения должна быть сделана на ту разрядность, какая принимается из трансивера. Бит, тетрада или байт. В темпе приема пакета данные приходят из линии и сравниваются с тем, что есть в сдвиговом регистре. Ну и он так же сдвигается на бит, тетраду или байт. И самая вишенка на торте. Это триггер адреса. Если при очередном сравнении он не сбросится и простоит до конца сравнений, то адрес совпал. Если не сравнилось, то триггер сбрасывается и пакет - не наш...
Ну а в Вашем случае можно сделать несколько сдвиговых регистров, которые в темпе приема продешифрируют ситуацию...