Main Content

MATLAB 設計へのカスタム HDL コードの統合

hdl.BlackBox を使用すると、古い形式のコードや手書きの HDL コードなどのカスタム HDL コードを、HDL コード生成用の MATLAB® 設計に含めることができます。

hdl.BlackBox から継承するユーザー定義の System object™ を作成するときに、カスタム HDL コードに合った端子インターフェイスとシミュレーション動作を指定します。

System object に定義した動作に基づいて、HDL Coder™ により MATLAB 内の設計がシミュレートされます。HDL コードの生成時には、シミュレーションの動作のコードが生成されるのではなく、System object に指定した端子インターフェイスをもつモジュールがインスタンス化されます。

生成された HDL コードを大規模システムで使用するには、カスタムの HDL ソース ファイルを、生成された残りのコードと共に設計に含めます。

hdl.BlackBox System object の定義

  1. hdl.BlackBox から継承する、ユーザー定義の System object を作成します。

  2. System object の hdl.BlackBox プロパティを設定することで、カスタム HDL コードの端子インターフェイスに一致するブラック ボックス インターフェイスを構成します。

  3. シミュレーション動作が HDL コードと一致するように、step メソッドを定義します。

    または、hdl.BlackBox クラスから継承するように System object を定義し、カスタム HDL コードのシミュレーション動作が一致するように output メソッドと update メソッドを定義します。

コード例

次のコードは、CounterBbox という System object を定義します。このオブジェクトは hdl.BlackBox から継承し、しきい値に達するまでインクリメントするカウンターのカスタム HDL コードを表します。CounterBboxreset メソッドと 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 object の使用

System object を定義後に 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 コードと共に設計に組み込みます。

コード例

次に、CounterBbox 用に生成された VHDL® コードの例を示します。この例では、MATLAB コード内の CounterBbox インスタンスが HDL コンポーネントの定義とインスタンス化にマッピングされていますが、step メソッドの HDL コードは生成されていません。

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 を使用して、カスタム HDL コード内の VHDL generic、または Verilog® または SystemVerilog parameter に値を代入することはできません。

参考

関連するトピック