hdl.BlackBox предоставляет способ включения пользовательского HDL-кода, такого как устаревший или рукописный HDL-код, в MATLAB® проект, предназначенный для генерации HDL-кода.
Когда вы создаете пользовательскую Системную object™, которая наследует от hdl.BlackBox, вы задаете интерфейс порта и поведение симуляции, соответствующее вашему пользовательскому HDL-коду.
HDL Coder™ моделирует проект в MATLAB с помощью поведения, заданного в системном объекте. Во время генерации кода, вместо генерации кода для поведения симуляции, кодер создает экземпляр модуля с интерфейсом порта, заданным в системном объекте.
Чтобы использовать сгенерированный HDL-код в большей системе, вы включаете пользовательские исходные файлы HDL в остальную часть сгенерированного кода.
hdl.BlackBox Системный объектСоздайте пользовательский системный объект, который наследует от hdl.BlackBox.
Сконфигурируйте интерфейс черного ящика, чтобы он совпадал с интерфейсом порта для пользовательского HDL-кода путем установки hdl.BlackBox свойства в системном объекте.
Определите step метод таким образом, чтобы его симуляция поведение совпадало с пользовательским HDL-кодом.
Кроме того, Системные объекты, которые вы задаете, могут наследовать от обоих hdl.BlackBox и matlab.system.mixin.Nondirect класс, и можно задать output и update методы, соответствующие пользовательскому HDL-коду симуляции поведению.
Например, следующий код определяет Системный объект, CounterBbox, который наследует от hdl.BlackBox и представляет пользовательский HDL-код для счетчика, который увеличивается до достижения порога. The 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 путем создания образца и вызова ее 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-коде.