hdl.BlackBox предоставляет способ включения пользовательского кода HDL, такого как устаревший или рукописный код HDL, в конструкцию MATLAB ®, предназначенную для создания кода HDL.
При создании пользовательского системного object™, наследующего от hdl.BlackBox, указывается интерфейс порта и поведение моделирования, соответствующее пользовательскому коду HDL.
HDL Coder™ моделирует конструкцию в MATLAB с использованием поведения, определенного в объекте System. Во время создания кода вместо создания кода для моделирования кодер создает экземпляр модуля с интерфейсом порта, указанным в объекте System.
Для использования созданного кода HDL в более крупной системе необходимо включить пользовательские исходные файлы HDL вместе с остальными созданными кодами.
hdl.BlackBox Системный объектСоздание определяемого пользователем объекта System, наследуемого от hdl.BlackBox.
Настройте интерфейс черного ящика в соответствии с интерфейсом порта для пользовательского кода HDL путем установки hdl.BlackBox в объекте System.
Определите 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После определения объекта 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.
В следующем сгенерированном коде 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.