В этом примере показано, как сгенерировать HDL-код из кода MATLAB ® из hdl. Системный объект ОЗУ в MATLAB и вывод ОЗУ в сгенерированное оборудование.
Этот пример показывает реализацию задержки линии, которая использует память в структуре звонка, где данные записываются в одной позиции и считываются из другой позиции таким образом, что записанные данные будут считываться после определенного количества циклов. Эффективная реализация этой архитектуры на FPGA Virtex использует двухпортовые ОЗУ на микросхеме Блок и счетчик адресов. Блоковые ОЗУ могут быть сконфигурированы как синхронные двухпортовые ОЗУ 512x8 или 256x9. Чтобы параметризовать длину задержки, адрес записи ОЗУ генерируется счетчиком, и адрес чтения генерируется путем добавления константы K к адресу записи. Если размер памяти M, вход будет считываться с M-K тактовых циклов после того, как он был записан в память, следовательно, реализуя поведение сдвига слов M-K.
design_name = 'mlhdlc_hdlram'; testbench_name = 'mlhdlc_hdlram_tb';
Давайте рассмотрим проект MATLAB.
type(design_name);
%#codegen
function data_out = mlhdlc_hdlram(data_in)
%
% This example shows implementation of a line delay that uses a memory in a
% ring structure, where data is written in one position and read from
% another position in such a way that the data written will be read after a
% specific number of cycles. An efficient implementation of this
% architecture on Virtex FPGAs uses the on-chip Dual Port Block RAMs and an
% address counter. The Block RAMs can be configured as 512x8 or 256x9
% synchronous Dual Port RAMs. To parameterize the delay length, the RAM
% write address is generated by a counter and the read address is generated
% by adding a constant K to the write address. If the memory size is M, the
% input will be read M-K clock cycles after it was written to the memory,
% hence implementing M-K word shift behaviour.
% Copyright 2012-2015 The MathWorks, Inc.
persistent hRam;
if isempty(hRam)
hRam = hdl.RAM('RAMType', 'Dual port');
end
% read address counter
persistent rdAddrCtr;
if isempty(rdAddrCtr)
rdAddrCtr = 0;
end
% ring counter length
ringCtrLength = 10;
ramWriteAddr = rdAddrCtr + ringCtrLength;
ramWriteData = data_in;
ramWriteEnable = true;
ramReadAddr = rdAddrCtr;
% execute single step of RAM
[~, ramRdDout] = step(hRam, ramWriteData, ramWriteAddr, ramWriteEnable, ramReadAddr);
rdAddrCtr = rdAddrCtr + 1;
data_out = ramRdDout;
type(testbench_name);
function mlhdlc_hdlram_tb
%
% Copyright 2012-2015 The MathWorks, Inc.
clear test_hdlram;
data = 100:200;
ring_out = zeros(1, length(data));
for ii=1:100
ring_in = data(ii);
ring_out(ii) = mlhdlc_hdlram(ring_in);
end
figure('Name', [mfilename, '_plot']);
subplot(2,1,1);
plot(1:100,data(1:100));
title('Input data to the ring counter')
subplot(2,1,2);
plot(1:100,ring_out(1:100));
title('Output data')
end
Выполните следующие строки кода, чтобы скопировать необходимые файлы примера во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_sysobj_intro']; % Create a temporary folder and copy the MATLAB files. cd(tempdir); [~, ~, ~] = rmdir(mlhdlc_temp_dir, 's'); mkdir(mlhdlc_temp_dir); cd(mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);
Симулируйте проект с испытательным стендом до генерации кода, чтобы убедиться, что нет ошибок во время выполнения.
mlhdlc_hdlram_tb

Чтобы создать новый проект, введите следующую команду:
coder -hdlcoder -new mlhdlc_sysobj_prj
Затем добавьте файл 'mlhdlc _ hdlram.m' к проекту в качестве функции MATLAB и 'mlhdlc _ hdlram _ tb.m' в качестве испытательного стенда MATLAB.
Более полное руководство по созданию и заполнению проектов MATLAB HDL Coder см. в разделе «Начало работы с MATLAB в HDL».
Запустите советник по рабочим процессам. В Workflow Advisor щелкните правой кнопкой мыши шаг 'Генерация Кода'. Выберите опцию «Run to selected task», чтобы выполнить все шаги от начала до генерации HDL-кода.
Просмотрите сгенерированный HDL-код, щелкнув по ссылкам в окне журнала.
Список системных объектов, поддерживаемых для генерации HDL-кода, см. в разделе Предопределенные системные объекты, поддерживаемые для генерации HDL-кода.
Выполните следующие команды, чтобы очистить временную папку проекта.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_sysobj_intro']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');