В этом примере показано, как сгенерировать код HDL из кода MATLAB ® из hdl. Системный объект RAM в MATLAB и вывод RAM в сгенерированном оборудовании.
Этот пример показывает реализацию линейной задержки, которая использует память в кольцевой структуре, где данные записываются в одной позиции и считываются из другой позиции таким образом, что записанные данные будут считываться после определенного количества циклов. Эффективная реализация этой архитектуры на FPGA Virtex использует встроенные двухпортовые блочные RAM и счетчик адресов. Блочные RAM могут быть сконфигурированы как 512x8 или 256x9 синхронные двухпортовые RAM. Для параметризации длины задержки адрес записи ОЗУ генерируется счетчиком, а адрес считывания генерируется путем добавления константы K к адресу записи. Если размер памяти равен М, то на входе считываются тактовые циклы 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 см. в разделе Начало работы с MATLAB в Workflow-процессе HDL.
Запустите помощник по рабочим процессам. В помощнике по рабочим процессам щелкните правой кнопкой мыши шаг «Создание кода». Выберите опцию «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');