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 の定義
hdl.BlackBox
から継承する、ユーザー定義の System object を作成します。System object の
hdl.BlackBox
プロパティを設定することで、カスタム HDL コードの端子インターフェイスに一致するブラック ボックス インターフェイスを構成します。シミュレーション動作が HDL コードと一致するように、
step
メソッドを定義します。または、
hdl.BlackBox
クラスから継承するように System object を定義し、カスタム HDL コードのシミュレーション動作が一致するようにoutput
メソッドとupdate
メソッドを定義します。
コード例
次のコードは、CounterBbox
という System object を定義します。このオブジェクトは 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 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® parameter
に値を割り当てることはできません。