Особенности использования двухпортовой памяти при проектировании последовательных КИХ-фильтров в САПР ПЛИС Quartus II

PDF версия
В статье рассмотрены последовательные КИХ-фильтры, использующие в своей основе линии задержки на основе двухпортовой памяти и блоки умножения и накопления.

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

Проанализируем задачу проектирования последовательного КИХ-фильтра на четыре отвода y = C0x0+C1x1+C2x2+C3x3 со следующими коэффициентами C0 = –2, C1 = –1, C2 = 7 и C3 = 6 в базисе ПЛИС Cyclone II EP2C5F256C8.

Рассмотрим проект с использованием мегафункции умножения LPM_MULT и накопления ALTACCUMULATE [1]. Синхросигнал clk используется для тактирования линии задержки, управляющего автомата, умножителя, аккумулятора, вспомогательных триггеров для учета латентности, а clkx2 — для тактирования работы регистра результата. Период синхросигнала clk в два раза больше clkx2.

Входной сигнал и коэффициенты фильтра представим с 8‑разрядной точностью. Линия задержки на регистрах, ПЗУ и управляющий автомат представлены verilog-кодом.

На рис. 1 показан проект последовательного КИХ-фильтра на четыре отвода, а на рис. 2 демонстрируется функциональное моделирование прохождения сигнала по структуре КИХ-фильтра. На вход фильтра поступает сигнал –5, 3, 1, 0, 0 и 0 т. д. Правильные значения на выходе фильтра: 10, –1, –40, –10, 25, 6 и 0 т. д.

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

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

Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода

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

Латентность умножителя и аккумулятора составляет 1 такт синхрочастоты. Для согласования работы управляющего автомата и аккумулятора необходимо сигнал first задержать на один такт синхрочастоты с помощью двухтактного триггера, выход которого следует подключить ко входу сигнала синхронной загрузки аккумулятора sload. Результаты умножения и вычисления суммы произведений представляются с 16‑разрядной точностью. Для получения правильных значений профильтрованного сигнала на выходе yn_out[15..0] необходимо выходной сигнал follow задержать на два такта синхрочастоты и подключить его ко входу разрешения тактирования ena регистра результата.

 

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

Рассмотрим вариант, когда умножитель и аккумулятор реализованы на мегафункции умножения и накопления ALTMULT_ACCUM (рис. 3) [1]. Линия задержки, так же как и у проекта на рис. 1, реализована на регистрах.

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

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

Данный вариант позволяет получить повышенные рабочие частоты проекта. Выходной сигнал автомата first необходимо подключить к входу синхронной загрузки аккумулятора accum_sload напрямую. Для получения правильных значений профильтрованного сигнала на выходе yn_out[15..0] нужно выходной сигнал follow задержать на один такт синхрочастоты.

 

Последовательный КИХ-фильтр на четыре отвода с использованием двухпортовой памяти Simple Dual Port в режиме old memory contents appear

Блоки памяти ПЛИС фирмы Altera для отображения значений на выходной шине q в случае одновременного чтения и записи по одинаковому адресу могут работать в трех режимах: new_data, old_data и don’t_care. При выборе режима old_data на выходной шине q отображаются старые данные, хранящиеся в ОЗУ по конкретному адресу, прежде чем новые данные будут записаны по этому же адресу в память. У блоков памяти Xilinx такой режим известен как read_first.

В режиме don’t_care при одновременном чтении и записи по одинаковому адресу новые данные записываются в память, а на выходной шине q считываемые значения отображаются в виде символа ‘x’ (unknown values). Такой режим для блоков памяти Xilinx не доступен. Режим don’t_care не является критическим для проекта. В режиме new_data новые данные записываются в память и одновременно отображаются на выходе блока памяти. У Xilinx это режим write_first. Выбор режимов new_data, old_data и don’t_care зависит от типа блока памяти TriMatrix. В данном проекте будем использовать блоки памяти типа M4K. Для ПЛИС серий Cyclone II и Stratix II эти блоки функционально эквивалентны.

На рис. 4 представлена имитационная модель последовательного КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС Altera на основе MAC-блока. Более подробно ознакомиться с информационными потоками в структуре КИХ-фильтра можно в работе [2].

Имитационная модель последовательного КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС Altera серии Cyclone II на основе одного MAC-блока

Рис. 4. Имитационная модель последовательного КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС Altera серии Cyclone II на основе одного MAC-блока

Линия задержки на основе двухпортовой памяти и мультиплексора показана на рис. 5. Изменения на шине rd_add(1:0) связаны с чтением содержимого ОЗУ и доступны на выходе, а на шине wr_add(1:0) — с записью информации в ОЗУ. В рассматриваемом примере операции чтения и записи информации в ОЗУ разделены во времени элементом задержки. По умолчанию первоначально память инициализируется вектором [0 0 0 0]. На рис. 6 показаны настройки функционального блока Dual-Port RAM. На основной вкладке упоминается, что включение опции DONT_CARE может дать более высокую частоту проекта fMAX, особенно если память реализована типа MLAB. Когда опция включена, значения на выходной шине q не подвергаются дополнительной регистерной буферизации (и, следовательно, в случае реализации MLAB используется меньше внешних регистров), за счет этого можно получить экономию дополнительного полупериода на выходе. Дополнительно во вкладке Registers and Enables необходимо выходной порт ОЗУ заказать регистерным (Register Output Port). Регистерным должен быть и выходной порт ПЗУ (функциональный блок LUT coefficients, закладка Implementation, опция Register Data).

Линия задержки на основе двухпортовой памяти (функциональный блок Dual-Port RAM) и мультиплексора (функциональный блок Multiplexer)

Рис. 5. Линия задержки на основе двухпортовой памяти (функциональный блок Dual-Port RAM) и мультиплексора (функциональный блок Multiplexer)

Настройки функционального блока Dual-Port RAM

Рис. 6. Настройки функционального блока Dual-Port RAM

В рассматриваемой модели функциональный блок Increment увеличивает свое содержимое в следующем порядке: 0, 1, 2, 3, а функциональный блок Decoder настроен на выделение 1 из этой последовательности, что в дальнейшем обеспечит запись новых данных в ОЗУ линии задержки по адресу 0.

Извлечь код проекта можно с помощью закладки Simple компилятора сигналов (функциональный блок SignalCompiler). В этом случае проект будет состоять из разнородных файлов с расширениями .tdf, .vhd и др. Синтезируемый VHDL-код проекта для реализации в базисе ПЛИС можно получить и с помощью закладки Export (рис. 7). Проект будет состоять из файлов с расширениями .vhd. Анализ VHDL-кода показывает, что и ОЗУ, и ПЗУ реализованы на компоненте altsyncram. Для ПЗУ компонента altsyncram работает в режиме operation_mode => “ROM”, а для ОЗУ в режиме operation_mode => “DUAL_PORT”. В обоих случаях для двухпортовой памяти применяется режим old_data при одновременном чтении и записи по одинаковому адресу (рис. 8).

Извлечение синтезируемого VHDL-кода проекта с помощью закладки Export функционального блока Signal Compiler

Рис. 7. Извлечение синтезируемого VHDL-кода проекта с помощью закладки Export функционального блока Signal Compiler

Фрагмент VHDL-кода двухпортовой памяти, извлеченный из имитационной модели последовательного КИХ-фильтра на четыре отвода в САПР Quartus II

Рис. 8. Фрагмент VHDL-кода двухпортовой памяти, извлеченный из имитационной модели последовательного КИХ-фильтра на четыре отвода в САПР Quartus II

Нашей же целью является разработка функциональной модели КИХ-фильтра по имитационной модели в ручном режиме (рис. 9). В этом случае мы сможем более наглядно разобраться с режимом работы двухпортовой памяти.

Функциональная модель последовательного КИХ-фильтра на четыре отвода с использованием линии задержки на основе двухпортовой памяти

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

Увеличим разрядность шины данных ОЗУ с 4 до 8 бит. В отличие от имитационной модели для формирования логической единицы используем сигнал cout двухразрядного счетчика, пропустив его через два триггера. Он будет сигнализировать о том, что коэффициенты фильтра из ПЗУ (мегафункция ROM: 1 port) считаны (аккумулятор за это время должен вычислить «правильную» сумму произведений) и новые данные могут быть записаны в память. На рис. 10 показано, что мегафункция RAM: 2 port для выходных значений на шине q настроена на режим Old memory contents appear. На рис. 11 представлено функциональное моделирование прохождения сигнала по структуре КИХ-фильтра в режиме Old memory contents appear. Рис. 12 показывает функциональное моделирование прохождения сигнала по структуре КИХ-фильтра для режима I do not care. Сравнивая рис. 11 и рис. 12, видим, что при подаче сигнала –5, 3, 1, 0, 0 и 0 т. д. на вход фильтра, в случае если двухпортовая память работает в режиме I do not care, на выходе формируются не требуемые значения 10, –1, –40, –10, 25, 6 и 0 т. д., а значения –40, –10, 25, 6 и 0 т. д., то есть значения 10, –1 пропущены. Тем не менее фильтр после 980 нс начинает формировать правильные значения. До этого момента времени выход фильтра не определен.

Мегафункция RAM: 2 port. Режим Old memory contents appear для выходной шины q

Рис. 10. Мегафункция RAM: 2 port. Режим Old memory contents appear для выходной шины q

Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода. Режим Old memory contents appear

Рис. 11. Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода. Режим Old memory contents appear

Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода. Режим I do not care

Рис. 12. Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра на четыре отвода. Режим I do not care

Для получения синтезированного нетлиста проекта КИХ-фильтра (список сетевых примитивов ПЛИС, таких как логические ячейки, входы/выходы, блоки памяти, умножители и др.) в формате VQM (Verilog Quartus Mapping) при помощи Quartus II необходимо в консоли выполнить две команды [3]:

quartus_map <your_project> -c <your_toplevel_design_name>
quartus_cdb <your_project> -c <your_toplevel_design_name> --vqm=<your_vqm_file>

Рассмотрим более подробно пример извлечения VQM-файла из проекта.

  1. Установить в САПР Quartus II файл верхнего уровня иерархии проекта с помощью команды Set as Top-Level Entity.
  2. Выбрать семейство ПЛИС. В меню Assignments/Device выбрать Family: Cyclone II, выбрать Target device: EP2C5F256C8. Сохранить проект. Выйти из САПР Quartus II (первые два действия также можно выполнить в консоли).
  3. Выполнить синтез проекта в консоли c помощью команды (для этого предварительно необходимо перейти в каталог, где находится проект):
quartus_map <your_project>.

Например, в командной строке файлового менеджера Total Commander подать команду:

quartus_map fir_mult_accum.qpf,

где fir_mult_accum.qpf — имя проекта.

  1. Извлечь VQM-файл. Для этого в консоли выполнить команду:
quartus_cdb <your_project> --vqm=<your_vqm_file>.

Например, в командной строке Total Commander подать команду:

quartus_cdb fir_mult_accum.qpf --vqm=netlist2.vqm,

где netlist2.vqm — VQM-файл, который хотим извлечь из проекта fir_mult_accum.qpf.

Наиболее важные сетевые примитивы ПЛИС серии Cyclone II, которые встречаются в VQM-файле: cycloneii_lcell_comb — lut в различных режимах; cycloneii_lcell_ff — регистр; cycloneii_io — блоки ввода/вывода; Cyclone II_mac_mult — умножитель; Cyclone II_mac_out — выходной блок умножителя; cycloneii_ram_block — блок памяти. VQM-файл является выходным файлом САПР Quartus II, но может быть использован и как входной файл какого-либо проекта, в этом случае не придется делать последующие размещение, трассировку и временной анализ. VQM-файл является ограниченным подмножеством формата Verilog и представляет собой технологическое мэппирование (отображение) проекта с помощью сетевых примитивов в уникальный базис ПЛИС.

Использование VQM-файлов позволяет подключать как сторонние коммерческие средства синтеза логики, в частности синтезатор Synplicity Synplify, так и академические с открытым программным кодом. VQM-файлы могут быть переконвертированы в blif-формат (Berkeley Logic Interchange Format) для программы логического синтеза ABC и программы проектирования академических ПЛИС VPR.

Пример 1 демонстрирует фрагмент VQM-файла с режимом одновременного чтения и записи по одинаковому адресу в блоках памяти. Красным цветом отмечен режим Old memory contents appear. Блок памяти altsyncram емкостью 32 бит состоит из восьми сетевых примитивов с именами ram_block1a0, ram_block1a1, …, ram_block1a7. Рассматривается более мелкий сетевой примитив ram_block1a0 (рис. 13). Пример 2 показывает фрагмент VQM-файла с режимом I do not care (The outputs will be undefined). Рассматривается более мелкий сетевой примитив ram_block1a1.

RTL-представление примитива с именем ram_block1a0, входящего в состав блока памяти altsyncram: altsyncram_component

Рис. 13. RTL-представление примитива с именем ram_block1a0, входящего в состав блока памяти altsyncram: altsyncram_component

сycloneii_ram_block \ozu:inst1|altsyncram:altsyncram_component|altsyncram_24s1:auto_generated|ram_block1a0 (
  .portawe(vcc),
  .portbrewe(vcc),
  .clk0(\clk~clkctrl ),
  .portadatain({\mux21:inst2|lpm_mux:lpm_mux_component|mux_smc:auto_generated|result_node[0]~7 }),
  .portaaddr({\inst4[1] ,\inst4[0] }),
  .portbaddr({\counter:inst5|lpm_counter:lpm_counter_component|cntr_h3i:auto_generated|safe_q[1] ,\counter:inst5|lpm_counter:lpm_counter_component|cntr_h3i:auto_generated|safe_q[0] }),
  .portbdataout({\ozu:inst1|altsyncram:altsyncram_component|altsyncram_24s1:auto_generated|q_b[0] }));
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_24s1:auto_generated|ram_block1a0 .operation_mode = “dual_port”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_24s1:auto_generated|ram_block1a0 .ram_block_type = “M4K”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_24s1:auto_generated|ram_block1a0 .mixed_port_feed_through_mode = “old”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_24s1:auto_generated|ram_block1a0 .logical_ram_name = “ozu:inst1|altsyncram:altsyncram_component|altsyncram_24s1:auto_generated|ALTSYNCRAM”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_24s1:auto_generated|ram_block1a0 .init_file = “content.mif”;
Пример 1. Фрагмент VQM-файла проекта, в котором описывается двухпортовая память с режимом одновременного чтения и записи по одинаковому адресу в блоках памяти (Old memory contents appear)
cycloneii_ram_block \ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generated|ram_block1a1 (
  .portawe(vcc),
  .portbrewe(vcc),
  .clk0(clk),
  .clk1(clk),
  .portadatain({\mux21:inst2|lpm_mux:lpm_mux_component|mux_smc:auto_generated|result_node[1]~6 }),
  .portaaddr({\inst4[1] ,\inst4[0] }),
  .portbaddr({\counter:inst5|lpm_counter:lpm_counter_component|cntr_h3i:auto_generated|safe_q[1] ,\ counter:inst5|lpm_counter:lpm_counter_component|cntr_h3i:auto_generated|safe_q[0] }),
  .portbdataout({\ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generated|q_b[1] }));
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generated|ram_block1a1 .operation_mode = “dual_port”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generated|ram_block1a1 .ram_block_type = “M4K”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generated|ram_block1a1 .mixed_port_feed_through_mode = “dont_care”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generated|ram_block1a1 .logical_ram_name = “ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generated|ALTSYNCRAM”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generated|ram_block1a1 .init_file = “content.mif”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generated|ram_block1a1 .init_file_layout = “Port_B”;
defparam \ozu:inst1|altsyncram:altsyncram_component|altsyncram_p7s1:auto_generate
Пример 2. Фрагмент VQM-файла проекта, в котором описывается двухпортовая память с режимом I do not care (The outputs will be undefined)

Получить синтезированный нетлист проекта можно на этапе анализа и синтеза (рис. 14) с последующим извлечением VQM-файла c помощью опции Start VQM Writer меню Start (рис. 15). Сформированный VQM-файл можно найти в папке atom_netlist.

Компиляция проекта на этапе анализа и синтеза

Рис. 14. Компиляция проекта на этапе анализа и синтеза

Извлечение VQM-файла c помощью опции Start VQM Writer меню Start

Рис. 15. Извлечение VQM-файла c помощью опции Start VQM Writer меню Start

Линию задержки можно также реализовать на основе двухпортовой памяти с использованием мегафункции altshift_taps (Shift Register (RAM-based)) (рис. 16) со следующими установками: число отводов — 4; дистанция между отводами — 4. Коммутация отводов линии задержки осуществляется с помощью шинного мультиплексора «четыре-в‑один», на адресный вход которого подключается выход счетчика counter. Для согласования работы линии задержки и ПЗУ используемого для хранения коэффициентов фильтра с блоком умножения и накопления на основе мегафункции ALTMULT_ACCUM к выходу ПЗУ требуется дополнительно подключить два 8‑разрядных регистра.

Линия задержки на основе двухпортовой памяти (мегафункция Shift Register (RAM-based))

Рис. 16. Линия задержки на основе двухпортовой памяти (мегафункция Shift Register (RAM-based))

В [4] указано, что для выходного порта q используется только режим Old. В мегафункции altshift_tap не предоставляется изменение режимов работы выходного порта при одновременном чтении и записи по одинаковому адресу, как для мегафункции RAM: 2 port. Результаты функционального моделирования показаны на рис. 17. На рис. 18 изображено RTL-представление линии задержки на основе счетчика и блока памяти. Изучение VQM-файла проекта (пример 3) подтверждает использование данного режима.

Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра (линия задержки на основе мегафункции Shift Register (RAM-based))

Рис. 17. Функциональное моделирование прохождения сигнала по структуре КИХ-фильтра (линия задержки на основе мегафункции Shift Register (RAM-based))

RTL-представление линии задержки на основе мегафункции Shift Register (RAM-based)

Рис. 18. RTL-представление линии задержки на основе мегафункции Shift Register (RAM-based)

cycloneii_ram_block\shift_ram_dp:inst13|altshift_taps:altshift_taps_component|shift_taps_bkr:auto_generated|altsyncram_u7a1:altsyncram2|ram_block3a0 (
.portawe(vcc),
.portbrewe(vcc),
.clk0(clk),
.portadatain({d[0]}),
.portaaddr({\shift_ram_dp:inst13|altshift_taps:altshift_taps_component|shift_taps_bkr:auto_generated|cntr_ikf:cntr1|safe_q[0] }),
.portbaddr({\shift_ram_dp:inst13|altshift_taps:altshift_taps_component|shift_taps_bkr:auto_generated|cntr_ikf:cntr1|safe_q[0] }),
.portbdataout({\shift_ram_dp:inst13|altshift_taps:altshift_taps_component|shift_taps_bkr:auto_generated|altsyncram_u7a1:altsyncram2|q_b[0] }));
defparam\shift_ram_dp:inst13|altshift_taps:altshift_taps_component|shift_taps_bkr:auto_generated|altsyncram_u7a1:altsyncram2|ram_block3a0 .operation_mode = “dual_port”;
defparam\shift_ram_dp:inst13|altshift_taps:altshift_taps_component|shift_taps_bkr:auto_generated|altsyncram_u7a1:altsyncram2|ram_block3a0 .ram_block_type = “M4K”;
defparam\shift_ram_dp:inst13|altshift_taps:altshift_taps_component|shift_taps_bkr:auto_generated|altsyncram_u7a1:altsyncram2|ram_block3a0 .mixed_port_feed_through_mode = “old”;
defparam\shift_ram_dp:inst13|altshift_taps:altshift_taps_component|shift_taps_bkr:auto_generated|altsyncram_u7a1:altsyncram2|ram_block3a0 .logical_ram_name = “shift_ram_dp:inst13|altshift_taps:altshift_taps_component|shift_taps_bkr:auto_generated|altsyncram_u7a1:altsyncram2|ALTSYNCRAM”;
Пример 3. Фрагмент VQM-файла проекта. Линия задержки реализуется на основе двухпортовой памяти в режиме Old (мегафункция Shift Register (RAM-based))

Общее число задействованных ресурсов проектов показано в таблице. Для сравнения даны оценки ресурсов при реализации КИХ-фильтра на четыре отвода по имитационной модели с применением методологии объектно-ориентированного проектирования. Анализ таблицы показывает, что использование двухпортовой памяти в качестве линии задержки позволяет получить наивысшее быстродействие для последовательного КИХ-фильтра.

Таблица. Общие сведения по числу задействованных ресурсов ПЛИС Altera Cyclone II Device EP2C5F256C8, временная модель TimeQuest анализа Slow-model

Проект

Общее число
логических элементов
(Total logic elements)

Число LUT
с 4/3/<=2 входами

Триггеров
логических элементов
(Dedicated logic registers)

Блоков памяти,
M4K, бит

Аппаратных умножителей
с размерностью
 операндов 9×9
(Embedded Multiplier
9-bit elements)

Рабочая частота
в наихудшем случае
Fmax, МГц

Рис. 1

89

37 = 16/18/3

70

1

105,35

Рис. 3

91

37 = 16/18/3

72

1

125,05

Линия задержки на основе двухпортовой памяти (мегафункция RAM:
2 port, режим Simple Dual Port, без инициализации), ПЗУ для хранения коэффициентов (мегафункция ROM: 1 port, с инициализацией), рис. 4

33

16 = 4/8/4

29

ОЗУ: 16
ПЗУ: 16

1

187,93

Линия задержки на основе двухпортовой памяти (мегафункция RAM: 2 port, режим Simple Dual Port, с инициализацией), ПЗУ для хранения коэффициентов (мегафункция ROM: 1 port, с инициализацией), рис. 9

49

27 = 0/23/4

41

ОЗУ: 32 ПЗУ: 32

1

190,62

Линия задержки на основе двухпортовой памяти (Shift Register (RAM-based)), рис. 16

70

36 = 16/15/5

54

ОЗУ: 32 ПЗУ: 64

1

163,03

 

Выводы

Использование двухпортовой памяти в качестве линии задержки, настроенной на режим Old memory contents appear для выходного порта q, позволяет получить наивысшее быстродействие для последовательного КИХ-фильтра. Так, рабочая частота в наихудшем случае (Fmax) для проекта, у которого линия задержки выполнена на основе двухпортовой памяти (рис. 7), возрастает в 1,81 раза по отношению к проекту, у которого линия задержки выполнена на регистрах, а умножитель и аккумулятор на мегафункциях LPM_MULT и ALTACCUMULATE (рис. 1). В режиме I do not care необходимо учитывать правильность формирования профильтрованных значений на выходе КИХ-фильтра. Так, КИХ-фильтр с линией задержки на двухпортовой памяти в режиме I do not care только после 980 нс начинает формировать правильные значения. До этого момента времени выход фильтра не определен. Линия задержки на основе двухпортовой памяти с использованием мегафункции altshift_taps (Shift Register (RAM-based)) работает только в режиме Old.

Литература
  1. Строгонов А., Цыбин С., Городков П. Проектирование последовательных КИХ-фильтров в САПР ПЛИС Quartus II // Компоненты и технологии. 2016. № 1.
  2. Строгонов А., Цыбин С., Городков П. Проектирование последовательных КИХ-фильтров в системе визуально-имитационного моделирования Matlab/Simulink с использованием Altera DSP Builder // Компоненты и технологии. 2015. №11
  3. Quartus II University Interface Program (QUIP). Tutorial. Version 3.1. Altera Corporation. April 6, 2005.
  4. Cyclone II Megafunction Feature Functional Description. Version 1.0. Altera Corporation. May 27, 2005.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *