Интегрируйте пользовательский HDL-код в проект MATLAB

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

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

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

Чтобы использовать сгенерированный HDL-код в большей системе, вы включаете пользовательские исходные файлы HDL с остальной частью сгенерированного кода.

Задайте Системный объект hdl.BlackBox

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

  2. Сконфигурируйте интерфейс черного квадрата, чтобы совпадать с интерфейсом порта для вашего пользовательского HDL-кода свойствами установки hdl.BlackBox в Системном объекте.

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

    Также Системный объект, который вы задаете, может наследоваться и hdl.BlackBox и классу matlab.system.mixin.Nondirect, и можно задать output и методы update, чтобы совпадать с пользовательским поведением симуляции HDL-кода.

Пример кода

Например, следующий код задает Системный объект, CounterBbox, который наследовался hdl.BlackBox и представляет пользовательский HDL-код для счетчика, который постепенно увеличивается, пока это не достигает порога. reset CounterBbox и методы 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

После того, как вы зададите свой Системный объект, используйте его в функции проекта 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-код со сгенерированными файлами 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-коде.

Смотрите также

Похожие темы