exponenta event banner

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

В этом примере показано, как использовать блоки внутри подсистемы для каждой подсистемы в модели Simulink™, а затем создать код HDL.

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

Чтобы повторно выполнить один и тот же алгоритм для отдельных элементов или подрешеток входных сигналов, используйте блок Для каждой подсистемы. Набор блоков в подсистеме воспроизводит алгоритм, который применяется к отдельным элементам или поровну разделенным субчипам входных сигналов. С помощью блока «Для каждой подсистемы» не требуется создавать и подключать реплики блока «Подсистема» для моделирования одного и того же алгоритма. Для каждой подсистемы:

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

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

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

  • Поддерживает оптимизацию на блоке и внутри него, например совместное использование ресурсов и конвейерную обработку. Параллельная обработка блока «Для каждой подсистемы» в сочетании с указанными оптимизациями обеспечивает высокую производительность целевого устройства FPGA.

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

Откройте окно foreach_subsystem_example1 модель. Вы видите этот простой алгоритм, смоделированный внутри блока «Для каждой подсистемы».

При моделировании модели видно, что входные сигналы In1 и In3 разбиты на субчипы. Чтобы увидеть это разбиение, дважды щелкните блок «Для каждого». Параметры блока «Размер раздела» и «Ширина раздела» определяют размер, через который разделяется входной сигнал, и ширину каждого фрагмента раздела соответственно. На основе указанных размеров входного сигнала и секционирования подсистема Для каждой (For Each Subsystem) определяет количество итераций, необходимых для вычисления алгоритма.

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

Функция «Для каждой подсистемы» упрощает моделирование векторизированных алгоритмов. На этом рисунке показано, как можно моделировать один и тот же алгоритм путем создания нескольких экземпляров подсистемы. Эта модель может стать графически сложной и трудной в обслуживании.

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

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

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

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

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

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

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

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

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

Создание кода HDL

Для создания кода HDL в foreach_subsystem_example1 модель, щелкните правой кнопкой мыши Subsystem_Foreach и выберите HDL Code > Generate HDL for Subsystem.

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

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

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

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

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

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

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

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

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

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

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

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

См. также