Проектирование систолических КИХ-фильтров в базисе ПЛИС с помощью системы моделирования ModelSim-Altera
Рассмотрим уравнение КИХ-фильтра (нерекурсивного цифрового фильтра с конечно-импульсной характеристикой), которое представляется как арифметическая сумма произведений:
где y — отклик цепи; xk — k-ая входная переменная; ck — весовой коэффициент k-ой входной переменной, который является постоянным для всех n; K — число отводов фильтра.
Разработаем модель систолического фильтра на четыре отвода y = C0x0+C1x1+C2x2+C3x3 в САПР ПЛИС Quartus II версии 11.1 в базисе ПЛИС серии Cyclone II с однотипными процессорными элементами (рис. 1 и 2).ПЛИС серии Cyclone II выбраны из тех соображений, что в САПР ПЛИС Quartus II Web Edition не поддерживаются ПЛИС серий Cyclone V и Stratix V.
Дадим произвольное имя файлу верхнего уровня проектной иерархии — poly_syst_main.bdf. Коэффициенты фильтра и входные отсчеты возьмем такие же, как в работах [6, 7, 8]. Предположим, что коэффициенты фильтра — целочисленные, со знаком, и они известны: C0 = –2, C1 = –1, C2 = 7 и C3 = 6. На вход КИХ-фильтра поступают входные отсчеты –5, 3, 1 и 0. Правильные значения на выходе фильтра: 10, –1, –40, –10, 26, 6 и т. д., то есть согласно формуле (1). Дополнительную информацию можно получить в работе [8].
На рис. 3 показаны временные диаграммы работы систолического КИХ-фильтра на четыре отвода, реализованного в базисе ПЛИС Stratix III, с однотипными процессорными элементами в САПР ПЛИС Quartus IIверсии 9.1 из работы [8].
Рассмотрим моделирование КИХ-фильтра с использованием симулятора ModelSim-Altera Starter Edition. Предварительно его необходимо подключить — с помощью меню Assigments/settings/EDA Tool settings. В поле Tool name САПР ПЛИС Quartus II версии 11.1 нужно выбрать симулятор ModelSim-Altera, а в поле Format NetlistWriter settings указать выходной формат «нетлиста» — язык VHDL (рис. 4 а и б).
Предварительно следует создать текстовый сценарий функционирования систолического КИХ-фильтра на основе структурного стиля языка VHDL («тестбенч»). В качестве промежуточного шаблона, который нужно отредактировать, можно взять файл poly_syst_main.vht. Для этого необходимо его сформировать: меню Processing/Start/Start Test Bench Template Writer (пример 1).
Отредактируем объект poly_syst_main_vhd_tst, который основан на компоненте poly_syst_main, и сохраним его под именем test_poly_syst_main.vhd (пример 2).
-- Vhdl Test Bench template for design : poly_syst_main -- -- Simulation tool : ModelSim-Altera (VHDL) LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY poly_syst_main_vhd_tst IS END poly_syst_main_vhd_tst; ARCHITECTURE poly_syst_main_arch OF poly_syst_main_vhd_tst IS -- constants -- signals SIGNAL clk : STD_LOGIC; SIGNAL out_filtr : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL out_result_tap1 : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL out_result_tap2 : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL out_result_tap3 : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL res : STD_LOGIC; SIGNAL tap_out : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL X : STD_LOGIC_VECTOR(3 DOWNTO 0); COMPONENT poly_syst_main PORT ( clk : IN STD_LOGIC; out_filtr : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); out_result_tap1 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); out_result_tap2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); out_result_tap3 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); res : IN STD_LOGIC; tap_out : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); X : IN STD_LOGIC_VECTOR(3 DOWNTO 0) ); END COMPONENT; BEGIN i1 : poly_syst_main PORT MAP ( -- list connections between master ports and signals clk => clk, out_filtr => out_filtr, out_result_tap1 => out_result_tap1, out_result_tap2 => out_result_tap2, out_result_tap3 => out_result_tap3, res => res, tap_out => tap_out, X => X ); init : PROCESS -- variable declarations BEGIN -- code that executes only once WAIT; END PROCESS init; always : PROCESS -- optional sensitivity list -- ( ) -- variable declarations BEGIN -- code executes for every event on sensitivity list WAIT; END PROCESS always; END poly_syst_main_arch;
Пример 1. Шаблон теста систолического КИХ-фильтра на языке VHDL (poly_syst_main.vht)
LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY test_poly_syst_main IS END test_poly_syst_main; ARCHITECTURE behavior OF test_poly_syst_main IS COMPONENT poly_syst_main PORT( res : IN STD_LOGIC; clk : IN STD_LOGIC; X : IN STD_LOGIC_VECTOR(3 DOWNTO 0); out_filtr : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); out_result_tap1 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); out_result_tap2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); out_result_tap3 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); tap_out : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT; --Inputs SIGNAL clk : std_logic := '0'; SIGNAL res : std_logic := '1'; SIGNAL X_in: STD_LOGIC_VECTOR(3 DOWNTO 0) := "1011"; --Outputs SIGNAL out_systol_filtr : std_logic_VECTOR(7 DOWNTO 0); SIGNAL out_result_tap1 : std_logic_vector(7 downto 0); SIGNAL out_result_tap2 : std_logic_vector(7 downto 0); SIGNAL out_result_tap3 : std_logic_vector(7 downto 0); SIGNAL tap_out : std_logic_vector(3 downto 0); BEGIN uut: poly_syst_main PORT MAP( clk => clk, res => res, X => X_in, out_filtr => out_systol_filtr, out_result_tap1 => out_result_tap1, out_result_tap2 => out_result_tap2, out_result_tap3 => out_result_tap3, tap_out => tap_out ); process begin clk <= '0'; wait for 50 ns; clk <= '1'; wait for 50 ns; end process; process begin wait for 125 ns; res <= '0'; end process; tb : process begin wait for 100 ns; X_in <= "1011"; wait for 100 ns; X_in <= "0011"; wait for 100 ns; X_in <= "0001"; wait for 100 ns; X_in <= "0000"; wait; END process; END;
Пример 2. Тест систолического КИХ-фильтра на языке VHDL (test_poly_syst_main.vhd)
После компиляции в САПР Quartus II при нажатии кнопки EDA Gate Level Simulation (моделирование на уровне вентилей, временная модель Slow Model) автоматически должен запуститься симулятор ModelSim-Altera(на рис. 1 пиктограмма кнопки отмечена красным кружком).
Возможны два варианта. Рассмотрим первый вариант с созданием «тестбенча». Для этого необходимо откомпилировать файл test_poly_syst_main.vhd с помощью меню Compile симулятора ModelSim. После компиляции в рабочей библиотеке work должны появиться два объекта: poly_syst_main и test_poly_syst_main(рис. 5).
Двойным щелчком мыши по объекту test_poly_syst_main автоматически запускаются различные вспомогательные окна (рис. 6).
Помещаем курсор в окно Objects, нажимаем на правую кнопку мыши меню Add/To Wave/Signals inRegion, и в окне Wave появляется список сигналов проекта. Далее целесообразно настроить окно Wave, в котором отображаются временные диаграммы работы фильтра. Нажимаем Simulate\Runtime Options. В поле Default Radix нажимаем кнопку Decimal, что позволяет перейти от двоичной системы счисления, представленной в «тестбенче», к десятичной со знаком. В поле Default Run задаем шаг моделирования 100 нс. Последовательно нажимая на пиктограмму кнопки Run, получим временные диаграммы работы КИХ-фильтра c шагом 100 нс (рис. 6). Сравниваем полученные результаты с временными диаграммами на рис. 3 и убеждаемся в правильности работы систолического КИХ-фильтра на четыре отвода в базисе ПЛИС Cyclone II.
Рассмотрим второй вариант, без использования «тестбенча». Для этого нам нужен файл poly_syst_main.vhd, а задание на моделирование сформируем непосредственно в векторном редакторе (окно Wave) с помощью специальных инструментов Clock и Force. Двойным щелчком мыши по объекту poly_syst_main автоматически запускаются различные окна. Помещаем курсор в окно Objects, как и в первом варианте, нажимаем на правую кнопку мыши меню Add/To Wave/Selected Signals и выбираем только интересующие нас сигналы.
В окне Wave выбираем синхросигнал clk и нажимаем на правую кнопку мыши, выбираем меню Clock. В окне Define Clock в полях задается период синхросигнала — 100 нс, коэффициент заполнения — 50, уровни «лог. 1» и «лог. 0». Радиокнопкой активизируем передний фронт синхросигнала (рис. 7).
Сигнал асинхронного сброса res (активный — высокий уровень) внутренних регистров процессорных элементов зададим равным нулю с помощью меню Force. Радиокнопкой отмечаем вид действия над сигналом — Freeze («замороженный»), в поле Value зададим «лог. 0», то есть на всем временном промежутке моделирования сигнал сброса res будет неактивным (рис. 8).
Выбираем сигнал X и с помощью меню Force задаем десятичное число –5. Затем нажимаем на пиктограмму кнопки Run для осуществления моделирования с шагом 100 нс. Далее будем изменять только значения, поступающие на вход X (рис. 9), с помощью меню Force и последовательно нажимать на кнопку Runдо получения нужных откликов (пример 3 и рис. 10). Задание для моделирования (пример 3) можно использовать, повторно сохранив его в текстовый файл.
force -freeze sim:/poly_syst_main/res 0 0 force -freeze sim:/poly_syst_main/clk 1 0, 0 {50000 ps} -r {100 ns} force -freeze sim:/poly_syst_main/X -5 0 run force -freeze sim:/poly_syst_main/X 3 0 run force -freeze sim:/poly_syst_main/X 1 0 run force -freeze sim:/poly_syst_main/X 0 0
Пример 3. Задание для моделирования из окна Transcript
В заключение отметим, что в версии 13.0 вновь появился встроенный векторный редактор с собственной системой моделирования [4]. Создать векторный файл можно с помощью меню File/New/Verification/Debugging Files/University Program VWF. Запуск моделирования осуществляется непосредственно из окна SimulationWaveform Editor с помощью меню Simulation/Run Functional Simulation.
На рис. 11 показаны временные диаграммы работы систолического КИХ-фильтра на четыре отвода в САПР ПЛИС Quartus II версии 13.0. Проект размещен в ПЛИС серии MAX II.
Выводы
Использование текстового сценария на языке VHDL совместно с симулятором ModelSim-Altera Freeпозволяет отлаживать сложные проекты в кратчайшие сроки.
- Зотов В. ModelSim— система HDL-моделирования цифровых устройств // Компоненты и технологии. 2002. № 6.
- Каршенбойм И. Краткий курс HDL. Ч. 8. Моделирование в ModelSim SE // Компоненты и технологии. 2008. № 11.
- Сообщество easyelectronics.ru. Quartus + ModelSim. Интеграция в картинках и создание TestBench — http://we.easyelectronics.ru/plis/quartus-modelsim-integraciya-v-kartinkah-i-sozdanie-testbench.html
- Блог о плате-конструкторе «Марсоход», САПР Altera Quartus II, Verilog— http://www.marsohod.org/index.php/projects/plata1
- Библиотека Антона Егорова. Quartus II по-русски — http://naliwator.narod.ru/links.html
- Строгонов А., Быстрицкий А. КИХ-фильтр на распределенной арифметике: проектируем сами // Компоненты и технологии. 2013. № 3.
- Строгонов А., Быстрицкий А. Проектирование параллельных КИХ-фильтров в базисе ПЛИС // Компоненты и технологии. 2013. № 6.
- Строгонов А., Быстрицкий А. Систолические КИХ-фильтры в базисе ПЛИС // Компоненты и технологии. 2013. № 8.