Проектирование КИХ-фильтров в системе Xilinx System Generator с применением методологии Black Boxes

PDF версия
Использование методологии Black Boxes Xilinx System Generator при разработке имитационных моделей цифровых устройств позволяет импортировать VHDL-, Verilog-, EDIF-коды, разработанные, например, в САПР ПЛИС Xilinx ISE Design Suite в систему Matlab/Simulink, что значительно повышает возможности объектно-ориентированного проектирования.

Импорт проектов, созданных в САПР ПЛИС Xilinx ISE Design Suite с использованием единственных VHDL-файлов

В Xilinx System Generator проанализируем проектирование КИХ-фильтра на четыре отвода у = С0x0+C1x1+C2x2+C3x3 с заданными коэффициентами С0 = –2, C1 = –1, C2 = 7 и C3 = 6 [1, 2, 3, 4] с применением методологии Black Boxes. Рассмотрим случай, когда на вход фильтра поступает сигнал –5, 3, 1, 0, 0 и 0 т. д. Правильные значения на выходе фильтра: 10, –1, –40, –10, 25, 6 и 0 т. д.

Пример 1 демонстрирует нижний уровень иерархии проекта КИХ-фильтра на четыре отвода, созданного с использованием единственного VHDL-файла. Верхним уровнем иерархии является схемный файл fir.sch, состоящий из символа с именем fir4 и портов (не показан). Испытательный стенд сформируем в ручном режиме.

Согласно рекомендациям Xilinx для эффективного использования DSP-блоков ПЛИС необходим сигнал синхронного сброса (активным является сигнал низкого уровня). Выражение для выходного сигнала фильтра также должно использовать тактовый сигнал.

В данном примере для преобразования типов применен пакет std_logic_arith библиотеки IEEE (также возможно использование пакета numeric_std). Переменные pro и acc представлены в 8‑ и 10‑разрядном дополнительном двоичном коде (знаковый тип signed). Поскольку порты date и q_reg относятся к типу std_logic_vector, то необходимо осуществить преобразование типов с помощью следующих функций: conv_signed(conv_integer(date),4) для сигнала date и std_logic_vector(acc) для сигнала q_reg. Функция conv_integer(date) преобразует сигнал date в целое десятичное число с учетом знака, а функция conv_signed преобразует в 4‑разрядный дополнительный двоичный код. Для линии задержки, организованной на переменной shift, формируется тип shift_arr (массив из четырех 4‑разрядных двоичных слов), заданный пользователем.

library ieee;
use ieee.std_ogic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
package coeffs is
type coef_arr is array (0 to 3) of signed(3 downto 0);
constant coefs: coef_arr:= coef_arr'("1110", "1111", "0111", "0110");
end coeffs;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
use work.coeffs.all;
entity fir4 is
port (clk, reset, ce: in std_logic;
date: in std_logic_vector(3 downto 0);
q_reg: out std_logic_vector (9 downto 0));
end fir4;
architecture beh of fir4 is
begin
process(clk,reset,ce,date)
type shift_arr is array (3 downto 0) of signed (3 downto 0);
variable shift: shift_arr;
variable pro: signed(7 downto 0);
variable acc: signed (9 downto 0);
begin
q_reg<= (others => '0');
if(clk'event and clk = '1') then
if reset='0' then
for i in 0 to 3 loop
shift(i):= (others => '0');
end loop;
elsif ce='1' then
shift(0):=conv_signed(conv_integer(date),4);
pro := shift(0) * coefs(0);
acc := conv_signed(pro, 10);
for i in 2 downto 0 loop
pro := shift(i+1) * coefs(i+1);
acc := acc + conv_signed(pro, 10);
shift(i+1):= shift(i);
end loop;
end if;
end if;
q_reg<=std_logic_vector(acc);
end process;
end beh;
Пример 1. Код языка VHDL КИХ-фильтра на четыре отвода

Убедившись с помощью испытательного стенда в том, что код языка VHDL КИХ-фильтра на четыре отвода работает корректно, перейдем к разработке имитационной модели. На рис. 1 показана имитационная модель КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС серии Spartan‑6 xa6slx4-3tqg144 на основе функционального блока Black Box. Настройки маркера System Generator следующие: период синхросигнала 100 нс, период симуляции в Simulink 1 с.

Имитационная модель КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС серии Spartan 6 xa6slx4-3tqg144 на основе функционального блока Black Box

Рис. 1. Имитационная модель КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС серии Spartan 6 xa6slx4-3tqg144 на основе функционального блока Black Box

Для того чтобы воспользоваться данной методологией, необходимо из библиотеки Xilinx System Generator добавить в разрабатываемую модель фильтра функциональный блок Black Box и указать на VHDL-файл с именем fir4 (пример 1), а также подключить симулятор ISE (рис. 2). В автоматическом режиме будет создан m‑файл (m‑функция КИХ-фильтра) системы Matlab с именем fir4_config. Более подробную информацию о структуре m‑файлов, генерируемых Xilinx System Generator, можно посмотреть в работе [5].

Настройки функционального блока Black Box. Будет сформирован m файл с именем fir4_config, задано функциональное моделирование в ISE

Рис. 2. Настройки функционального блока Black Box. Будет сформирован m файл с именем fir4_config, задано функциональное моделирование в ISE

С учетом того что современные ПЛИС построены на основе методологии синхронного проектирования, необходимо с помощью следующей конструкции в коде языка VHDL для последовательностных устройств обеспечить связку синхросигнала clk и сигнала разрешения его подачи ce [6]:

elsif (clk'event and clk='1') then
if (ce = '1') then
….

При этом на функциональном блоке Black Boxes сигналы clk и ce не отображаются. m‑файл fir4_config системы Matlab является редактируемым. Например, по умолчанию результат фильтрации на шине q_reg представляется в формате с фиксированной запятой для беззнаковых чисел как ‘UFix_10_0’. Поскольку коэффициенты фильтра и входные отсчеты могут быть как со знаком, так и без, необходимо отредактировать формат представления профильтрованного сигнала Sout с ‘UFix_10_0’ на ‘Fix_10_0’. В дальнейшем это придется делать для всех рассматриваемых примеров.

Анализируя m‑файл, видим, что сформировался фильтр типа Single-Rate FIR (входная частота дискретизации fclk равна выходной частоте дискретизации, то есть изменение частоты дискретизации не происходит; такие фильтры получили название «односкоростные фильтры»), функция setup_as_single_rate(block, clkname, cename). Частота дискретизации определяется как fclk/N для несимметричного и как fclk/N+1 для симметричного фильтра, где fclk — частота тактирования ядра фильтра; N‑разрядность входной шины данных (точность представления входных значений, подлежащих фильтрации).

function fir4_config(this_block)
 this_block.setTopLevelLanguage('VHDL');
 this_block.setEntityName('fir4');
 % System Generator has to assume that your entity has a combinational feed through; 
 % if it doesn't, then comment out the following line:
 this_block.tagAsCombinational;
 this_block.addSimulinkInport('reset');
 this_block.addSimulinkInport('date');
 this_block.addSimulinkOutport('q_reg');
 q_reg_port = this_block.port('q_reg');
 q_reg_port.setType('Fix_10_0');
 % -----------------------------
 if (this_block.inputTypesKnown)
 % do input type checking, dynamic output type and generic setup in this code block.
 if (this_block.port('reset').width ~= 1);
 this_block.setError('Input data type for port "reset" must have width=1.');
 end
 this_block.port('reset').useHDLVector(false);
 if (this_block.port('date').width ~= 4);
 this_block.setError('Input data type for port "date" must have width=4.');
 end
 end % if(inputTypesKnown)
 % -----------------------------
 % -----------------------------
 if (this_block.inputRatesKnown)
 setup_as_single_rate(this_block,'clk','ce')
 end % if(inputRatesKnown)
 % -----------------------------
 % (!) Set the inout port rate to be the same as the first input 
 % rate. Change the following code if this is untrue.
 uniqueInputRates = unique(this_block.getInputRates);
 % Add addtional source files as needed.
 % |-------------
 % | Add files in the order in which they should be compiled.
 % | If two files "a.vhd" and "b.vhd" contain the entities
 % | entity_a and entity_b, and entity_a contains a
 % | component of type entity_b, the correct sequence of
 % | addFile() calls would be:
 % | this_block.addFile('b.vhd');
 % | this_block.addFile('a.vhd');
 % |-------------
 % this_block.addFile('');
 % this_block.addFile('');
 this_block.addFile('fir4.vhd');
return;
% ------------------------------------------------------------
function setup_as_single_rate(block,clkname,cename) 
 inputRates = block.inputRates; 
 uniqueInputRates = unique(inputRates); 
 if (length(uniqueInputRates)==1 & uniqueInputRates(1)==Inf) 
 block.addError('The inputs to this block cannot all be constant.'); 
 return; 
 end 
 if (uniqueInputRates(end) == Inf) 
 hasConstantInput = true; 
 uniqueInputRates = uniqueInputRates(1:end-1); 
 end 
 if (length(uniqueInputRates) ~= 1) 
 block.addError('The inputs to this block must run at a single rate.'); 
 return; 
 end 
 theInputRate = uniqueInputRates(1); 
 for i = 1:block.numSimulinkOutports 
 block.outport(i).setRate(theInputRate); 
 end 
 block.addClkCEPair(clkname,cename,theInputRate); 
 return; 
% ---------------------------------------------------------

Пример 2. m-файл, генерируемый Xilinx System Generator (с комментариями)

На рис. 3 показаны результаты имитационного моделирования в системе Matlab/Simulink КИХ-фильтра на четыре отвода, а на рис. 4 — функциональное моделирование в САПР ПЛИС Xilinx ISE Design Suite v.14.4 для двух случаев. В первом случае (рис. 4а) проект создан на основе единственного VHDL-файла (пример 1) с ручным формированием испытательного стенда, а во втором (рис. 4б) — оптимизированный VHDL-код с автоматическим формированием испытательного стенда, созданный с помощью маркера Xilinx System Generator. Сравнивая результаты имитационного и функционального (рис. 3, 4) моделирования, видим, что КИХ-фильтр работает корректно. Анализ (рис. 4) показывает, что по коду языка VHDL, приведенному в примере 1, сформировался параллельный КИХ-фильтр. После задержки в четыре такта синхроимпульса результат вычисления уже доступен с приходом нового такта синхроимпульса.

Имитационное моделирование в системе Matlab/Simulink КИХ-фильтра на четыре отвода, созданного с использованием единственного VHDL-файла

Рис. 3. Имитационное моделирование в системе Matlab/Simulink КИХ-фильтра на четыре отвода, созданного с использованием единственного VHDL-файла

Функциональное моделирование КИХ-фильтра на четыре отвода в САПР ПЛИС Xilinx ISE Design Suite, созданного

Рис. 4. Функциональное моделирование КИХ-фильтра на четыре отвода в САПР ПЛИС Xilinx ISE Design Suite, созданного:
а) на основе проекта, состоящего из единственного VHDL-файла (пример 1);
б) на основе функционального блока Black Box

На рис. 5 показана верификация двух моделей КИХ-фильтров, разработанных с использованием функционального блока FIR Compiler 6.3 Xilinx System Generator, являющегося аналогом функции FIR Compiler v6.3 САПР Xilinx ISE, получаемой с помощью генератора параметризированных ядер XLogiCORE IP и с применением кода языка VHDL (функциональный блок Black Box).

Верификация двух имитационных моделей КИХ-фильтров, разработанных с использованием функционального блока FIR Compiler 6.3 и с применением кода языка VHDL (функциональный блок Black Box)

Рис. 5. Верификация двух имитационных моделей КИХ-фильтров, разработанных с использованием функционального блока FIR Compiler 6.3 и с применением кода языка VHDL (функциональный блок Black Box)

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

На рис. 6 представлены результаты имитационного и функционального моделирования двух моделей КИХ-фильтров, разработанных с использованием функционального блока FIR Compiler 6.3 Xilinx System Generator и с применением кода языка VHDL. Для обеих моделей КИХ-фильтров испытательные стенды формируются в автоматическом режиме.

Имитационное моделирование

Рис. 6.
а) Имитационное моделирование;
б) функциональное моделирование двух моделей КИХ-фильтров, разработанных с использованием функционального блока FIR Compiler 6.3 Xilinx System Generator и с применением кода языка VHDL (функциональный блок Black Box)

Анализ рис. 6 показывает, что КИХ-фильтр на основе систолической структуры характеризуется значительно большей латентностью появления профильтрованного сигнала (start-up latency) на выходе [2]. Во втором случае при синтезе кода по единственному VHDL-файлу формируется фильтр с наименьшей латентностью (рис. 6). Временные диаграммы работы характерны для параллельных структур КИХ-фильтров.

Оценка ресурсов ПЛИС серии Spartan‑6 xa6slx4-3tqg144 при реализации КИХ-фильтров на четыре отвода различными способами представлена в таблице. Из таблицы видно, что наибольшим быстродействием обладают проекты, созданные с использованием либо генератора параметризированных ядер XLogiCORE IP, либо функциональных блоков Xilinx System Generator. Имитационная модель, созданная в Simulink с применением Xilinx System Generator и функционального блока Black Boxes, основанная на импорте VHDL-файла, показывает наихудшее быстродействие, но обеспечивает сбалансированное использование логических ресурсов (в сторону уменьшения) и ЦОС-блоков ПЛИС.

Таблица. Оценка ресурсов ПЛИС серии Spartan‑6 xa6slx4-3tqg144 при реализации КИХ-фильтров на четыре отвода различными способами

Ресурсы ПЛИС

Параллельные структуры фильтров

Последовательная структура фильтра

Имитационная модель в Simulink, Xilinx System Generator с применением Black Boxes (пример 1)

Проект в САПР ПЛИС Xilinx ISE Design Suite с применением функции FIR Compiler v6.3 и генератора XLogiCORE IP (рис. 1) [2]

Имитационная модель в Simulink, Xilinx System Generator с применением функционального блока FIR Compiler 6.3 (рис. 4) [3]

Имитационная модель в Simulink, Xilinx System Generator, Dual Port Memory MAC FIR Filter, 1 МАСблок [4]

Максимальная частота, МГц (на этапе Post-Map)

114

334

305

279

Число ЦОС-блоков DSP-48A

3

1

4

1

Триггеров

8

48

91

57

Секций с LUT

6

33

56

38

Точность представления входного и профильтрованного сигнала, бит

FIX_4_0 и FIX_10_0

4 и 8

FIX_8_0 и FIX_20_8

FIX_4_0 и FIX_10_0

Примечание. Коэффициенты фильтра представлены с 4‑битной точностью.

 

Импорт проектов, созданных в САПР ПЛИС Xilinx ISE Design Suite с использованием структурного стиля языка VHDL

Проект будет состоять из двух VHDL-фай-лов — низкого (файл fir4) и верхнего уровней иерархии (fir). Файл верхнего уровня иерархии fir получим путем пересохранения файла fir.vhf, который извлекается из проекта (пример 1) в автоматическом режиме (HDL Functional Model) в файл fir.vhd (пример 3).

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;
entity fir is
 port ( ce : in std_logic; 
 clk : in std_logic; 
 date : in std_logic_vector (3 downto 0); 
 reset : in std_logic; 
 filtered : out std_logic_vector (9 downto 0));
end fir;
architecture BEHAVIORAL of fir is
 component fir4
 port ( clk : in std_logic; 
 reset : in std_logic; 
 ce : in std_logic; 
 date : in std_logic_vector (3 downto 0); 
 q_reg : out std_logic_vector (9 downto 0));
 end component;
begin
 XLXI_1 : fir4
 port map (ce=>ce,
 clk=>clk,
 date(3 downto 0)=>date(3 downto 0),
 reset=>reset,
 q_reg(9 downto 0)=>filtered(9 downto 0));
end BEHAVIORAL;

Пример 3. Структурное описание КИХ-фильтра на четыре отвода (файл верхнего уровня иерархии)

C помощью функционального блока Black Box создадим m‑файл с именем fir_config (пример 4), указав на файл верхнего уровня иерархии fir.vhd (рис. 7). Рис. 1 и рис. 7 внешне схожи, за исключением имен портов, которые на рис. 7 соответствуют именам портов объекта fir (пример 3).

Имитационная модель КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС серии Spartan 6 xa6slx4-3tqg144 на основе функционального блока Black Box c использованием структурного стиля языка VHDL. m файл с именем fir_config будет создан на основе файла верхнего уровня иерархии fir.vhd

Рис. 7. Имитационная модель КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС серии Spartan 6 xa6slx4-3tqg144 на основе функционального блока Black Box c использованием структурного стиля языка VHDL. m файл с именем fir_config будет создан на основе файла верхнего уровня иерархии fir.vhd

function fir_config(this_block)
 this_block.setTopLevelLanguage('VHDL');
 this_block.setEntityName('fir'); 
 this_block.tagAsCombinational;
 this_block.addSimulinkInport('date');
 this_block.addSimulinkInport('reset');
 this_block.addSimulinkOutport('filtered'); 
 filtered_port = this_block.port('filtered');
 filtered_port.setType('Fix_10_0');
 …..
 this_block.addFile('fir4.vhd');
 this_block.addFile('fir.vhd');
return;

Пример 4. Фрагмент m-файла, генерируемого Xilinx System Generator, с учетом использования структурного стиля языка VHDL

Пример 4 показывает, что необходимо отредактировать формат представления профильтрованного сигнала filtered с ‘UFix_10_0’ на ‘Fix_10_0’ и указать путь на файл низкого уровня иерархии fir4.vhd.

 

Импорт проектов, созданных в САПР ПЛИС Xilinx ISE Design Suite с использованием библиотечных элементов языка VHDL

В этом разделе также применен структурный стиль языка VHDL. Рассмотрим вариант разработки имитационной модели КИХ-фильтра с помощью библиотечных элементов (пример 5). На рис. 8а показана иерархия проекта, состоящая из файла верхнего уровня иерархии fir.vhd и файла низкого уровня fir4.vhd, а на рис. 8б показано, что файл fir4.vhd размещен в дополнительно созданную библиотеку fir_lib, файлы fir.vhd и test.vhd (пример 6) размещаются в библиотеку work. Пример 7 демонстрирует фрагмент изменений, которые необходимо внести в m‑файл fir_config, генерируемый Xilinx System Generator.

Иерархия проекта КИХ-фильтра, состоящая из файла верхнего уровня иерархии fir.vhd и файла низкого уровня fir4.vhd

Рис. 8.
а) Иерархия проекта КИХ-фильтра, состоящая из файла верхнего уровня иерархии fir.vhd и файла низкого уровня fir4.vhd;
б) файл fir4.vhd размещен в библиотеку fir_lib, а файлы fir4.vhd и test.vhd размещаются в библиотеку work

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
library fir_lib;
use fir_lib.all;
ENTITY fir IS PORT (
  date : IN std_logic_vector(3 DOWNTO 0);
  reset : IN std_logic;
  clk : IN std_logic;
  ce : IN std_logic;
 filtered : OUT std_logic_vector(9 DOWNTO 0)
); 
END fir;
ARCHITECTURE STRUCTURE OF fir IS
COMPONENT fir4
  port ( clk : in std_logic; 
 reset : in std_logic; 
 ce : in std_logic; 
 date : in std_logic_vector (3 downto 0); 
 q_reg : out std_logic_vector (9 downto 0)); 
END COMPONENT;
BEGIN
metka_fir:	entity fir_lib.fir4 
    port map (ce=>ce,
 	clk=>clk,
 	date(3 downto 0)=>date(3 downto 0),
 	reset=>reset,
 	q_reg(9 downto 0)=>filtered(9 downto 0));
END STRUCTURE;

Пример 5. Верхний уровень иерархии проекта с использованием библиотеки fir_lib
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY test IS
END test;
ARCHITECTURE behavior OF test IS 
 COMPONENT fir
 PORT(
 date : IN std_logic_vector(3 downto 0);
 reset : IN std_logic;
 clk : IN std_logic;
 ce : IN std_logic;
 filtered : OUT std_logic_vector(9 downto 0)
 );
 END COMPONENT;
 --Inputs
 signal date : std_logic_vector(3 downto 0) := (others => '0');
 signal reset : std_logic := '0';
 signal clk : std_logic := '0';
 signal ce : std_logic := '1';
 	--Outputs
 signal filtered : std_logic_vector(9 downto 0);
 -- Clock period definitions
 constant clk_period : time := 100 ns;
BEGIN
  -- Instantiate the Unit Under Test (UUT)
 uut: fir PORT MAP (
 date => date,
 reset => reset,
 clk => clk,
 ce => ce,
 filtered => filtered
 );
 -- Clock process definitions
 clk_process :process
 begin
    clk <= '0';
    wait for clk_period/2;
    clk <= '1';
    wait for clk_period/2;
 end process;
 -- Stimulus process
stim_proc: process
begin		
-- hold reset state for 100 ns.
wait for 100 ns;	
    reset <= '1';
 end process;		
 tb : process
    begin 
      wait for 100 ns;
      date <= "1011";
      wait for 100 ns;
      date <= "0011";
      wait for 100 ns;
      date <= "0001";
      wait for 100 ns;
      date <= "0000";
 	wait; 	
 end process;
END;
Пример 6. Испытательный стенд на языке VHDL для моделирования прохождения сигнала –5, 3, 1, 0 по структуре КИХ-фильтра 
this_block.addFile('fir.vhd');
 this_block.addFileToLibrary('fir4.vhd','fir_lib');

Пример 7. Фрагмент изменений, которые необходимо внести в m-файл fir_config, генерируемый Xilinx System Generator

 

Импорт проектов, созданных в САПР ПЛИС Xilinx ISE Design Suite с использованием генератора параметризированных ядер XLogiCORE IP и функции FIR Compiler v6.3

На рис. 9а показан проект КИХ-фильтра на четыре отвода в САПР ПЛИС Xilinx ISE 14.4 с использованием генератора параметризированных ядер XLogiCORE IP FIR Compiler v6.3, а на рис. 9б представлены настройки функции FIR Compiler (закладка пять, поле «сигналы управления»). Красным овалом на рис. 9 выделена пара внешних портов — clk и clken, и пара портов — aclk и aclken, принадлежащих символу fircore. Выбирается одноканальный, односкоростной (Single-Rate) систолический КИХ-фильтр прямой формы. Частота тактирования ядра фильтра установлена 250 МГц, а частота дискретизации — 50 МГц.

Проект КИХ-фильтра на четыре отвода в САПР ПЛИС Xilinx ISE 14.4 с использованием генератора параметризированных ядер XLogiCORE IP FIR Compiler v6.3

Рис. 9.
а) Проект КИХ-фильтра на четыре отвода в САПР ПЛИС Xilinx ISE 14.4 с использованием генератора параметризированных ядер XLogiCORE IP FIR Compiler v6.3;
б) настройки функции FIR Compiler, опционально подключается сигнал разрешения подачи синхросигнала aclken

Далее разработаем испытательный стенд (пример 8). Характерной особенностью такого КИХ-фильтра на четыре отвода является латентность в 11 тактов синхрочастоты (рис. 10).

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

Рис. 10. Временные диаграммы работы КИХ-фильтра на четыре отвода, созданного с использованием генератора параметризированных ядер XLogiCORE IP и функции FIR Compiler v6.3. На вход КИХ-фильтра поступают входные отсчеты –5, 3, 1 и 0. Правильные значения на выходе фильтра: 10, –1, –40, –10, 25, 6

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
LIBRARY UNISIM;
USE UNISIM.Vcomponents.ALL;
ENTITY fir4_sch_fir4_sch_sch_tb IS
END fir4_sch_fir4_sch_sch_tb;
ARCHITECTURE behavioral OF fir4_sch_fir4_sch_sch_tb IS 
 COMPONENT fir4_sch
 PORT( s_tvalid	:	IN	STD_LOGIC; 
 s_tready	:	OUT	STD_LOGIC; 
 Data	:	IN	STD_LOGIC_VECTOR (7 DOWNTO 0); 
 clk	:	IN	STD_LOGIC; 
 clken	:	IN	STD_LOGIC; 
 m_tvalid	:	OUT	STD_LOGIC; 
 filtered	:	OUT	STD_LOGIC_VECTOR (7 DOWNTO 0));
 END COMPONENT;
 SIGNAL s_tvalid	:		STD_LOGIC:= '1';
 SIGNAL s_tready	:		STD_LOGIC;
 SIGNAL Data	:		STD_LOGIC_VECTOR (7 DOWNTO 0):= (others => '0');
 SIGNAL clk	:		STD_LOGIC;
 SIGNAL clken	:		STD_LOGIC:= '1';
 SIGNAL m_tvalid	:		STD_LOGIC;
 SIGNAL filtered	:		STD_LOGIC_VECTOR (7 DOWNTO 0);

BEGIN
 UUT: fir4_sch PORT MAP(
    s_tvalid => s_tvalid, 
    s_tready => s_tready, 
    Data => Data, 
    clk => clk, 
    clken => clken, 
    m_tvalid => m_tvalid, 
    filtered => filtered
 );
clk_process :process
        begin
          clk <= '0';
          wait for 10 ns;
          clk <= '1';
          wait for 10 ns;
 end process;
  tb : process
    begin 
      wait for 20 ns;
      Data <= "11111011";
      wait for 20 ns;
      Data <= "00000011";
      wait for 20 ns;
      Data <= "00000001";
      wait for 20 ns;
      Data <= "00000000";
 	wait; 	
  END process;
END;

Пример 8. Испытательный стенд на языке VHDL для моделирования прохождения сигнала –5, 3, 1, 0 по структуре КИХ-фильтра, созданного с использованием генератора параметризированных ядер XLogiCORE IP и функции FIR Compiler v6.3

Убедившись в том, что КИХ-фильтр работает корректно, пересохраним файл fir4_sch.vhf в файл fir4_sch.vhd (пример 9) и отредактируем его так, чтобы в нем использовалась пара сигналов с именами clk и ce (пример 10). Проанализируем полученный файл. Файл fir4_sch.vhd создан на основе компоненты fir4core, которая разработана с применением генератора параметризированных ядер XLogiCORE IP и функции FIR Compiler v6.3, а также является разновидностью структурного стиля языка VHDL. Генератор параметризированных ядер в процессе своей работы создает следующие файлы: fir4core.ngc (синтезируемая модель КИХ-фильтра, представленная списком связей на низком логическом уровне в двоичном формате, создается с помощью специального приложения Xilinx Synthesis Technology (XST), входящего в состав ISE), fir4core.mif (коэффициенты фильтра в HEX-формате) и fir4core.vhd (спецификация фильтра).

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;
entity fir4_sch is
 port ( clk : in std_logic; 
 clken : in std_logic; 
 Data : in std_logic_vector (7 downto 0); 
 s_tvalid : in std_logic; 
 filtered : out std_logic_vector (7 downto 0); 
 m_tvalid : out std_logic; 
 s_tready : out std_logic);
end fir4_sch;
architecture BEHAVIORAL of fir4_sch is
 component fir4core
 port ( s_axis_data_tvalid : in std_logic; 
 s_axis_data_tready : out std_logic; 
 s_axis_data_tdata : in std_logic_vector (7 downto 0); 
 aclk : in std_logic; 
 aclken : in std_logic; 
 m_axis_data_tvalid : out std_logic; 
 m_axis_data_tdata : out std_logic_vector (7 downto 0));
 end component;
begin
 XLXI_1 : fir4core
 port map (aclk=>clk,
 aclken=>clken,
 s_axis_data_tdata(7 downto 0)=>Data(7 downto 0),
 s_axis_data_tvalid=>s_tvalid,
 m_axis_data_tdata(7 downto 0)=>filtered(7 downto 0),
 m_axis_data_tvalid=>m_tvalid,
 s_axis_data_tready=>s_tready);
end BEHAVIORAL;

Пример 9. Файл fir4_sch.vhd, пересохраненный из файла fir4_sch.vhf (HDL Functional Model)
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;

entity fir4_sch is
 port ( clk : in std_logic; 
 ce : in std_logic; 
 Data : in std_logic_vector (7 downto 0); 
 s_tvalid : in std_logic; 
 filtered : out std_logic_vector (7 downto 0); 
 m_tvalid : out std_logic; 
 s_tready : out std_logic);
end fir4_sch;

architecture BEHAVIORAL of fir4_sch is
 component fir4core
 port ( s_axis_data_tvalid : in std_logic; 
 s_axis_data_tready : out std_logic; 
 s_axis_data_tdata : in std_logic_vector (7 downto 0); 
 aclk : in std_logic; 
 aclken : in std_logic; 
 m_axis_data_tvalid : out std_logic; 
 m_axis_data_tdata : out std_logic_vector (7 downto 0));
 end component;
 
begin
 XLXI_1 : fir4core
 port map (aclk=>clk,
 aclken=>ce,
 s_axis_data_tdata(7 downto 0)=>Data(7 downto 0),
 s_axis_data_tvalid=>s_tvalid,
 m_axis_data_tdata(7 downto 0)=>filtered(7 downto 0),
 m_axis_data_tvalid=>m_tvalid,
 s_axis_data_tready=>s_tready);
end BEHAVIORAL;

Пример 10. Отредактированный файл fir4_sch.vhd, в котором используется пара сигналов с именами clk и ce

Далее разработаем имитационную модель на основе функционального блока Black Box c использованием файла fir4_sch.vhd (рис. 11, 12). На рис. 11 показано, что профильтрованный сигнал подвергается децимации. Блок децимации выполняет роль компрессора. В выходном сигнале сохраняются отсчеты с номерами, кратными четырем. Такой прием позволяет сэкономить вычислительные ресурсы ПЛИС. Функциональный блок Black Box сгенерирует m‑файл с именем fir4_sch_config (пример 11), который должен быть отредактирован. Помимо ссылок на файл fir4_sch.vhd, в него должны быть добавлены ссылки на файлы fir4core.ngc, fir4core.mif и fir4core.vhd.

Имитационная модель КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС серии Spartan 6 xa6slx4-3tqg144 на основе функционального блока Black Box c использованием файла fir4_sch.vhd, созданного на основе компоненты fir4core

Рис. 11. Имитационная модель КИХ-фильтра на четыре отвода для реализации в базисе ПЛИС серии Spartan 6 xa6slx4-3tqg144 на основе функционального блока Black Box c использованием файла fir4_sch.vhd, созданного на основе компоненты fir4core

Имитационное моделирование в системе Matlab/Simulink КИХ-фильтра на четыре отвода на основе функционального блока Black Box c использованием файла fir4_sch.vhd, созданного на основе компоненты fir4core

Рис. 12. Имитационное моделирование в системе Matlab/Simulink КИХ-фильтра на четыре отвода на основе функционального блока Black Box c использованием файла fir4_sch.vhd, созданного на основе компоненты fir4core

function fir4_sch_config(this_block)
 this_block.setTopLevelLanguage('VHDL');
 this_block.setEntityName('fir4_sch');
 this_block.tagAsCombinational;
 this_block.addSimulinkInport('Data');
 this_block.addSimulinkInport('s_tvalid');
 this_block.addSimulinkOutport('filtered');
 this_block.addSimulinkOutport('m_tvalid');
 this_block.addSimulinkOutport('s_tready');
 filtered_port = this_block.port('filtered');
 filtered_port.setType('Fix_8_0');
 m_tvalid_port = this_block.port('m_tvalid');
 m_tvalid_port.setType('UFix_1_0');
 m_tvalid_port.useHDLVector(false);
 s_tready_port = this_block.port('s_tready');
 s_tready_port.setType('UFix_1_0');
 s_tready_port.useHDLVector(false);
 if (this_block.inputTypesKnown)
 if (this_block.port('Data').width ~= 8);
 this_block.setError('Input data type for port "Data" must have width=8.');
 end
 if (this_block.port('s_tvalid').width ~= 1);
 this_block.setError('Input data type for port "s_tvalid" must have width=1.');
 end
 this_block.port('s_tvalid').useHDLVector(false);
 end 
 if (this_block.inputRatesKnown)
 setup_as_single_rate(this_block,'clk','ce')
 end
 uniqueInputRates = unique(this_block.getInputRates);
 this_block.addFile('fir4core.vhd');
 this_block.addFile('fir4core.ngc');
 this_block.addFile('fir4core.mif');
 this_block.addFile('fir4_sch.vhd');
return;
function setup_as_single_rate(block,clkname,cename)
 inputRates = block.inputRates;
 uniqueInputRates = unique(inputRates);
 if (length(uniqueInputRates)==1 & uniqueInputRates(1)==Inf) 
 block.addError('The inputs to this block cannot all be constant.'); 
 return; 
 end 
 if (uniqueInputRates(end) == Inf) 
 hasConstantInput = true; 
 uniqueInputRates = uniqueInputRates(1:end-1); 
 end 
 if (length(uniqueInputRates) ~= 1) 
 block.addError('The inputs to this block must run at a single rate.'); 
 return; 
 end 
 theInputRate = uniqueInputRates(1); 
 for i = 1:block.numSimulinkOutports 
 block.outport(i).setRate(theInputRate); 
 end 
 block.addClkCEPair(clkname,cename,theInputRate); 
 return; 

Пример 11. Отредактированный m-файл, созданный на основе файла fir4_sch.vhd

 

Выводы

Использование методологии Black Boxes Xilinx System Generator значительно повышает возможности объектно-ориентированного проектирования при разработке имитационных моделей цифровых устройств для реализации в базисе ПЛИС, так как позволяет импортировать коды высокоуровневых языков описания аппаратурных средств из САПР Xilinx ISE в систему Matlab/Simulink, полученных с помощью различных приемов.

Литература
  1. Строгонов А., Цыбин С., Городков П. Проектирование КИХ-фильтров в САПР ПЛИС Xilinx ISE Design Suite // Компоненты и технологии. 2014. № 11.
  2. Строгонов А., Цыбин С., Городков П. Проектирование КИХ-фильтров на распределенной арифметике в САПР ПЛИС Xilinx ISE Design Suite // Компоненты и технологии. 2015. № 2.
  3. Строгонов А., Цыбин С., Городков П. Разработка КИХ-фильтров в системе Xilinx System Generator САПР ISE Design Suite // Компоненты и технологии. 2015. № 5.
  4. Строгонов А., Цыбин С., Городков П. Проектирование последовательных КИХ-фильтров в системе Xilinx System Generator с применением библиотеки Reference BlockSet/DSP // Компоненты и технологии. 2015. № 6.
  5. System Generator for DSP User Guide. UG640 (v 13.3). October 19, 2011.
  6. Тарасов И. Использование САПР PlanAhead для разработки цифровых систем на базе ПЛИС Xilinx // Компоненты и технологии. 2012. № 4.

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

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

live bedroom sex video pornview.org monalisa hot video full color hentai manga hentaicity.org kayle hentai 仙台 ニューハーフ javmobile.mobi 日常生活の着爆乳 美奈子編 xx video janwar indianpornmms.net xxxsexfilms なりすまし文系女子痴女ntr~sex狂の美少女が見た目を変えて清純好き男を寝取りまくった~ 麻里梨夏 javshare.info 咲坂あいり
نيك بكل الاوضاع xenival.com سكساوى عرب birpara college mecoporn.com marathi video sax نكت اختي pornovuku.info سكس عربى امهات sri lankan hot sex hdtubefucking.com hot sex vedio.com سكساحترافي gratisfucktube.com كايلاني لي
نيك دلع thogor.com رقص مع خلع الملابس نيك صور realpornmovies.net صورسكس نيك カリスマ読者モデル史上最悪の恥辱 愛波りりか javlibrary.pro 乙葉ののか 岬ななみ 動画 ero-video.mobi 中条カノン av اغتصاب بورنو arabianmotion.com نيك هند صبرى