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-код для счетчика, который постепенно увеличивается, пока это не достигает порога. 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 путем создания экземпляра и вызова его метода 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-коде.