exponenta event banner

Интеграция пользовательского кода HDL в проект MATLAB

hdl.BlackBox предоставляет способ включения пользовательского кода HDL, такого как устаревший или рукописный код HDL, в конструкцию MATLAB ®, предназначенную для создания кода HDL.

При создании пользовательского системного object™, наследующего от hdl.BlackBox, указывается интерфейс порта и поведение моделирования, соответствующее пользовательскому коду HDL.

HDL Coder™ моделирует конструкцию в MATLAB с использованием поведения, определенного в объекте System. Во время создания кода вместо создания кода для моделирования кодер создает экземпляр модуля с интерфейсом порта, указанным в объекте System.

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

Определите hdl.BlackBox Системный объект

  1. Создание определяемого пользователем объекта System, наследуемого от hdl.BlackBox.

  2. Настройте интерфейс черного ящика в соответствии с интерфейсом порта для пользовательского кода HDL путем установки hdl.BlackBox в объекте System.

  3. Определите step способ так, что его поведение моделирования соответствует пользовательскому коду HDL.

    Кроме того, определяемый объект System может наследоваться от обоих объектов. hdl.BlackBox и matlab.system.mixin.Nondirect класс, и вы можете определить output и update методы, соответствующие поведению моделирования пользовательского кода HDL.

Пример кода

Например, следующий код определяет объект System, CounterBbox, который наследует от hdl.BlackBox и представляет пользовательский код HDL для счетчика, который увеличивается до достижения порогового значения. CounterBbox reset и step методы моделируют поведение пользовательского кода HDL.

classdef CounterBbox < hdl.BlackBox % derive from hdl.BlackBox class
    %Counter: Count up to a threshold.
    %
    % This is an example of a discrete-time System object with state
    % variables.
    %
    properties (Nontunable)
        Threshold = 1
    end
 
    properties (DiscreteState)
        % Define discrete-time states.
        Count
    end
 
    methods
        function obj = CounterBbox(varargin)
            % Support name-value pair arguments
            setProperties(obj,nargin,varargin{:});
            obj.NumInputs = 1;   % define number of inputs
            obj.NumOutputs = 1;  % define number of inputs
        end
    end
 
    methods (Access=protected)
        % Define simulation behavior.
        % For code generation, the coder uses your custom HDL code instead.
        function resetImpl(obj)
            % Specify initial values for DiscreteState properties
            obj.Count = 0;
        end
 
        function myout = stepImpl(obj, myin)
            % Implement algorithm. Calculate y as a function of
            % input u and state.
            if (myin > obj.Threshold)
                obj.Count = obj.Count + 1;
            end
            myout = obj.Count;
        end        
    end
end

Использование системного объекта в конструкторской функции MATLAB

После определения объекта System используйте его в конструкторской функции MATLAB, создав экземпляр и вызвав его step способ.

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

Пример кода

Следующий пример кода показывает конструкторскую функцию верхнего уровня, которая создает экземпляр CounterBbox и вызывает его step способ.

function [y1, y2] = topLevelDesign(u)

persistent mybboxObj myramObj
if isempty(mybboxObj)
    mybboxObj = CounterBbox; % instantiate the black box
    myramObj = hdl.RAM('RAMType', 'Dual port');
end

y1 = step(mybboxObj, u); % call the system object step method
[~, y2] = step(myramObj, uint8(10), uint8(0), true, uint8(20));

В следующем примере кода показана функция тестового стенда для topLevelDesign функция.

clear topLevelDesign
y1 = zeros(1,200);
y2 = zeros(1,200);
for ii=1:200
    [y1(ii), y2(ii)] = topLevelDesign(ii);
end
plot([1:200], y2)

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

Создание кода ЛПВП с использованием функции проектирования и кода испытательного стенда.

При использовании сгенерированного кода HDL включите пользовательский код HDL в сгенерированные файлы HDL.

Пример кода

В следующем сгенерированном коде VHDL для CounterBbox например, можно увидеть, что CounterBbox экземпляр в коде MATLAB сопоставляется с определением и экземпляром компонента HDL, но код HDL не генерируется для step способ.

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
 
ENTITY foo IS
  PORT( clk              :   IN    std_logic;
        reset            :   IN    std_logic;
        clk_enable       :   IN    std_logic;
        u                :   IN    std_logic_vector(7 DOWNTO 0);  -- uint8
        ce_out           :   OUT   std_logic;
        y1               :   OUT   real;  -- double
        y2               :   OUT   std_logic_vector(7 DOWNTO 0)  -- uint8
        );
END foo;
 
 
ARCHITECTURE rtl OF foo IS
 
  -- Component Declarations
  COMPONENT CounterBbox
    PORT( clk             :   IN    std_logic;
          clk_enable      :   IN    std_logic;
          reset           :   IN    std_logic;
          myin            :   IN    std_logic_vector(7 DOWNTO 0);  -- uint8
          myout           :   OUT   real  -- double
          );
  END COMPONENT;
 
  COMPONENT DualPortRAM_Inst0
    PORT( clk             :   IN    std_logic;
          enb             :   IN    std_logic;
          wr_din          :   IN    std_logic_vector(7 DOWNTO 0);  -- uint8
          wr_addr         :   IN    std_logic_vector(7 DOWNTO 0);  -- uint8
          wr_en           :   IN    std_logic;
          rd_addr         :   IN    std_logic_vector(7 DOWNTO 0);  -- uint8
          wr_dout         :   OUT   std_logic_vector(7 DOWNTO 0);  -- uint8
          rd_dout         :   OUT   std_logic_vector(7 DOWNTO 0)  -- uint8
          );
  END COMPONENT;
 
  -- Component Configuration Statements
  FOR ALL : CounterBbox
    USE ENTITY work.CounterBbox(rtl);
 
  FOR ALL : DualPortRAM_Inst0
    USE ENTITY work.DualPortRAM_Inst0(rtl);
 
  -- Signals
  SIGNAL enb               : std_logic;
  SIGNAL varargout_1       : real := 0.0;  -- double
  SIGNAL tmp               : unsigned(7 DOWNTO 0);  -- uint8
  SIGNAL tmp_1             : unsigned(7 DOWNTO 0);  -- uint8
  SIGNAL tmp_2             : std_logic;
  SIGNAL tmp_3             : unsigned(7 DOWNTO 0);  -- uint8
  SIGNAL varargout_1_1     : std_logic_vector(7 DOWNTO 0);  -- ufix8
  SIGNAL varargout_2       : std_logic_vector(7 DOWNTO 0);  -- ufix8
 
BEGIN
  u_CounterBbox : CounterBbox
    PORT MAP( clk => clk,
              clk_enable => enb,
              reset => reset,
              myin => u,  -- uint8
              myout => varargout_1  -- double
              );
 
  u_DualPortRAM_Inst0 : DualPortRAM_Inst0
    PORT MAP( clk => clk,
              enb => enb,
              wr_din => std_logic_vector(tmp),  -- uint8
              wr_addr => std_logic_vector(tmp_1),  -- uint8
              wr_en => tmp_2,
              rd_addr => std_logic_vector(tmp_3),  -- uint8
              wr_dout => varargout_1_1,  -- uint8
              rd_dout => varargout_2  -- uint8
              );
 
  enb <= clk_enable;
 
  y1 <= varargout_1;
 
  --y2 = u;
  tmp <= to_unsigned(2#00001010#, 8);
 
  tmp_1 <= to_unsigned(2#00000000#, 8);
 
  tmp_2 <= '1';
 
  tmp_3 <= to_unsigned(2#00010100#, 8);
 
  ce_out <= clk_enable;
 
  y2 <= varargout_2;
 
END rtl;

Ограничения для hdl.BlackBox

Вы не можете использовать hdl.BlackBox назначение значений VHDL ®generic или Verilog ®parameter в пользовательском коде HDL.

См. также

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