exponenta event banner

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

Быстрое создание прототипа IP-ядра HDL путем взаимодействия с целевой платой через Ethernet или JTAG. Используйте Ethernet-соединение для плат с процессором ARM. Используйте соединение JTAG для плат, не имеющих процессора ARM.

Предпосылки

Интерфейс на основе Ethernet

Чтобы использовать Ethernet-подключение к целевым аппаратным платам со встроенным процессором ARM, можно либо создать сценарий программного интерфейса, либо создать пользовательский сценарий программного обеспечения. Перед установкой интерфейса на основе Ethernet установите на карте SD платы образ микропрограммного обеспечения MathWorks ®. Для настройки образа микропрограммного обеспечения для целевой платы:

Сценарий интерфейса программного обеспечения

При выполнении задачи Генерировать программный интерфейс (Generate Software Interface) установите флажок Генерировать сценарий программного интерфейса MATLAB (Generate MATLAB software interface script).

Генерируемые файлы MATLAB:

    • gs_modelName_setup.m, который представляет собой сценарий установки, добавляющий AXI4 подчиненный и AXI4-Stream интерфейсы. Сценарий также содержит объекты порта DUT, которые имеют имя порта, направление, тип данных и информацию о сопоставлении интерфейса. Затем сценарий сопоставляет порты DUT с соответствующими интерфейсами.

    • gs_modelName_interface.m, который создает целевой объект, создает экземпляр сценария установки gs_modelName_setup.m, а затем подключается к целевому оборудованию. Затем сценарий посылает команды чтения и записи в сформированное ядро IP HDL.

    См. раздел Создание сценария интерфейса программного обеспечения для проверки и быстрого создания прототипа IP-ядра HDL.

    Настройка сценария интерфейса программного обеспечения

    Для быстрого создания прототипов настройте сценарий интерфейса программного обеспечения или создайте собственный сценарий на основе изменения исходного проекта. Настройте сценарий, чтобы указать:

    • Целевой объект для другого поставщика FPGA.

    • Дополнительные интерфейсы или настройка существующих интерфейсов на основе изменений исходного проекта. HDL Coder™ использует эту информацию для создания драйверов IIO для доступа к ядру IP HDL.

    • Дополнительные объекты порта DUT или удаление существующих объектов в зависимости от способа изменения конструкции, а затем соответствующее изменение информации о сопоставлении.

    • Входные данные для записи в порты DUT и выходные данные для считывания из портов.

    Разработка сценария интерфейса программного обеспечения

    Можно настроить созданный сценарий программного обеспечения или создать собственный сценарий интерфейса программного обеспечения. Чтобы создать пользовательский сценарий программного обеспечения, выполните следующие действия.

    1. Создание fpga объект для целевого устройства и сохранить в hFPGA.

      hFPGA = fpga("Xilinx")
      
      hFPGA = 
       
         fpga with properties:
       
               Vendor: "Xilinx"
           Interfaces: [0×0 fpgaio.interface.InterfaceBase]
          
      

      Использование целевого объекта Intel:

      hFPGA = fpga("Intel")
      
      hFPGA = 
       
         fpga with properties:
       
               Vendor: "Intel"
           Interfaces: [0×0 fpgaio.interface.InterfaceBase]
          
      

    2. Сконфигурируйте интерфейсы AXI для сопоставления портов DUT в сгенерированном ядре IP HDL. Можно добавить AXI4 подчиненные и AXI4-Stream интерфейсы. Для добавления AXI4 подчиненных интерфейсов используйте addAXI4SlaveInterface функция.

      addAXI4SlaveInterface(hFPGA, ...
      	... % Interface properties
          "InterfaceID", "AXI4-Lite", ...
          "BaseAddress", 0xA0000000, ...
          "AddressRange", 0x10000, ...
          ... % Driver properties
          "WriteDeviceName", "mwipcore0:mmwr0", ...
          "ReadDeviceName", "mwipcore0:mmrd0");
      
      

      Для добавления AXI4-Stream интерфейсов используйте addAXI4StreamInterface функция.

      addAXI4StreamInterface(hFPGA, ...
          ... % Interface properties
          "InterfaceID", "AXI4-Stream", ...
          "WriteEnable", true, ...
          "ReadEnable", true, ...
          "WriteFrameLength", 1024, ...
          "ReadFrameLength", 1024, ...
          ... % Driver properties
          "WriteDeviceName", "mwipcore0:mm2s0", ...
          "ReadDeviceName", "mwipcore0:s2mm0");
      
      

      Указанная информация о сопоставлении интерфейса сохраняется как свойство в fpga объект, hFPGA.

      hFPGA
      hFPGA = 
       
         fpga with properties:
       
               Vendor: "Xilinx"
           Interfaces: [1×2 fpgaio.interface.InterfaceBase]

      Для автономных плат FPGA, не имеющих встроенного процессора ARM, можно создать объект, а затем использовать aximaster объект. Затем используйте этот объект в качестве драйвера для addAXI4SlaveInterface функция. aximaster требуется пакет поддержки HDL Verifier™ для платы Intel или Xilinx FPGA.

      % Create an "aximaster" object 
      hAXIMDriver = aximaster("Xilinx");
      
      % Pass it into the addInterface command
      addAXI4SlaveInterface(hFPGA, ...
          ... % Interface properties
          "InterfaceID",  "AXI4-Lite", ...
          "BaseAddress",  0xB0000000, ...
          "AddressRange", 0x10000, ...
          ... % Driver properties
          "WriteDriver", hAXIMDriver, ...
          "ReadDriver", hAXIMDriver, ...
          "DriverAddressMode", "Full");
      
      

    3. Укажите информацию о портах DUT в сгенерированном IP-ядре HDL в качестве массива объектов портов с помощью hdlcoder.DUTPort объект. Объект представляет порты DUT на целевом оборудовании.

      hPort_h_in1 = hdlcoder.DUTPort("h_in1", ...
      	"Direction", "IN", ...
      	"DataType", numerictype(1,16,10), ...
      	"Dimension", [1 1], ...
      	"IOInterface", "AXI4-Lite", ...
      	"IOInterfaceMapping", "0x100")
      
      
      hPort_h_in1 = 
       
         DUTPort with properties:
       
                         Name: "h_in1"
                    Direction: IN
                     DataType: [1×1 embedded.numerictype]
                    Dimension: [1 1]
                  IOInterface: "AXI4-Lite"
           IOInterfaceMapping: "0x100"

      Для записи или чтения из портов DUT в сгенерированном IP-ядре HDL сопоставьте порты интерфейсу AXI с помощью mapPort функция. После сопоставления портов с интерфейсами эта информация сохраняется на fpga объект в качестве Interfaces собственность.

      mapPort(hFPGA, hPort_h_in1);
      hFPGA.Interfaces
      
      
      ans = 
      
        AXI4Slave with properties:
      
            InterfaceID: "AXI4-Lite"
            BaseAddress: "0xA0000000"
           AddressRange: "0x10000"
            WriteDriver: [1×1 fpgaio.driver.AXIMemoryMappedIIOWrite]
             ReadDriver: [1×1 fpgaio.driver.AXIMemoryMappedIIORead]
             InputPorts: "h_in1"
            OutputPorts: [0×0 string]
      
      

      Можно также указать эту информацию для портов, сопоставленных с AXI4-Stream интерфейсами.

      hPort_x_in_data = hdlcoder.DUTPort("x_in_data", ...
      	"Direction", "IN", ...
      	"DataType", numerictype(1,16,10), ...
      	"Dimension", [1 1], ...
      	"IOInterface", "AXI4-Stream");
      
      hPort_y_out_data = hdlcoder.DUTPort("y_out_data", ...
      	"Direction", "OUT", ...
      	"DataType", numerictype(1,32,20), ...
      	"Dimension", [1 1], ...
      	"IOInterface", "AXI4-Stream");

      Для записи или чтения из портов DUT в сгенерированном IP-ядре HDL сопоставьте порты интерфейсу AXI с помощью mapPort функция.

      mapPort(hFPGA, [hPort_x_in_data, hPort_y_out_data]);
      
      
      После сопоставления портов с интерфейсами эта информация сохраняется на fpga объект в качестве Interfaces собственность.
      hFPGA
      hFPGA = 
      
         fpga with properties:
       
               Vendor: "Xilinx"
           Interfaces: [1×2 fpgaio.interface.InterfaceBase]
      hFPGA.Interfaces
      ans = 
      
         AXI4Slave with properties:
       
            InterfaceID: "AXI4-Lite"
            BaseAddress: "0xA0000000"
           AddressRange: "0x10000"
            WriteDriver: [1×1 fpgaio.driver.AXIMemoryMappedIIOWrite]
             ReadDriver: [1×1 fpgaio.driver.AXIMemoryMappedIIORead]
             InputPorts: "h_in1"
            OutputPorts: [0×0 string]
       
         AXI4Stream with properties:
       
                InterfaceID: "AXI4-Stream"
                WriteEnable: 1
                 ReadEnable: 1
           WriteFrameLength: 1024
            ReadFrameLength: 1024
                WriteDriver: [1×1 fpgaio.driver.AXIStreamIIOWrite]
                 ReadDriver: [1×1 fpgaio.driver.AXIStreamIIORead]
                 InputPorts: "x_in_data"
                OutputPorts: "y_out_data"
      
      

    4. Для тестирования основных функций HDL IP используйте readPort и writePort позволяет записывать данные на эти порты или считывать данные с этих портов.

      writePort(hFPGA, "h_in1", 5);
      
      writePort(hFPGA, "x_in", sin(linspace(0, 2*pi, 1024)));
      data = readPort(hFPGA, "y_out");
      
      
    5. После тестирования IP-ядра HDL можно освободить аппаратный ресурс, связанный с fpga с помощью release функция.

      release(hFPGA)
      
    6. Пример создания сценария пользовательского интерфейса и прототипирования проекта на целевой плате FPGA по Ethernet-соединению см. в разделе Прототип проектирования FPGA на оборудовании с использованием оперативных данных с помощью команд MATLAB.

    Интерфейс на основе JTAG

    Для автономных плат FPGA, не имеющих встроенного процессора ARM, в эталонную конструкцию можно вставить JTAG MATLAB в качестве AXI Master IP. Создание сценария, использующего aximaster объект, который подключается к IP по физическому кабелю JTAG. Этот сценарий позволяет выполнять команды чтения и записи в области памяти подчиненных устройств из командной строки MATLAB.

    Для использования MATLAB в качестве хозяина AXI:

    • Установите пакеты поддержки оборудования HDL Verifier.

    • Не ставьте перед собой автономные платы, не имеющие hRD.AXI4SlaveInterface функциональные возможности или платы, основанные на Xilinx ISE.

    Вставить JTAG MATLAB в качестве мастера AXI

    При запуске рабочего процесса создания IP-ядра в задании «Задать цель > Задать целевое ссылочное проектирование» выберите «Система по умолчанию» для параметра «Ссылочное проектирование» и установите для параметра «Вставить JTAG MATLAB как AXI Master» значение «вкл».

    Чтобы создать ядро IP и создать проект с помощью AXI Master IP, щелкните правой кнопкой мыши задачу Создать проект (Create Project) и выберите Выполнить до выбранной задачи (Run to Selected Task).

    Управление ядром IP кодера HDL в командной строке MATLAB

    Теперь можно взаимодействовать с целевой платой FPGA с помощью функции JTAG MATLAB в качестве AXI Master. Создание объекта с помощью aximaster объект. Использовать созданный объект в качестве драйвера для addAXI4SlaveInterface функция.

    % Create an "aximaster" object 
    hAXIMDriver = aximaster("Xilinx");
    
    % Pass it into the addInterface command
    addAXI4SlaveInterface(hFPGA, ...
        ... % Interface properties
        "InterfaceID",  "AXI4-Lite", ...
        "BaseAddress",  0xB0000000, ...
        "AddressRange", 0x10000, ...
        ... % Driver properties
        "WriteDriver", hAXIMDriver, ...
        "ReadDriver", hAXIMDriver, ...
        "DriverAddressMode", "Full");
    
    

    Пример взаимодействия с целевой платой через JTAG см. в разделе Использование JTAG MATLAB в качестве AXI Master для управления генерируемым ядром IP кодера HDL.

    Связанные темы