Сгенерируйте HDL-код для блоков внутри каждой подсистемы

В этом примере показано, как использовать блоки внутри Подсистемы For Each в вашей Simulink™ модели, а затем сгенерировать HDL-код.

Зачем использовать для каждой подсистемы?

Чтобы неоднократно выполнять один и тот же алгоритм над отдельными элементами или подрешетками входных сигналов, используйте блок For Each Subsystem. Набор блоков в Подсистеме тиражирует алгоритм, который применяется к отдельным элементам или поровну разделённым подрешеткам входных сигналов. Используя блок For Each Subsystem, вы не должны создавать и соединять реплики блока Subsystem, чтобы смоделировать один и тот же алгоритм. Для каждой подсистемы:

  • Поддерживает векторную или 2-D матричную обработку, которая сокращает время симуляции вашей модели. Можно обрабатывать отдельные элементы или подрешетки входного сигнала одновременно.

  • Улучшает читаемость кода при помощи цикла for-generate в сгенерированном HDL-коде. Цикл for-generate уменьшает количество строк кода, что в противном случае может привести к сотням строк кода для больших векторных сигналов.

  • Поддерживает генерацию HDL-кода для всех типов данных, блоков Simulink™ и предопределенных и пользовательских системных объектов.

  • Поддерживает оптимизацию внутри и внутри блока, такие как совместное использование ресурсов и конвейеризация. Возможность параллельной обработки блока For Each Subsystem в сочетании с оптимизациями, которые вы задаете, обеспечивает высокую эффективность на целевом устройстве FPGA.

Моделирование с помощью каждой подсистемы

Откройте foreach_subsystem_example1 модель. Вы видите этот простой алгоритм, смоделированный внутри блока For Each Subsystem.

Когда вы симулируете модель, вы видите, что входные сигналы In1 и In3 разделены на подрешетки. Чтобы увидеть этот раздел, дважды кликните блок For Each. Параметры блоков Размерность и Partition Width задают размерность, через которую распределяется входной сигнал, и ширину каждого среза раздела соответственно. На основе размеров входного сигнала и заданного вами разбиения, For Each Subsystem определяет количество итераций, которые ему требуется для вычисления алгоритма.

В этом примере входные сигналы In1 и In3 размера 8 разбиты на четыре подрешетки, каждый из которых имеет размер 2. Входной сигнал In2 размера 2 не разбит. Чтобы вычислить алгоритм, Подсистеме For Each требуется четыре итерации с каждой итерацией, повторяющей алгоритм на каждом из четырех подрешетки In1 и In3.

Подсистема For Each упрощает моделирование векторизованных алгоритмов. Этот рисунок показывает, как можно смоделировать тот же алгоритм, создав несколько образцы подсистемы. Эта модель может стать графически сложной и трудной для обслуживания.

Использование матричных входных сигналов

Подсистема For Each поддерживает 2-D матричный вход для генерации HDL-кода. Для примера, foreach_subsystem_example2 модель показывает простую многоканальную операцию фильтра. Генерация HDL-кода не поддерживается для матриц в вход и выход портах HDL DUT, поэтому модель разделяет каналы в контур подсистемы DUT.

Подсистема For Each усредняет выборки по каждому каналу. Сгенерированный HDL-код будет содержать три копии логики внутри For Each Subsystem, и каждая работает с вектором 4x1.

Использование Комплексных данных сигналов

Блок не поддерживает типы комплексных данных, как входы для генерации HDL-кода. Чтобы ввести комплексный сигнал, можно преобразовать этот сигнал в массив сигналов, а затем ввести в блок.

Чтобы выполнить тот же алгоритм как на действительной, так и на мнимой частях сигнала:

  1. Разделите сигнал на действительные и мнимые части при помощи блока Complex to Real-Imag.

  2. Создайте сигнал вектора, который состоит из действительной и мнимой частей при помощи блока Mux.

Затем можно ввести этот вектор в блок For Each Subsystem и повторить одни и те же расчеты как на вещественной, так и на мнимой частях. На выходе For Each Subsystem можно преобразовать выход вектора назад в комплексный сигнал. Используйте блок Demux, чтобы разделить действительную и мнимую скалярные части, а затем введите скаляры в блок Real-Imag to Complex.

Сгенерируйте HDL-код

Чтобы сгенерировать HDL-код, в foreach_subsystem_example1 модель, щелкните правой кнопкой мыши по Subsystem_Foreach блокировать и выбрать HDL-код > Сгенерировать HDL для подсистемы.

Чтобы увидеть сгенерированный HDL-код для Subsystem_Foreach блок, в MATLAB™ Командном окне, нажмите Subsystem_Foreach.vhd файл. В фрагменте кода VHDL этот цикл for-generate отображается в HDL-коде. Этот цикл создает четыре образцов подсистемы, причем каждый образец выполняет алгоритм на подмассе 2 подрешетки входов In1 и In3.

Можно задать оптимизации, которые изменяют содержимое подсистем, экземпляры которых Для каждой Подсистемы. В таких случаях генератор кода не использует циклы for-generate в HDL-коде. HDL-код не содержит циклов for-generate, если у вас есть:

  • Шина или комплексные входные сигналы.

  • Совместное использование ресурсов и потоковая оптимизация подсистемы.

  • Векторные входы, которые разбиваются на нескалярные сигналы в коде Верилога. Чтобы получить циклы for-generate в коде Verilog, разбейте векторный сигнал на скаляры.

Оптимизируйте алгоритм для каждой подсистемы

Чтобы оптимизировать алгоритм, содержащийся в Каждой Подсистеме, можно включить оптимизацию, такую как совместное использование ресурсов и потоковая передача в DUT, которая содержит Каждую Подсистему. Для примера с помощью оптимизации совместного использования ресурсов можно совместно использовать несколько образцы Подсистемы, созданных Подсистемой Для Каждого. Эта оптимизация повторно использует алгоритм, смоделированный Подсистемой, для нескольких образцов и уменьшает использование области на целевом устройстве.

Примечание.Когда вы включаете оптимизацию для каждой подсистемы, сгенерированный HDL-код не содержит циклов for-generate.

В этом примере показано, как использовать оптимизацию совместного использования ресурсов в Подсистеме For Each. Чтобы поделиться ресурсами, выберите блок Subsystem, который содержит Для каждой Подсистемы, а затем укажите Коэффициент Совместного Использования. В этом примере щелкните правой кнопкой мыши по Subsystem_Foreach и выберите HDL-код > Свойства блоков HDL. Установите значение коэффициента совместного использования равным 4, поскольку функция For Each Subsystem генерирует четыре образцов Подсистемы. Затем сгенерируйте HDL-код для Subsystem_Foreach блок.

Чтобы увидеть эффект оптимизации совместного использования ресурсов, в командной строке введите gm_foreach_subsystem_example1 чтобы открыть сгенерированную модель. В сгенерированной модели вы видите, что оптимизация разделяет четыре образцов подсистемы, сгенерированные For Each Subsystem, в одну Подсистему For Each Subsystem_Instance1.

Если вы дважды кликните For Each Subsystem_Instance1 блок, вы видите алгоритм, вычисленный для подрешетки size 2 входов In1 и In3.

Дополнительные сведения об оптимизации совместного использования ресурсов см. в разделе Совместное использование ресурсов.

См. также