В этом примере показано, как сгенерировать HDL-код из проекта MATLAB®, который преобразует формат изображения от RGB до YUV.
design_name = 'mlhdlc_rgb2yuv'; testbench_name = 'mlhdlc_rgb2yuv_tb';
Рассмотрите проект MATLAB:
open(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-2019 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;
Рассмотрите испытательный стенд MATLAB:
open(testbench_name);
FRAMES = 1; WIDTH = 752; HEIGHT = 480; HBLANK = 10;%748; VBLANK = 10;%120; % Copyright 2011-2019 The MathWorks, Inc. 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_rgb2yuv_tb
Прежде чем вы сгенерируете HDL-код для проекта MATLAB, скопируете проект и файлы испытательного стенда к writeable папке. Эти команды копируют файлы во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_rgb2yuv'];
Создайте временную папку и скопируйте файлы MATLAB.
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);
Сгенерировать HDL-код из проекта MATLAB:
1. Создайте проект HDL Coder:
coder -hdlcoder -new mlhdlc_rgb_prj
2. Добавьте файл mlhdlc_rgb2yuv.m
к проекту как функция MATLAB и mlhdlc_rgb2yuv_tb.m
как испытательный стенд MATLAB.
3. Нажмите типы Autodefine, чтобы использовать рекомендуемые типы для вводов и выводов функции MATLAB mlhdlc_rgb2yuv
.
Обратитесь к Начало работы с MATLAB к Рабочему процессу HDL для более полного примера при создании и заполнении проектов HDL Coder MATLAB.
Нажмите кнопку Workflow Advisor, чтобы запустить Советника по вопросам Рабочего процесса.
Щелкните правой кнопкой мыши по задаче генерации HDL-кода и выберите Run к выбранной задаче.
Файл HDL mlhdlc_rgb2yuv_fixpt.vhd
сгенерирован для проекта MATLAB. Чтобы исследовать сгенерированный 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');