Построения HDL

Представление констант VHDL с агрегатами

По умолчанию кодер представляет константы как скаляры или агрегируется в зависимости от размера и типа данных. Кодер представляет значения, которые являются меньше чем 232 – 1 как целые числа и значения, больше, чем или равный 232 – 1, как агрегируется. Следующие объявления константы VHDL являются примерами объявлений, сгенерированных по умолчанию для значений меньше чем 32 бита:

CONSTANT coeff1: signed(15 DOWNTO 0) := to_signed(-60, 16); -- sfix16_En16
CONSTANT coeff2: signed(15 DOWNTO 0) := to_signed(-178, 16); -- sfix16_En16

Если вы предпочитаете, чтобы постоянные значения были представлены, как агрегируется, установите Represent constant values by aggregates можно следующим образом:

  1. Выберите вкладку Global Settings на диалоговом окне Generate HDL.

  2. Выберите вкладку Advanced.

  3. Выберите Represent constant values by aggregates, как показано следующая фигура.

Предыдущие объявления константы теперь появились бы можно следующим образом:

CONSTANT coeff1: signed(15 DOWNTO 0) := (5 DOWNTO 3 => '0',1 DOWNTO 0 => '0,OTHERS =>'1');
CONSTANT coeff2: signed(15 DOWNTO 0) := (7 => '0',5 DOWNTO 4 => '0',0 => '0',OTHERS =>'1');

Альтернатива командной строки: Используйте функцию generatehdl со свойством UseAggregatesForConst представлять константы в HDL-коде, как агрегируется.

Разворачивание и удаление циклов VHDL

По умолчанию кодер поддерживает циклы VHDL. Однако некоторые инструменты EDA не поддерживают их. Если вы используете такой инструмент наряду с VHDL, можно развернуть и удалить FOR и циклы GENERATE из сгенерированного кода VHDL. Код Verilog уже развернут.

Развернуть и удалить FOR и циклы GENERATE,

  1. Выберите вкладку Global Settings на диалоговом окне Generate HDL.

  2. Выберите вкладку Advanced. Панель Advanced появляется.

  3. Выберите Loop unrolling, как показано в следующей фигуре.

Альтернатива командной строки: Используйте функцию generatehdl со свойством LoopUnrolling развернуть и удалить циклы из сгенерированного кода VHDL.

Используя VHDL rising_edge Функция

Кодер может сгенерировать два стиля кода VHDL для проверки возрастающие ребра, когда фильтр работает с регистрами. По умолчанию сгенерированный код проверяет на событие часов, как показано в операторе ELSIF следующего блока процесса VHDL.

Delay_Pipeline_Process : PROCESS (clk, reset)
BEGIN
  IF reset = '1' THEN
    delay_pipeline(0 TO 50) <= (OTHERS => (OTHERS => '0'));
  ELSEIF clk'event AND clk = '1' THEN
    IF clk_enable = '1' THEN
      delay_pipeline(0) <= signed(filter_in);
      delay_pipeline(1 TO 50) <= delay_pipeline(0 TO 49);
    END IF;
  END IF;
END PROCESS Delay_Pipeline_Process ;

Если вы предпочитаете, кодер может произвести код VHDL, который применяет VHDL функция rising_edge вместо этого. Например, оператор ELSIF в предыдущем блоке процесса был бы заменен следующим оператором:

  ELSIF rising_edge(clk) THEN

Использовать функцию rising_edge,

  1. Нажмите Global Settings в диалоговом окне Generate HDL.

  2. Выберите вкладку Advanced. Панель Advanced появляется.

  3. Выберите Use 'rising_edge' for registers, как показано в следующем диалоговом окне.

Альтернатива командной строки: Используйте функцию generatehdl со свойством UseRisingEdge использовать VHDL функция rising_edge, чтобы проверять на возрастающие ребра во время операций регистра.

Подавление генерации VHDL встроенные настройки

Настройки VHDL могут быть или встроенными с остальной частью кода VHDL для сущности или внешними в отдельных исходных файлах VHDL. По умолчанию кодер включает настройки для фильтра в рамках сгенерированного кода VHDL. Если вы создаете свои собственные конфигурационные файлы VHDL, подавляете генерацию встроенных настроек.

Подавить генерацию встроенных настроек,

  1. Выберите вкладку Global Settings на диалоговом окне Generate HDL.

  2. Выберите вкладку Advanced. Панель Advanced появляется.

  3. Очистите Inline VHDL configuration, как показано в следующей фигуре.

Альтернатива командной строки: Используйте функцию generatehdl со свойством InlineConfigurations подавить генерацию встроенных настроек.

Определение синтаксиса VHDL для конкатенированных нулей

В VHDL конкатенация нулей может быть представлена в двух формах синтаксиса. Одна форма, '0' & '0', безопасна с точки зрения типов. Этот синтаксис является значением по умолчанию. Альтернативный синтаксис, "000000...", может быть легче считать и более компактен, но может привести к неоднозначным типам.

Использовать синтаксис "000000..." для конкатенированных нулей,

  1. Выберите вкладку Global Settings на диалоговом окне Generate HDL.

  2. Выберите вкладку Advanced. Панель Advanced появляется.

  3. Очистите Concatenate type safe zeros, как показано в следующей фигуре.

Альтернатива командной строки: Используйте функцию generatehdl со свойством SafeZeroConcat использовать синтаксис "000000..." для конкатенированных нулей.

Определение входной обработки типа для операций сложения и операций вычитания

По умолчанию сгенерированный HDL-код работает с входными данными с помощью типов данных, как задано проектом фильтра, и затем преобразовывает результат в заданный тип результата.

Типичные процессоры DSP вводят входные данные броска к типу результата прежде, чем работать с данными. В зависимости от операции результаты могут отличаться. Если вы хотите, чтобы сгенерированный HDL-код обработал результат, вводящий таким образом, используйте опцию Cast before sum можно следующим образом:

  1. Выберите вкладку Global Settings на диалоговом окне Generate HDL.

  2. Выберите вкладку Advanced. Панель Advanced появляется.

  3. Выберите Cast before sum, как показано в следующей фигуре.

Альтернатива командной строки: Используйте функцию generatehdl со свойством CastBeforeSum бросить входные значения к типу результата для операций сложения и операций вычитания.

Отношение с броском перед суммой в Filter Designer

Опция Cast before sum связана с установкой Filter Designer для опции квантования Cast signals before sum можно следующим образом:

  • Некоторые типы объекта фильтра не имеют свойства Cast signals before sum. Для таких объектов фильтра Cast before sum эффективно выключен, когда HDL-код сгенерирован; это не относится к фильтру.

  • Где объект фильтра действительно имеет свойство Cast signals before sum, кодер по умолчанию следует за установкой Cast signals before sum в объекте фильтра. Эта установка видима в пользовательском интерфейсе. Если вы изменяете настройки Cast signals before sum, кодер обновляет установку Cast before sum.

  • Однако явным образом установкой Cast before sum, можно заменить установку Cast signals before sum, переданную в от Filter Designer.

Подавление директив масштаба времени Verilog

В Verilog кодер генерирует директивы масштаба времени (ˋtimescale) по умолчанию. Эта директива компилятора обеспечивает способ задать различные значения задержки для нескольких модулей в файле Verilog.

Подавить использование ˋtimescale директив,

  1. Выберите вкладку Global Settings на диалоговом окне Generate HDL.

  2. Выберите вкладку Advanced. Панель Advanced появляется.

  3. Очистите Use Verilog ˋtimescale directives, как показано в следующей фигуре.

Альтернатива командной строки: Используйте функцию generatehdl со свойством UseVerilogTimescale подавить использование директив масштаба времени.

Используя комплексные данные и коэффициенты

Кодер поддерживает комплексные коэффициенты и комплексные входные сигналы.

Включение генерации кода для комплексных данных

Чтобы сгенерировать порты и пути прохождения сигнала для действительных и мнимых компонентов комплексного входного сигнала, установите Input complexity на Complex. Настройкой по умолчанию для Input complexity является Real, отключая генерацию портов для комплексных входных данных.

Соответствующим свойством командной строки является InputComplex. По умолчанию InputComplex установлен в 'off', отключив генерацию портов для комплексных входных данных. Чтобы включить генерацию портов для комплексных входных данных, установите InputComplex на 'on', как в следующем примере кода:

filt = design(fdesign.lowpass,'equiripple','Filterstructure','dffir','SystemObject',true);
generatehdl(filt,numerictype(1,16,15),'InputComplex','on')

Следующая выборка VHDL кода показывает определение сущности, сгенерированное предыдущими командами:

ENTITY firfilt IS
   PORT( clk                :   IN    std_logic; 
         clk_enable         :   IN    std_logic; 
         reset              :   IN    std_logic; 
         filter_in_re       :   IN    std_logic_vector(15 DOWNTO 0); -- sfix16_En15
         filter_in_im       :   IN    std_logic_vector(15 DOWNTO 0); -- sfix16_En15
         filter_out_re      :   OUT   std_logic_vector(37 DOWNTO 0); -- sfix38_En31
         filter_out_im      :   OUT   std_logic_vector(37 DOWNTO 0)  -- sfix38_En31
         );

END firfilt;

В выборке кода имена порта, сгенерированные для действительных компонентов комплексных сигналов, имеют постфиксный '_re' по умолчанию, и имена порта, сгенерированные для мнимых компонентов комплексных сигналов, имеют постфиксный '_im' по умолчанию.

Установка постфикса имени порта для комплексных портов

Два свойства генерации кода позволяют вам настроить соглашения о присвоении имен для действительных и мнимых компонентов комплексных сигналов в сгенерированном HDL-коде. Эти свойства:

  • Опция Complex real part postfix (соответствующий свойству командной строки ComplexRealPostfix) задает вектор символов, который будет добавлен к именам, сгенерированным для действительной части комплексных сигналов. Постфиксом по умолчанию является '_re'.

  • Опция Complex imaginary part postfix (соответствующий свойству командной строки ComplexImagPostfix) задает вектор символов, который будет добавлен к именам, сгенерированным для мнимой части комплексных сигналов. Постфиксом по умолчанию является '_im'.

Для просмотра документации необходимо авторизоваться на сайте