Проектирование последовательных КИХ-фильтров в САПР ПЛИС Quartus II
Линия задержки, ПЗУ для хранения коэффициентов, управляющий автомат разработаны на языке Verilog, умножитель использует мегафункцию LPM_MULT, а аккумулятор представляет собой иерархическое описание на языке Verilog, нижний уровень которого — verilog-файл, cгенерированный мегафункцией LPM_ADD_SUB. Умножитель показан в виде символа, а линия задержки, коэффициенты и управляющий автомат — в виде блок-схем.
Адаптируем данный пример под задачу проектирования последовательного КИХ-фильтра на четыре отвода y = C0x0+C1x1+C2x2+C3x3 со следующими коэффициентами: C0 = –2, C1 = –1, C2 = 7 и C3 = 6.
КИХ-фильтры, использующие в своей основе блоки умножения и накопления, получили в зарубежной литературе название MAC FIR Filter (в нашем случае 1 MAC-фильтр). В статьях [2, 3] приведены примеры проектирования таких фильтров в системе Xilinx System Generator с применением библиотеки Reference BlockSet/DSP, а в работе [4] — с использованием пакета расширения Altera DSP Builder ver. 12.1 системы визуально-имитационного моделирования Matlab/Simulink (версия 8.0.0.783 (R2012b)). Примеры из работ [2, 3, 4] демонстрируют возможности методологии объектно-ориентированного проектирования [5].
На рис. 1 изображен иерархический проект последовательного КИХ-фильтра на четыре отвода в САПР Quartus II версии 13.0, на рис. 2 показана структурная схема проекта, представленная на уровне регистровых передач и полученная с помощью RTL-viewer. Входной сигнал и коэффициенты фильтра предусмотрены в дополнительном коде с 8‑ и 4‑битной точностью, поэтому умножитель и аккумулятор также настроены для выполнения операций над числами со знаком.
Проект использует два синхросигнала — clk и clkx2. Синхро-сигнал clk применен для тактирования линии задержки и внутреннего регистра аккумулятора фильтра, а clkx2 — для тактирования работы регистра результата. Период синхросигнала clk в два раза больше clkx2. Умножитель и сумматор аккумулятора настроены для работы в асинхронных режимах.
Пример 1 демонстрирует verilog-код линии задержки на четыре отвода. На рис. 3 дана структурная схема линии задержки на базе регистров. Пример 2 показывает verilog-код ПЗУ для хранения коэффициентов фильтра, на рис. 4 можно видеть структурную схему ПЗУ на базе дешифратора. Пример 3 представляет verilog-код управляющего автомата КИХ-фильтра. На рис. 5а изображена структурная схема управляющего автомата, а на рис. 5б — диаграмма состояний, на рис. 5в — таблица переходов и таблица кодирований состояний. Используется кодирование с одним активным или горячим состоянием (one hot encoding, OHE), то есть в каждый конкретный момент времени активным (hot) может быть только один триггер состояния. Метод ОНЕ применительно к ПЛИС FPGA дает возможность строить конечные автоматы, которые в общем случае требуют меньших ресурсов и отличаются более высокими скоростными показателями, чем аналогичные конечные автоматы с двоичным кодированием состояний.
module taps ( clk, reset, sel, newt, d, x ); input clk; input reset; input [1:0] sel; input newt; input [7:0] d; output [7:0] x; reg [7:0] x, xn, xn_1, xn_2, xn_3; // Register element always @(posedge clk or posedge reset) begin if (reset) begin xn = 8'b00000000; xn_1 = 8'b00000000; xn_2 = 8'b00000000; xn_3 = 8'b00000000; end else if (newt) begin xn_3 = xn_2; xn_2 = xn_1; xn_1 = xn; xn = d; end end // Mux element always @(sel or xn or xn_1 or xn_2 or xn_3) case (sel) 2'b 00: x = xn; 2'b 01: x = xn_1; 2'b 10: x = xn_2; 2'b 11: x = xn_3; default: x = 8'bXXXXXXXX; endcase endmodule Пример 1. verilog-код линии задержки
module hvalues ( sel, h ); input [1:0] sel; output [3:0] h; reg [3:0]h; always @(sel) case (sel) 2'b 00 : h = 4'b 1110; 2'b 01 : h = 4'b 1111; 2'b 10 : h = 4'b 0111; 2'b 11 : h = 4'b 0110; endcase endmodule Пример 2. verilog-код ПЗУ для хранения коэффициентов фильтра
module state_m ( clk, reset, newt, sel, follow, first ); input clk, reset, newt; output follow, first; output [1:0]sel; reg follow, first; reg [1:0] sel; reg [2:0] filter; parameter idle = 0, tap1 = 1, tap2 = 2, tap3 = 3, tap4 = 4; always begin case (filter) idle: begin sel = 2'b0; follow = 1'b0; first = 1'b0; end tap1: begin sel = 2'b0; follow = 1'b0; first = 1'b1; end tap2: begin sel = 2'b01; follow = 1'b0; first = 1'b0; end tap3: begin sel = 2'b10; follow = 1'b0; first = 1'b0; end tap4: begin sel = 2'b11; follow = 1'b1; first = 1'b0; end default : begin sel = 2'b00; follow = 1'b0; first = 1'b0; end endcase end always @(posedge clk or posedge reset) begin if (reset) filter = idle; else case (filter) idle: begin if (newt) filter = tap1; end tap1: begin filter = tap2; end tap2: begin filter = tap3; end tap3: begin filter = tap4; end tap4: begin if (newt) filter = tap1; else filter = idle; end endcase end endmodule Пример 3. verilog-код управляющего автомата КИХ-фильтра
На рис. 6 показана структурная схема умножителя размерностью операндов 8×4, настроенная на асинхронный режим работы (clock=0). Умножитель проектируется на базе мегафункции LPM_MULT. Точность вычисления произведения — 12 разрядов. Для реализации умножителя будем использовать аппаратные умножители ПЛИС. Всего в ПЛИС EP3C5F256C6 предусмотрено 46 аппаратных умножителей с размерностью операндов 9×9.
На рис. 7 представлен сумматор/вычитатель на базе мегафункции LPM_ADD_SUB. Сумматор/вычитатель способен работать как в асинхронном, так и в синхронном режиме. По умолчанию предполагается, что входные сигналы сумматора data[11..0] и datab[11..0] представлены в дополнительном коде.
Пример 4 демонстрирует verilog-код аккумулятора КИХ-фильтра, а на рис. 8 видна структурная схема аккумулятора, соответствующая этому коду. Аккумулятор (функциональный блок acc) выполнен на основе асинхронного накапливающего сумматора, на базе мегафункции LPM_ADD_SUB, регистра и мультиплексора для принудительной установки входа сумматора datab[11..0] в ноль. Пример 5 демонстрирует фрагмент verilog-кода функции, используемой в примере 4.
module acc ( xh, clk, first, yn ); input [11:0] xh; input clk; input first; output [11:0] yn; reg [11:0]yn; reg [11:0] ynm, result, a_in; wire [11:0] inter; // Describe Multiplexer always @(first or result) begin case (first) 1'b 0: ynm = result; 1'b 1: ynm = 12'b00000000000; endcase end always @(posedge clk) begin result = inter; end always @(xh) begin a_in[11:0] = (xh); //a_in[12] = 0; end always @(result) begin yn[11:0] = result[11:0]; end accum inst_13(.dataa(a_in), .datab(ynm), .result(inter)); endmodule Пример 4. verilog-код аккумулятора КИХ-фильтра
module accum ( dataa, datab, result); input [11:0] dataa; input [11:0] datab; output [11:0] result; wire [11:0] sub_wire0; wire [11:0] result = sub_wire0[11:0]; lpm_add_sub lpm_add_sub_component ( .dataa (dataa), .datab (datab), .result (sub_wire0) // synopsys translate_off , .cout (), .cin (), .add_sub (), .overflow (), .clock (), .clken (), .aclr () // synopsys translate_on ); defparam lpm_add_sub_component.lpm_direction = "ADD", lpm_add_sub_component.lpm_hint = "ONE_INPUT_IS_CONSTANT=NO,CIN_USED=NO", lpm_add_sub_component.lpm_type = "LPM_ADD_SUB", lpm_add_sub_component.lpm_width = 12; endmodule Пример 5. Фрагмент verilog-кода функции accum (накапливающий сумматор) на базе мегафункции lpm_add_sub
На рис. 9 и 10 дано функциональное моделирование импульсной характеристики КИХ-фильтра на четыре отвода и прохождение сигнала по структуре фильтра. На вход фильтра поступает сигнал –5, 3, 1, 0, 0, 0 и т. д. Правильные значения на выходе фильтра: 10, –1, –40, –10, 25, 6, 0 и т. д.
Переработаем проект (рис. 1), применяя несколько вариантов. Рассмотрим вариант, когда умножитель и аккумулятор синхронизуются общим синхросигналом clk, но реализуются с помощью мегафункции умножения LPM_MULT и накопления ALTACCUMULATE. В случае использования мегафункции ALTACCUMULATE отпадает необходимость в разработке вспомогательных узлов аккумулятора (рис. 8). Следует заметить, что мегафункция ALTACCUMULATE не входит в разработчик мегафункций (MegaWizard Plug-In Manager) для САПР Quartus II версии 13.1. Реализуется на базе логических элементов для ПЛИС серии Cyclone III и на базе адаптивных логических элементов для ПЛИС серии Stratix III.
Входной сигнал и коэффициенты фильтра представим с 8‑разрядной точностью. Все функциональные блоки проекта на верхнем уровне иерархии представим символами. Линия задержки, ПЗУ и управляющий автомат представлены verilog-кодом и корректировке не подлежат. На рис. 11 показан проект последовательного КИХ-фильтра на четыре отвода с использованием аккумулятора на мегафункции ALTACCUMULATE, а на рис. 12 демонстрируется функциональное моделирование прохождения сигнала по структуре КИХ-фильтра. Латентность умножителя и аккумулятора составляет 1 такт синхрочастоты. Для согласования работы управляющего автомата и аккумулятора необходимо выходной сигнал first автомата задержать на один такт синхрочастоты с помощью двухтактного триггера, выход которого нужно подключить ко входу сигнала синхронной загрузки аккумулятора sload. Результаты умножения и вычисления суммы произведений представляются с 16‑разрядной точностью. Для получения правильных значений профильтрованного сигнала на выходе yn_out[15..0] следует выходной сигнал follow задержать на три такта синхрочастоты и подключить его к входу разрешения тактирования ena регистра результата.
Рассмотрим вариант, когда умножитель и аккумулятор реализованы на мегафункции умножения и накопления ALTMULT_ACCUM (рис. 13 и 14). Данный вариант предпочтительнее для современных ПЛИС, так как предполагает использование встроенных ЦОС-блоков ПЛИС, позволяя экономить логические ресурсы. Выходной сигнал автомата first необходимо напрямую подключить к входу синхронной загрузки аккумулятора accum_sload.
Пример использования мегафункции ALTMULT_ACCUM для разработки параллельных КИХ-фильтров на четыре отвода можно найти в работе [6]. Входной сигнал и коэффициенты фильтра представлены с 4‑разрядной точностью, а результат фильтрации — с 8‑разрядной. Для разработки подобного фильтра требуется настроить мегафункцию ALTMULT_ACCUM таким образом, чтобы реализовались четыре умножителя, дерево сумматоров, аккумулятор. Линия задержки может быть построена на внутренних регистрах, находящихся на входах умножителей (рис. 15). Для сравнения: рабочая частота такого фильтра в наихудшем случае для ПЛИС серии Stratix III оценивается величиной в 400 МГц. Фильтр имеет латентность четыре такта синхрочастоты, и результат фильтрации обновляется с каждым тактом синхрочастоты (рис. 16). Последовательный КИХ-фильтр на мегафункции ALTMULT_ACCUM имеет латентность пять тактов синхрочастоты сигнала clk, и результат фильтрации обновляется через каждый четвертый такт синхрочастоты (на пятый, рис. 14).
Общее число задействованных ресурсов проектов показано в таблице 1. Для сравнения показаны оценки ресурсов при реализации 1 MAC-фильтра на четыре отвода в виде имитационных моделей с применением методологии объектно-ориентированного проектирования (табл. 2 и 3).
Проект |
Общее число логических элементов (Total logic elements) |
Триггеров логических элементов (Dedicated logic registers) |
Аппаратных умножителей с размерностью операндов 9×9 (Embedded Multiplier 9-bit elements) |
Рабочая частота в наихудшем случае Fmax, МГц |
---|---|---|---|---|
Умножитель на мегафункции LPM_MULT, аккумулятор на мегафункции LPM_ADD_SUB (рис. 1) |
93 |
66 |
1 |
141,84 |
Умножитель на мегафункции LPM_MULT, аккумулятор на мегафункции ALTACCUMULATE (рис. 2) |
112 |
91 |
1 |
179,66 |
Умножитель и аккумулятор на мегафункции ALTMULT_ACCUM (рис. 3) |
89 |
70 |
1 |
128,07 |
Логических элементов (Total logic elements) |
Триггеров логических элементов (Dedicated logic registers) |
Аппаратных умножителей с размерностью операндов 9×9 (Embedded Multiplier 9-bit elements) |
Рабочая частота в наихудшем случае Fmax, МГц |
---|---|---|---|
30 |
29 |
1 |
258 |
Ресурсы ПЛИС |
n-tap MAC FIR filter |
Dual Port Memory MAC FIR Filter |
---|---|---|
Рабочая частота, МГц |
233 |
279 |
Число ЦОС-блоков DSP-48A |
1 |
1 |
Триггеров |
52 |
57 |
Секций с LUT |
39 |
38 |
Выводы
Показаны проекты последовательных КИХ-фильтров на четыре отвода с применением различных инструментов проектирования САПР Quartus II, таких как цифровые автоматы, мегафункции, verilog-коды из описаний мегафункций, символьное и блочное представление функциональных блоков в графическом редакторе.
Рассмотрен проект КИХ-фильтров на умножителе (мегафункция LPM_MULT) и аккумуляторе (накапливающий сумматор на мегафункции LPM_ADD_SUB), работающих в асинхронных режимах, а также два проекта, когда умножитель и аккумулятор работают в синхронных режимах. В первом варианте умножитель и аккумулятор реализованы на мегафункциях LPM_MULT и ALTACCUMULATE. Во втором — умножитель и аккумулятор реализованы на одной мегафункции умножения и накопления ALTMULT_ACCUM. Наиболее экономичным и простым в реализации оказался проект с использованием мегафункции ALTMULT_ACCUM.
Несмотря на более упрощенный вариант структурной схемы реализации проектов, они уступают по частоте аналогичным фильтрам, разработанным по имитационным моделям с использованием пакетов расширения Altera DSP Builder и Xilinx System Generator и блочной памяти ПЛИС.
- AN 307: Altera Design Flow for Xilinx Users. Altera Corporation. November 2009.
- Строгонов А., Цыбин С., Городков П. Разработка КИХ-фильтров в системе Xilinx System Generator САПР ISE Design Suite // Компоненты и технологии. 2015. № 5.
- Строгонов А., Цыбин С., Городков П. Проектирование последовательных КИХ-фильтров в системе Xilinx System Generator с применением библиотеки Reference BlockSet/DSP Suite // Компоненты и технологии. 2015. № 6.
- Строгонов А., Цыбин С., Городков П. Проектирование последовательных КИХ-фильтров в системе визуально-имитационного моделирования Matlab/Simulink с использованием Altera DSP Builder // Компоненты и технологии. 2015. № 11.
- Тарасов И. Проектирование для ПЛИС Xilinx: системные аспекты и уровень регистровых передач // Компоненты и технологии. 2015. № 2.
- Строгонов А., Быстрицкий С. Проектирование параллельных КИХ-фильтров в базисе ПЛИС // Компоненты и технологии. 2013. № 6.