Проектирование последовательных КИХ-фильтров в САПР ПЛИС 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-код управляющего автомата КИХ-фильтра

Рис. 5.
а) Структурная схема управляющего автомата;
б) диаграмма состояний;
в) таблица переходов и таблица кодирований состояний
На рис. 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 и т. д.

Рис. 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 регистра результата.

Рис. 11. Проект последовательного КИХ-фильтра на четыре отвода с использованием аккумулятора на мегафункции ALTACCUMULATE

Рис. 12. Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода в случае использования аккумулятора на мегафункции ALTACCUMULATE
Рассмотрим вариант, когда умножитель и аккумулятор реализованы на мегафункции умножения и накопления ALTMULT_ACCUM (рис. 13 и 14). Данный вариант предпочтительнее для современных ПЛИС, так как предполагает использование встроенных ЦОС-блоков ПЛИС, позволяя экономить логические ресурсы. Выходной сигнал автомата first необходимо напрямую подключить к входу синхронной загрузки аккумулятора accum_sload.

Рис. 13. Проект последовательного КИХ-фильтра на четыре отвода с использованием умножителя и аккумулятора на мегафункции ALTMULT_ACCUM

Рис. 14. Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода в случае использования умножителя и аккумулятора на мегафункции ALTMULT_ACCUM
Пример использования мегафункции ALTMULT_ACCUM для разработки параллельных КИХ-фильтров на четыре отвода можно найти в работе [6]. Входной сигнал и коэффициенты фильтра представлены с 4‑разрядной точностью, а результат фильтрации — с 8‑разрядной. Для разработки подобного фильтра требуется настроить мегафункцию ALTMULT_ACCUM таким образом, чтобы реализовались четыре умножителя, дерево сумматоров, аккумулятор. Линия задержки может быть построена на внутренних регистрах, находящихся на входах умножителей (рис. 15). Для сравнения: рабочая частота такого фильтра в наихудшем случае для ПЛИС серии Stratix III оценивается величиной в 400 МГц. Фильтр имеет латентность четыре такта синхрочастоты, и результат фильтрации обновляется с каждым тактом синхрочастоты (рис. 16). Последовательный КИХ-фильтр на мегафункции ALTMULT_ACCUM имеет латентность пять тактов синхрочастоты сигнала clk, и результат фильтрации обновляется через каждый четвертый такт синхрочастоты (на пятый, рис. 14).

Рис. 15. Параллельная реализация КИХ-фильтра на четыре отвода с использованием мегафункции ALTMULT_ACCUM

Рис. 16. Функциональное моделирование прохождения сигнала по структуре параллельного КИХ-фильтра на четыре отвода в случае использования ALTMULT_ACCUM
Общее число задействованных ресурсов проектов показано в таблице 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.








4 августа, 2020
14 июня, 2020
3 сентября, 2020