Недавно начал писать диплом - и получил удар Verilog'ом, как обухом, по голове. Задача передо мною стоит невеликая, но с ходу окунаться в мир FPGA и низкоуровнего проектирования сложновато - поэтому попробую рассказать, что я хочу сделать и как хочу это сделать, а вас прошу высказать своё мнение - стоит ли так делать, или нет?
Я разрабатываю помехоустойчивый кодер - устройство, в которое входит поток битов (они должны делиться на блоки-слова по 7 бит) - внутри он преобразуется различными методами (кодирование Рида-Маллера - хитрое перемножение с матрицей), и на выходе мы встречаем блоки уже по 64 бита.
Использую для разработки Xilinx ISE WebPack 14.7, как язык описания - Verilog.
Как я представляю это себе на данный момент:
1. На входе, куда поступает непрерывный битовый поток, стоит регистр сдвига 1->8, упаковывающий всё в шину, чтобы дальше можно было работать с каждым битом на "отдельном проводе" (умножать каждый бит на вектор из матрицы). Если в реальности обрабатывать информацию поблочно так и принято, то этот блок "провод-шина" будет реализован чисто схемотехнически, как регистр с необходимым обвесом.
2. Реализация матрицы. Тут выходит на сцену Verilog. При выбранных мною параметрах кодирования, матрица ("порождающая", согласно алгоритму) будет иметь размерность 64x7 (7 строк). Фактически, она является постоянной и вполне определённой для каждого кода Рида-Маллера - так что можно её "захардкодить" как двумерный массив, но на мой взгляд это выглядит неэстетично. Хочется, конечно, реализовать её генерацию в зависимости от желаемых параметров кодирования, но я не уверен, что в проектировании железа и на вентильных матрицах в частности так поступают (ведь эта память неопределённого размера займёт немало места, и я не знаю, сможет ли матрица генерироваться каждый раз при поступлении в схему сигналов с другими параметрами кодирования, ведь это, по сути, нехилое изменение внутренней топологии схемы) - этот шаг больше подходит для классичесих языков программирования, как мне кажется.
3. Захардкодили мы матрицу, или нет - теперь просто перемножаем пришедший на неё блок информации на векторы, согласно позициям, которые занимают биты в исходном слове. Т.е. здесь опять очередь Verilog'а.
4. На выходе блока с матрицей получаем 64 символа. Если ход с регистром (п.1) подходит - в Xilinx ISE я нашёл от силы 16-разрядные регистры сдвига. Возникает вопрос - можно ли слепить из нескольких подобных один 64->1, сливающий шину воедино? Или модифицировать существующий (если его исходный код можно увидеть - я пока не докопался до него, но, по идее, такая возможность должна быть)? Или что?
Вот так, в структуре, на данный момент я вижу свою работу. Из всего текста выше (на случай, если многабукаф), вопросы: как реализовать в цифровой технике (а точнее - на FPGA) поблочную обработку поступающего битового потока и воссоединение его после воедино? И как стоит работать с матрицами констант? Задавать всё, что можно, жёстко, или пытаться наладить какую-то гибкость ради поддержания чувства прекрасного?
Буду премного благодарен толковым советам!




