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 в диалоговом окне Сгенерировать 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 в диалоговом окне Сгенерировать HDL.

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

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

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

Использование функции rising_edge VHDL

Кодер может сгенерировать два стиля кода 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 в диалоговом окне «Генерация HDL».

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

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

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

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

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

Чтобы подавить генерацию встроенных строений,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Выберите вкладку Global Settings в диалоговом окне Сгенерировать 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 кодер генерирует директивы шкалы времени (ˋ<reservedrangesplaceholder0>) по умолчанию. Эта директива компилятора предоставляет способ определения различных значений задержки для нескольких модулей в файле Verilog.

Чтобы подавить использование ˋ<reservedrangesplaceholder0> директивы,

  1. Выберите вкладку Global Settings в диалоговом окне Сгенерировать 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'.

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

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

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

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