Есть поток данных 32 бит шириной. Данные в нем передаются по специфическому протоколу. Поток характеризуется тремя наборами бит: State - лежит в диапазоне от 1 до 20. Выделил 5 бит на этот сигнал. Switch - четыре бита, возможны все варианты от 0 до 15 Skip - 15 бит. Если младший бит единица, то все остальные тоже единицы. Если второй бит - единица, то с 3 по 15 бит - тоже единицы. И так далее. Такая треугольная матрица получается.
На каждом такте из входного потока я вытаскиваю Switch (это старшие биты байт). Еще если State = 1, то я переопределяю вектор Skip на основе принятого слова из потока данных.
Итак на каждом такте мне нужно перерасчитать State.
Если делать в лоб и перебирать все возможные состояния, то у меня есть 5 + 4 = 9 бит, которые могут быть любыми, а это 512 состояний. И еще есть вектор skip, который определяет еще 15 состояний. И того 512*15 = 7680. Это получается нужно написать 7680 ифов (if ... elsif ... elsif ... .... else ...).
За несколько дней написал половину. Скомпилил. Не прохожу по частоте. Частота достаточно высокая (300 МГц, Аррия 10), понизить ее нельзя. Если делать дальше, то еще хуже будет.
Сейчас думаю, как это можно реализовать по другому. Буду признателен за любые советы.
Вот смотрю я на расчет CRC32, к примеру один из битов новой crc рассчитывается так: newcrc(0) := d(31) xor d(30) xor d(29) xor d(28) xor d(26) xor d(25) xor d(24) xor d(16) xor d(12) xor d(10) xor d(9) xor d(6) xor d(0) xor c(0) xor c(6) xor c(9) xor c(10) xor c(12) xor c(16) xor c(24) xor c(25) xor c(26) xor c(28) xor c(29) xor c(30) xor c(31); d - это данные, c - это предыдущая crc. И в том же духе остальные 31 бит. Может можно как то также (мысли вслух)?
|