Чтобы выполнить легкую передачу данных или к регистрам управления доступом, используйте ведомые интерфейсы AXI4. Ведомые интерфейсы AXI4 включают AXI4 и AXI4-облегченные интерфейсы. С программным обеспечением HDL Coder™ вы не должны реализовывать AXI4 или AXI4-облегченный протокол в вашей модели. Программное обеспечение генерирует AXI4 или AXI4-облегченные интерфейсы в ядре IP HDL.
Когда вы моделируете свой проект, задаете порты данных, вы хотите сопоставить с ведомыми интерфейсами AXI4. HDL Coder затем сопоставляет порты данных с регистрами с отображенной памятью и выделяет смещения адреса для портов.
Когда вы сопоставляете свои порты DUT с AXI4 или AXI4-облегченными интерфейсами:
Можно сопоставить весь скаляр, вектор или входы шины в проекте или к AXI4 или к AXI4-облегченным интерфейсам.
Вы не можете сопоставить некоторые порты DUT с интерфейсами AXI4 и другие порты DUT к AXI4-облегченным интерфейсам для того же проекта.
Когда вы используете скалярные типы данных в интерфейсных портах DUT, можно непосредственно сопоставить интерфейсные порты с AXI4 или AXI4-облегченными интерфейсами. Генератор кода присваивает уникальный адрес каждому порту данных, который вы хотите сопоставить с интерфейсом AXI4.
Для примера, который показывает, как сопоставить скалярные порты с AXI4-облегченными интерфейсами, открыть модель hdlcoder_led_blinking
.
open_system('hdlcoder_led_blinking')
В этой модели, подсистема led_counter
аппаратная подсистема. Это моделирует счетчик, который мигает светодиодами на плате FPGA. Два входных порта, Blink_frequency
и Blink_direction
, порты управления, которые определяют частоту мигания LED и направление. Все блоки за пределами подсистемы led_counter
для реализации программного обеспечения.
В Simulink® можно использовать блок Slider Gain или блок Manual Switch, чтобы настроить аппаратные входные значения подсистемы. Процессор ARM управляет сгенерированным ядром IP путем записи в интерфейс AXI доступных регистров во встроенном программном обеспечении. Выходной порт аппаратной подсистемы связывает с оборудованием LED. Можно использовать выходной порт Read_back
считывать данные назад в процессор.
Когда вы запускаете IP Core Generation
рабочий процесс, в задаче Set Target Interface, вы видите что порты Blink_frequency
, Blink_direction
, и Read_back
сопоставьте с AXI4-облегченными интерфейсами.
Чтобы узнать больше об этом примере, см.:
Когда вы используете векторные типы данных в интерфейсных портах DUT, можно непосредственно сопоставить интерфейсные порты с AXI4 или AXI4-облегченными интерфейсами. Генератор кода присваивает уникальный адрес для каждого порта данных, который вы хотите сопоставить с интерфейсом AXI4.
Когда вы сопоставляете векторные порты, HDL Coder использует дополнительные регистры строба для каждого порта, чтобы обеспечить синхронизацию с логикой основного алгоритма IP. Для входных портов регистры строба управляют разрешать сигналами для набора теневых регистров, заставляя логику основного алгоритма IP видеть обновленные векторные элементы одновременно. Для выходных портов регистры строба убеждаются, что векторные данные, которые будут считаны, собраны синхронно.
Для примера, который показывает, как сопоставить векторные порты с AXI4-облегченными интерфейсами, открыть модель hdlcoder_led_vector
.
open_system('hdlcoder_led_vector')
В этой модели, подсистема DUT
реализует LED мигающий алгоритм и имеет векторные выходные порты. Когда вы запускаете IP Core Generation
рабочий процесс, вы видите, что входные порты и выходные порты сопоставляют с AXI4-облегченными интерфейсами в задаче Set Target Interface.
Чтобы узнать больше, смотрите Рабочий процесс Генерации Ядра IP с процессором MicroBlaze: Xilinx Kintex-7 KC705.
Когда вы используете типы данных шины в интерфейсных портах DUT, можно непосредственно сопоставить интерфейсные порты с AXI4 или AXI4-облегченными интерфейсами.
Когда вы сопоставляете типы данных шины, HDL Coder присваивает уникальный адрес для каждого порта данных, который вы хотите сопоставить с интерфейсом AXI4. Шины верхнего уровня и подуровня не имеют адреса смещения регистра. Отображение адресов для отдельных скалярных или векторных элементов шины не непрерывно.
Смоделируйте элемент шины при помощи блока создателя шины или соедините шиной блок элемента, чтобы создать вход шины.
Смоделируйте элемент шины при помощи блока создателя шины.
Смоделируйте элемент шины при помощи блоков элемента шины:
Для получения дополнительной информации смотрите Типы данных Шины Карты к Ведомым Интерфейсам AXI4.
Когда вы запускаете IP Core Generation
рабочий процесс или Simulink Real-Time FPGA I/O
рабочий процесс, можно задать начальное значение для входных портов, сопоставленных с ведомыми регистрами AXI4. Можно задать начальное значение при отображении с этими целевыми интерфейсами:
AXI4
AXI4-облегченный
PCIe
По умолчанию начальное значение является нулем. Задавать ненулевое значение:
В таблице интерфейса целевой платформы, когда вы сопоставляете порт входа DUT с ведомым интерфейсом AXI4, кнопка Options появляется в столбце Interface Options.
Нажмите кнопку Options, и затем задайте RegisterInitialValue.
Заданное значение сохранено на блоках Inport DUT как свойство IOInterfaceOptions блока HDL во вкладке Target Specification. Например, если вы сопоставляете входной порт DUT с интерфейсом AXI4-Lite, устанавливаете RegisterInitialValue на 5
, и затем запустите задачу Set Target Interface., свойство IOInterfaceOptions того входного порта сохранено со значением {'RegisterInitialValue','5'}
.
Просмотреть IOInterfaceOptions
значение, если полным путем к вашему порту DUT является hdlcoder_led_blinking/led_counter/LED
, Введите:
hdlget_param('hdlcoder_led_blinking/led_counter/LED',... 'IOInterfaceOptions')
Задайте начальное значение для скалярных портов.
hdlset_param('hdlcoder_led_blinking/led_counter/LED', ... 'IOInterfaceOptions', {'RegisterInitialValue','5'});
Чтобы установить начальное значение для шины, задайте struct, имена полей которого совпадают с именами элементов шины. Например,
Можно также задать начальное значение при помощи переменной, заданной в рабочей области MATLAB®. Например:
bus1_initialvalue = struct('scalar_in1',1,'scalar_in2',2,'scalar_in3',3,'scalar_in4',4,'vector_in',[1 3])
Когда вы запускаете IP Core Generation
рабочий процесс, можно считать назад значение, которое записано в ведомые регистры AXI4 при помощи ведомого интерфейса AXI4. Например, можно считать назад значения, которые записаны в ведомые регистры AXI4 при помощи devmem
команда в консоли Linux процессора ARM. Если вам установили HDL Verifier™, можно использовать MATLAB в качестве Ведущего IP AXI, чтобы считать назад значения.
Использовать эту возможность, в задаче Generate RTL Code and IP Core IP Core Generation
рабочий процесс, установите флажок Enable read back on AXI4 slave write registers, и затем запустите задачу Generate RTL Code and IP Core
Когда вы запускаете эту задачу, HDL Coder сохраняет чтение назад настройка, которую вы включили на модели. В HDL Block Properties Подсистемы DUT, на разделе IP Core Parameter вкладки Target Specification, вы видите параметр набор AXI4RegisterReadback к on
. Если вы экспортируете HDL Workflow Advisor, запущенный в скрипт, вы видите, что эта установка экономила на модели при помощи hdlset_param
.
hdlset_param('hdlcoder_led_vector/DUT', 'AXI4RegisterReadback', 'on');
Эти примеры показывают, как можно считать назад значения при помощи devmem
команда в консоли Linux с программой, такой как PuTTy™.
Чтобы считать назад значения при отображении скалярных портов с интерфейсами AXI4, вы сначала пишете значения в регистры AXI4, и затем читаете назад значения. Вы видите адрес памяти регистров AXI4 в отчете Генерации Ядра IP.
Чтобы считать назад значения при отображении векторных портов с интерфейсами AXI4, вы сначала пишете в регистры AXI4, затем пишете адрес регистра строба с 0x1
, и затем считайте назад значения. Вы видите адрес памяти регистров AXI4 и регистра строба в отчете Генерации Ядра IP.
Когда ваша модель содержит несколько выходных регистров, и вы хотите считать назад данные из нескольких ведомых регистров AXI4, чтение назад логика становится длинной цепью мультиплексора, которая может уменьшить частоту синтеза. Если вы выбираете Enable readback на ведомых регистрах записи AXI4, начинающихся Сгенерировать Код RTL и задача Ядра IP, HDL Coder добавляет мультиплексор для каждого регистра AXI4 в логике Дешифратора адреса. Как количество ведомых увеличений регистров AXI4, цепь мультиплексора становится более длинной, который далее уменьшает частоту синтеза.
Можно оптимизировать readback логику и достигнуть целевой частоты, которую вы хотите. Когда вы запускаете IP Core Generation
рабочий процесс, в задаче Generate RTL Code and IP Core, вы видите установку AX4 slave port to pipeline register ratio. Значением по умолчанию этой установки является auto
. Эта установка указывает, для скольких ведомых регистров AXI4 вставляется конвейерный регистр. Например, AX4 slave port to pipeline register ratio 20
средние значения, что один конвейерный регистр вставляется для каждого 20
Ведомые регистры AXI. auto
установка средних значений, что генератор кода вставляет определенное число конвейеров для ведомых портов AXI4 в зависимости от количества портов и инструмента синтеза, который вы задаете. Можно отключить эту установку или выбрать номер между 5
и 50
для этого отношения.
Когда вы запускаете эту задачу, HDL Coder сохраняет значение, которое вы задали для установки на модели. В HDL Block Properties Подсистемы DUT, на разделе IP Core Parameter вкладки Target Specification, вы видите параметр набор AX4SlavePortToPipelineRegisterRatio к значению, которое вы задали. Если вы экспортируете HDL Workflow Advisor, запущенный в скрипт, вы видите, что эта установка экономила на модели при помощи hdlset_param
.
hdlset_param('hdlcoder_led_vector/DUT', ... 'AXI4SlavePortToPipelineRegisterRatio', '20');