To go2winner.
То, что вы начали изучение ЦОС в FPGA с нерекурсивных цифровых фильтров это правильно.
Эти фильтры и не сложные для новичка, и применяются достаточно широко.
Рекурсивные цифровые фильтры отбросьте в сторону, они на архитектуру FPGA ложатся плохо, у них повышенные требования к разрядностям сумматоров и умножителей.
Что изучать дальше зависит от того, какие задачи вы собираетесь решать.
Если, например, двигаться в сторону Software Defined Radio, то стоит присмотреться к Digital Down Converter и Digital Up Converter, ещё нужно поразбираться с децимацией и интерполяцией сигналов.
Всё что написано ниже относится к FPGA Xilinx, и мне трудно сказать, насколько это справедливо для Альтеры и др. производителей.
По цифровым фильтрам.
В современных FPGA на программируемой логике обычно фильтры не делают, для этого используют DSP-блоки.
Например, в Spartan-6, реализованы DSP-блоки DSP48A1 (это просто наименование примитива, в зависимости от семейства FPGA эти примитивы немного различаются между собой). Этот DSP блок содержит целочисленный умножитель 18x18 с 36-битным выводом результата и 48-битный аккумулятор (вспомогательные регистры, предсумматор я опустил).
Для вас сейчас главное, что разрядности умножителей 18x18 -> 36, умножители целочисленные, никакой плавающей точки в DSP блоках нет. От этой разрядности можно плясать дальше.
Например в 7-й серии FPGA (Virtex-7, Kintex-7, Artix-7) DSP блоки более функциональны, в том числе умножители вида 18x25 -> 43, большие точности можно получить.
По вашему примеру применительно к Spartan-6.
16-битный сигнал с АЦП нужно расширить до 18 бит (здесь должно быть именно знаковое расширение) перед подачей на DSP блоки.
По коэффициентам.
Все коэффициенты, которые приводились выше, а именно,
Код
-0.0099 0.0787 0.1166 0.1647 0.1946 0.1946 0.1647 0.1166 0.0787 -0.0099
лежат в диапазоне -1 … 1. Т.о. для коэффициентов можно использовать представление чисел с фиксированной точкой 1.17. Один старший разряд, на это указывает единица перед точкой, это целая часть, по сути знак коэффициента, а остальные 17 разрядов (число после десятичной точки) – дробная часть.
В 16-ричной системе счисления коэффициенты будут выглядеть так:
Код
0x3FAEE 0x0284B 0x03BB3 0x05454 0x063A3 0x063A3 0x05454 0x03BB3 0x0284B 0x3FAEE
Они же в десятичной:
Код
-1298 10315 15283 21588 25507 25507 21588 15283 10315 -1298
По сути, коэффициенты были просто домножены на 2^17 = 131072 и округлены.
Теперь отсчёты сигнала и пересчитанные коэффициенты можно подавать на DSP блоки.
Что будет на выходе.
При умножении 18-битного целого на число с фиксированной точкой 1.17 результат будет 19.17, т.е. у нас 19 разрядов целой части числа и 17 дробной части. После суммирований результатов умножений ничего не изменяется и младшие 17 разрядов по-прежнему дробная часть.
Собственно и всё. Дальше результат можно округлить и оставить столько разрядов сколько нужно.
Надеюсь, не слишком туманно выразился.
В качестве простенькой программки расчёта КИХ фильтров могу предложить Iowa Hills FIR Filter Designer, коэффициенты можно получить за несколько кликов мышкой и в ней же увидеть характеристики фильтра.
Скачать можно здесь:
http://www.iowahills.com/8DownloadPage.htmlhttp://www.iowahills.com/5FIRFiltersPage.html