Этот пример показывает, как сгенерировать HDL-код из проекта MATLAB®, реализующего преобразование RGB2YUV.
design_name = 'mlhdlc_rgb2yuv'; testbench_name = 'mlhdlc_rgb2yuv_tb';
Давайте смотреть на проект MATLAB
type(design_name);
function [x_out, y_out, y_data_out, u_data_out, v_data_out] = mlhdlc_rgb2yuv(x_in, y_in, r_in, g_in, b_in)
%#codegen
% Copyright 2011-2015 The MathWorks, Inc.
persistent RGB_Reg YUV_Reg
persistent x1 x2 y1 y2
if isempty(RGB_Reg)
RGB_Reg = zeros(3,1);
YUV_Reg = zeros(3,1);
x1 = 0;
x2 = 0;
y1 = 0;
y2 = 0;
end
D = [.299 .587 .144;
-.147 -.289 .436;
.615 -.515 -.1];
C = [0; 128; 128];
RGB = [r_in; g_in; b_in];
YUV_1 = D*RGB_Reg;
YUV_2 = YUV_1 + C;
RGB_Reg = RGB;
y_data_out = round(YUV_Reg(1));
u_data_out = round(YUV_Reg(2));
v_data_out = round(YUV_Reg(3));
YUV_Reg = YUV_2;
x_out = x2;
x2 = x1;
x1 = x_in;
y_out = y2;
y2 = y1;
y1 = y_in;
type(testbench_name);
%
% Copyright 2011-2015 The MathWorks, Inc.
FRAMES = 1;
WIDTH = 752;
HEIGHT = 480;
HBLANK = 10;%748;
VBLANK = 10;%120;
vidData = double(imread('mlhdlc_img_yuv.tif'));
for f = 1:FRAMES
vidOut = zeros(HEIGHT, WIDTH, 3);
for y = 0:HEIGHT+VBLANK-1
for x = 0:WIDTH+HBLANK-1
if y >= 0 && y < HEIGHT && x >= 0 && x < WIDTH
b = vidData(y+1,x+1,1);
g = vidData(y+1,x+1,2);
r = vidData(y+1,x+1,3);
else
b = 0;
g = 0;
r = 0;
end
[xOut, yOut, yData, uData, vData] = ...
mlhdlc_rgb2yuv(x, y, r, g, b);
if yOut >= 0 && yOut < HEIGHT && xOut >= 0 && xOut < WIDTH
vidOut(yOut+1,xOut+1,:) = [yData vData uData];
end
end
end
figure(1);
subplot(1,2,1);
imshow(uint8(vidData));
subplot(1,2,2);
imshow(ycbcr2rgb(uint8(vidOut)));
drawnow;
end
Выполнение следующих строк кода копирует необходимые файлы в качестве примера во временную папку
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_rgb2yuv']; % create a temporary folder and copy the MATLAB files cd(tempdir); [~, ~, ~] = rmdir(mlhdlc_temp_dir, 's'); mkdir(mlhdlc_temp_dir); cd(mlhdlc_temp_dir); % copy files to the 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_rgb2yuv_tb

coder -hdlcoder -new mlhdlc_rgb_prj
Затем, добавьте файл 'mlhdlc_rgb2yuv.m' в проект как функция MATLAB и 'mlhdlc_rgb2yuv_tb.m' как Испытательный стенд MATLAB.
Можно обратиться к Началу работы с MATLAB к примеру по Рабочему процессу HDL для более полного примера при создании и заполнении проектов HDL Coder MATLAB.
Запустите Советника по вопросам HDL и щелкните правой кнопкой мыши по 'Генерации кода', продвигаются и выбирают опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.
Исследуйте сгенерированный HDL-код путем нажатия на гиперссылки в окне Code Generation Log.
Можно запустить следующие команды, чтобы очистить временную папку проекта.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_rgb2yuv']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');