Этот пример показывает, как сплющить векторные сигналы в модели Simulink ® в структуру скалярных сигналов в сгенерированном коде VHDL.
Когда вы генерируете код Verilog, по умолчанию векторные сигналы по умолчанию уплощаются в скаляры. Когда вы генерируете код VHDL, можно задать, уплощать ли векторные сигналы на всей модели или на уровне DUT. Уплощение портов вектора только на уровне DUT ускоряет генерацию кода, особенно для больших моделей, которые имеют много вектор входов.
Можно скаляризировать векторные порты в скаляры при генерации HDL-кода из MATLAB ® и Simulink. Для рабочего процесса MATLAB ® в HDL, в задаче Генерация HDL-кода, на вкладке Часы и порты, установите значение Scalarize ports равным dutlevel
или on
.
Чтобы скаляризировать векторные порты при генерации HDL-кода для модели Simulink:
В диалоговом окне Configuration Parameters, на вкладке Генерация HDL-кода > Global Settings > Ports *, установите параметр Scalarize Ports равным dutlevel
или on
.
В HDL Workflow Advisor, на Генерацию HDL-кода > Set Генерации кода Опций > Set Advanced Опций > Ports вкладки, установите параметр Scalarize Ports равным dutlevel
или on
.
В командной строке MATLAB установите ScalarizePorts
свойство к on
или dutlevel
при помощи hdlset_param
или makehdl
.
См. раздел «Скаляризация портов».
Чтобы увидеть уплощение вектора портов, откройте модель hdlcoder_hdlcoder_vector_sum_nested
. Модель управляется векторным входом ширины 10
и имеет выход скаляра.
open_system('hdlcoder_vector_sum_nested') set_param('hdlcoder_vector_sum_nested','SimulationCommand','update')
Эта модель такая же, как и simplevectorsum
модель и состоит из Подсистемы, vsum_mid
, внутри vsum
подсистема.
open_system('hdlcoder_vector_sum_nested/vsum')
The vsum_mid
Подсистема содержит блок Sum of Elements, который сконфигурирован для суммирования векторов. Модель сконфигурирована так, чтобы использовать Tree
реализация при генерации HDL-кода для блока Sum of Elements в рамках подсистемы |vsum. Эта реализация оптимизирована для минимальной задержки, генерирует древовидную структуру сумматоров для блока.
open_system('hdlcoder_vector_sum_nested/vsum/vsum_mid')
По умолчанию в ScalarizePorts
свойство off
. HDL Coder™ генерирует определение типа и объявление порта для порта вектора In1
как показано на этом коде.
PACKAGE simplevectorsum_pkg IS TYPE vector_of_std_logic_vector16 IS ARRAY (NATURAL RANGE <>) OF std_logic_vector(15 DOWNTO 0); TYPE vector_of_signed16 IS ARRAY (NATURAL RANGE <>) OF signed(15 DOWNTO 0); END simplevectorsum_pkg;
...
ENTITY vsum IS PORT( In1 : IN vector_of_std_logic_vector16(0 TO 9); -- int16 [10] Out1 : OUT std_logic_vector(19 DOWNTO 0) -- sfix20 ); END vsum;
Чтобы скаляризировать векторные порты при генерации HDL-кода, либо установите параметр Scalarize ports в диалоговом окне Параметры Конфигурации, либо установите ScalarizePorts
свойство к on
или dutlevel
с hdlset_param
или makehdl
. Когда вы задаете ScalarizePorts
на dutlevel
, только векторные сигналы в DUT уплощены в скаляры. Скаляры являются входами в vsim_mid
подсистема как векторы.
makehdl('hdlcoder_vector_sum_nested/vsum', 'ScalarizePorts', 'dutlevel')
ENTITY vsum IS PORT( In1_0 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_1 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_2 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_3 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_4 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_5 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_6 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_7 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_8 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_9 : IN std_logic_vector(15 DOWNTO 0); -- int16 Out1 : OUT std_logic_vector(19 DOWNTO 0) -- sfix20 ); END vsum;
ENTITY vsum_mid IS PORT( In1 : IN vector_of_std_logic_vector16(0 TO 9); -- int16 [10] Out1 : OUT std_logic_vector(19 DOWNTO 0) -- sfix20 ); END vsum_mid;
Чтобы выровнять векторные порты на всей модели, установите ScalarizePorts
на on
. Векторные порты в vsum_mid
и входы в блок Sum of Elements также уплощены в скаляры.
makehdl('hdlcoder_vector_sum_nested/vsum', 'ScalarizePorts', 'on')
ENTITY vsum_mid IS PORT( In1_0 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_1 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_2 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_3 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_4 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_5 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_6 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_7 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_8 : IN std_logic_vector(15 DOWNTO 0); -- int16 In1_9 : IN std_logic_vector(15 DOWNTO 0); -- int16 Out1 : OUT std_logic_vector(19 DOWNTO 0) -- sfix20 ); END vsum_mid;
Когда вы используете ScalarizePorts
свойство для защищенной модели, вы должны использовать то же значение для этого свойства, что и значение, заданное для этого параметра в верхней модели, из которой он ссылается.
Когда вы используете IP Core Generation
и FPGA-in-the-Loop
рабочие процессы, векторные порты не поддерживаются. Задайте ScalarizePorts
как on
или dutlevel
. Для более быстрой генерации кода установите ScalarizePorts
на dutlevel
.
Векторы или матричные порты как вход в модель-ссылку интерфейс должны быть скаляризированы перед генерацией HDL-кода. Задайте ScalarizePorts
на dutlevel
.
По умолчанию включена команда Сгенерировать код VHDL для моделей-ссылок в одну библиотеку. VHDL- кода генерируется в одной библиотеке вместо отдельных библиотек. В этом случае установите ScalarizePorts
свойство к off
перед генерацией HDL-кода.
При генерации кода, если вы сталкиваетесь с набором или конфликтами по совпадению имен между портами вектора при интерфейсах двух или более сгенерированных модулей кода VHDL, используйте ScalarizePorts
свойство для генерации неконфликтных определений портов.