Эти инструкции рекомендуют, как можно использовать матричные и векторные сигналы при моделировании проекта для генерации HDL-кода. Каждая инструкция имеет уровень серьезности, который указывает на уровень требований податливости. Чтобы узнать больше, смотрите Уровни серьезности Руководств по моделированию HDL.
ID инструкции
1.3.1
Серьезность
Обязательный
Описание
HDL Coder™ не делает типов данных таблицы поддержки в интерфейсах DUT. Прежде чем 2D матричные сигналы вводят Подсистему DUT, преобразуют сигналы в 1D векторы при помощи блока Reshape. В Подсистеме DUT можно преобразовать векторы назад в матрицы при помощи, Изменяют блоки, и затем выполняют матричные расчеты. После выполнения расчетов необходимо преобразовать матрицы назад в векторные сигналы в DUT интерфейс выхода. Вне интерфейса DUT можно преобразовать векторные сигналы назад в матрицы.
Моделирование факторов
Когда вы используете блок Reshape, чтобы преобразовать векторы в 2D матрицы, убедитесь, что вы задаете правильные Выходные размерности.
Когда вы будете использовать блок продукта, используйте правильный режим Multiplication. При помощи этого режима можно выполнить или умножение матриц или поэлементное умножение. Умноженный выход может иметь различные размерности в зависимости от режима Multiplication.
Когда вы используете блок продукта, чтобы выполнить умножение матриц, поместить блок Matrix Multiply в блоке Subsystem. Когда вы генерируете код и открываете сгенерированную модель, вы видите, что HDL Coder расширяет умножение матриц до нескольких продукт, и Добавьте блоки. Размещение блока Matrix Multiply в подсистеме делает сгенерированную модель легче понять. Кроме того, убедитесь, что вы не предоставляете больше чем два входных параметров блоку Matrix Multiply.
Когда вы извлечете матричные данные, используйте блоки Селектора и Присвоения. Убедитесь, что вы не используете типы данных с фиксированной точкой для входных портов индекса для блоков.
Пример
В этом примере показано, как использовать матричные типы в HDL Coder™. Откройте эту модель hdlcoder_matrix_multiply
. Модель содержит блок Reshape, который преобразует матричный вход в 1D вектор в интерфейсе DUT Subsystem.
open_system('hdlcoder_matrix_multiply') set_param('hdlcoder_matrix_multiply', 'SimulationCommand', 'update') sim('hdlcoder_matrix_multiply')
Если вы открываете Подсистему DUT, вы видите две подсистемы. Изменять блоки преобразуют 1D массив назад в матрицы 2 на 2 для входа к подсистемам. Одна подсистема использует блок Matrix Multiply, и другая подсистема выполняет поэлементное умножение. Выходной результат преобразован назад в векторы.
open_system('hdlcoder_matrix_multiply/DUT')
Если вы генерируете HDL-код для Подсистемы DUT и открываете сгенерированную модель, вы видите, как операция умножения выполняется.
1.3.2
Строго рекомендуемый
В MATLAB®, порядок битов по умолчанию для массивов возрастает. Сгенерированный код VHDL в таких случаях использует объявление std_logic_vector (0 to n)
. Это объявление сигнала генерирует предупреждения путем нарушения определенного HDL, кодирующего стандартные правила. Это некоторые сценарии:
Возрастающие битные сценарии порядка
Сценарий | Проблемный пример | Работа вокруг |
---|---|---|
Блок Delay с Delay length, больше, чем | Этот пример иллюстрирует сгенерированный код для блока Delay с Delay length ENTITY Subsystem1 IS PORT( clk : IN std_logic; reset : IN std_logic; enb : IN std_logic; In1 : IN std_logic; -- ufix1 Out1 : OUT std_logic -- ufix1 ); END Subsystem1; ARCHITECTURE rtl OF Subsystem1 IS -- Signals SIGNAL Delay_reg : std_logic_vector(0 TO 4); -- ufix1 [5] SIGNAL Delay_out1 : std_logic; -- ufix1 | Вместо того, чтобы использовать блок Delay с Delay length ENTITY Subsystem1 IS PORT( clk : IN std_logic; reset : IN std_logic; enb : IN std_logic; In1 : IN std_logic; -- ufix1 Out1 : OUT std_logic -- ufix1 ); END Subsystem1; ARCHITECTURE rtl OF Subsystem1 IS -- Signals SIGNAL Delay_out1 : std_logic; -- ufix1 SIGNAL Delay1_out1 : std_logic; -- ufix1 SIGNAL Delay2_out1 : std_logic; -- ufix1 SIGNAL Delay3_out1 : std_logic; -- ufix1 SIGNAL Delay4_out1 : std_logic; -- ufix1 |
Объединение нескольких входных сигналов к векторному сигналу с помощью блока Mux. | Этот пример иллюстрирует сгенерированный код, когда вы используете блок Mux, чтобы объединить ENTITY Subsystem IS PORT( In1 : IN std_logic; -- ufix1 Out1 : OUT std_logic_vector(0 TO 3) -- ufix1 [4] ); END Subsystem; ARCHITECTURE rtl OF Subsystem IS -- Signals SIGNAL Mux_out1 : std_logic_vector(0 TO 3); -- ufix1 [4] | Используйте блок Bit Concat, чтобы объединить входные сигналы. Этот пример иллюстрирует сгенерированный код для этого блока путем конкатенации ENTITY Subsystem IS PORT( In1 : IN std_logic; -- ufix1 Out1 : OUT std_logic_vector(3 DOWNTO 0) -- ufix4 ); END Subsystem; ARCHITECTURE rtl OF Subsystem IS -- Signals SIGNAL Bit_Concat_out1 : unsigned(3 DOWNTO 0); -- ufix4 |
Используя блок Constant, чтобы сгенерировать векторные сигналы. | Этот пример иллюстрирует сгенерированный код, когда вы используете блок Constant, чтобы сгенерировать вектор из ENTITY Subsystem2 IS PORT( Out1 : OUT std_logic_vector(0 TO 3) -- boolean [4] ); END Subsystem; ARCHITECTURE rtl OF Subsystem2 IS -- Signals SIGNAL Constant_out1 : std_logic_vector(0 TO 3); -- boolean [4] | Используйте блок Demux, сопровождаемый блоком Bit Concat после блока Constant. Этот пример иллюстрирует сгенерированный код, когда вы применяете эту технику моделирования к вектору из ENTITY Subsystem2 IS PORT( Out1 : OUT std_logic_vector(3 DOWNTO 0) -- ufix4 ); END Subsystem2; ARCHITECTURE rtl OF Subsystem2 IS -- Signals SIGNAL Constant_out1 : std_logic_vector(0 TO 3); -- boolean [4] SIGNAL Constant_out1_0 : std_logic; SIGNAL Constant_out1_1 : std_logic; SIGNAL Constant_out1_2 : std_logic; SIGNAL Constant_out1_3 : std_logic; SIGNAL Bit_Concat_out1 : unsigned(3 DOWNTO 0); -- ufix4 ] |