Эти рекомендации рекомендуют использование матричных и векторных сигналов при моделировании проекта для генерации кода HDL. Каждое руководство имеет уровень серьезности, который указывает уровень соответствия требованиям. Дополнительные сведения см. в разделе Рекомендации по моделированию HDL Уровни серьезности.
Идентификатор руководства
1.3.1
Серьезность
Обязательный
Описание
HDL Coder™ не поддерживает типы матричных данных в интерфейсах DUT. Прежде чем сигналы матрицы 2-D поступят в подсистему DUT, преобразуйте сигналы в векторы 1-D с помощью блока изменения формы. Внутри подсистемы DUT можно преобразовать векторы обратно в матрицы с помощью блоков изменения формы, а затем выполнить матричные вычисления. После выполнения вычислений необходимо преобразовать матрицы обратно в векторные сигналы на выходном интерфейсе DUT. Вне интерфейса DUT векторные сигналы можно преобразовать обратно в матрицы.
Соображения по моделированию
При использовании блока «Изменение формы» для преобразования векторов в 2D матрицы убедитесь, что заданы правые размеры вывода.
При использовании блока «Продукт» используйте правильный режим умножения. С помощью этого режима можно выполнять умножение матрицы или умножение по элементам. Умноженный выходной сигнал может иметь различные размеры в зависимости от режима умножения.
При использовании блока «Произведение» для выполнения умножения матрицы поместите блок «Умножение матрицы» в блок «Подсистема». При создании кода и открытии созданной модели можно увидеть, что кодер HDL расширяет умножение матрицы на несколько блоков Product и Add. Размещение блока Matrix Multiply внутри подсистемы облегчает понимание созданной модели. Кроме того, убедитесь, что вы не предоставляете более двух входов в блок умножения матриц.
При извлечении матричных данных используйте блоки выбора и назначения. Убедитесь, что для входных портов индексов блоков не используются типы данных с фиксированной точкой.
Пример
В этом примере показано, как использовать типы матриц в Coder™ HDL. Открыть эту модель hdlcoder_matrix_multiply. Модель содержит блок изменения формы, который преобразует входные данные матрицы в вектор 1-D в интерфейсе подсистемы DUT.
open_system('hdlcoder_matrix_multiply') set_param('hdlcoder_matrix_multiply', 'SimulationCommand', 'update') sim('hdlcoder_matrix_multiply')

При открытии подсистемы DUT отображаются две подсистемы. Блоки изменения формы преобразуют массив 1-D обратно в матрицы 2 на 2 для ввода в подсистемы. Одна подсистема использует блок умножения матриц, а другая подсистема выполняет умножение по элементам. Выходной результат преобразуется обратно в векторы.
open_system('hdlcoder_matrix_multiply/DUT')

При создании кода HDL для подсистемы DUT и открытии созданной модели можно увидеть, как выполняется операция умножения.
1.3.2
Очень рекомендуем
В MATLAB ® порядок битов по умолчанию для массивов увеличивается. Сгенерированный код VHDL в таких случаях использует объявление std_logic_vector (0 to n). Это объявление сигнала генерирует предупреждения, нарушая определенные стандартные правила кодирования HDL. Вот несколько сценариев:
Сценарии возрастания битового порядка
| Сценарий | Пример проблемы | Работа |
|---|---|---|
Блок задержки с длиной задержки больше | Этот пример иллюстрирует сгенерированный код для блока задержки с длиной задержки, равной
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
| Вместо использования блока задержки с длиной задержки
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
|
Использование блока константы для генерации векторных сигналов. | Этот пример иллюстрирует созданный код при использовании блока константы для создания вектора 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
]
|