В этом примере показано, как сгенерировать HDL-код из кода MATLAB® от hdl.RAM системного объекта в MATLAB и вывести RAM в сгенерированном оборудовании.
Этот пример показывает реализацию задержки линии, которая использует память в кольцевой структуре, где данные написаны в одном положении и считаны из другого положения таким способом, которым записанные данные будут считаны после определенного количества циклов. Эффективное внедрение этой архитектуры на Virtex FPGAs использует Двухпортовые RAM Блока на чипе и счетчик адреса. RAM Блока могут быть сконфигурированы как 512x8 или 256x9 синхронные Двухпортовые RAM. Чтобы параметрировать длину задержки, адрес записи RAM сгенерирован счетчиком, и адрес чтения сгенерирован путем добавления постоянного 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 для более полного примера при создании и заполнении проектов HDL Coder MATLAB.
Запустите Советника по вопросам Рабочего процесса. В Советнике по вопросам Рабочего процесса щелкните правой кнопкой по шагу 'Code Generation'. Выберите опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию 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');