Эти рекомендации рекомендуют, как вы можете использовать матричные и векторные сигналы при моделировании своего проекта для генерации HDL-кода. Каждое руководство имеет уровень серьезности, который указывает на уровень податливостей. Для получения дополнительной информации см. HDL-руководства по моделированию уровней серьезности.
Идентификатор руководства
1.3.1
Серьезность
Обязательный
Описание
HDL Coder™ не поддерживает типы матричных данных в интерфейсах DUT. Прежде чем сигналы матрицы 2-D войдут в Подсистему DUT, преобразуйте сигналы в векторы 1-D с помощью блока Reshape. Внутри Подсистемы DUT можно преобразовать векторы назад в матрицы с помощью блоков Reshape, а затем выполнить матричные расчеты. После выполнения расчетов необходимо преобразовать матрицы назад в векторные сигналы в выходном интерфейсе DUT. Вне интерфейса DUT можно преобразовать векторные сигналы назад в матрицы.
Факторы о моделировании
Когда вы используете блок Reshape для преобразования векторов в 2D матрицы, убедитесь, что задали правые Выходные размерности.
Когда вы используете блок Product, используйте правый режим умножения. При помощи этого режима можно выполнить либо матричное умножение, либо поэлементное умножение. Умноженный выход может иметь различные размерности в зависимости от режима умножения.
Когда вы используете блок Product для выполнения матричного умножения, поместите блок Multiply в блок Subsystem. Когда вы генерируете код и открываете сгенерированную модель, вы видите, что HDL Coder расширяет умножение матрицы на несколько блоков Product и Add. Размещение блока Matrix Multiply внутри подсистемы облегчает понимание сгенерированной модели. В сложении убедитесь, что вы не предоставляете больше двух входов блоку Матрицы Multiply.
При извлечении матричных данных используйте блоки Selector и Assignment. Убедитесь, что вы не используете типы данных с фиксированной точкой для входных портов индекса для блоков.
Пример
В этом примере показано, как использовать матричные типы в HDL- Coder™. Откройте эту модель hdlcoder_matrix_multiply
. Модель содержит блок Reshape, который преобразует матричный вход в вектор 1-D в интерфейсе DUT Subsystem.
open_system('hdlcoder_matrix_multiply') set_param('hdlcoder_matrix_multiply', 'SimulationCommand', 'update') sim('hdlcoder_matrix_multiply')
Если вы открываете Подсистему DUT, то увидите две подсистемы. Блоки Reshape преобразуют массив 1-D назад в матрицы 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 ] |