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