Генерация HDL-кода для преобразования формата изображения из RGB в YUV

В этом примере показано, как сгенерировать HDL-код из проекта MATLAB ®, который преобразует формат изображения из RGB в YUV.

MATLAB Проекта и Испытательного стенда

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

Протестируйте алгоритм MATLAB

Чтобы избежать ошибок времени выполнения, моделируйте проект с помощью испытательного стенда.

mlhdlc_rgb2yuv_tb

Создайте папку и скопируйте соответствующие файлы

Прежде чем вы сгенерируете HDL-код для проекта MATLAB, скопируйте файлы дизайна и испытательного стенда в папку с возможностью записи. Эти команды копируют файлы во временную папку.

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 Coder™

Чтобы сгенерировать 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 Coder см. в разделе «Начало работы с MATLAB в HDL».

Запуск преобразования с фиксированной точкой и генерации HDL-кода

  1. Нажмите кнопку Советник по рабочему процессу, чтобы запустить Советник по рабочему процессу.

  2. Щелкните правой кнопкой мыши Генерации HDL-кода задачу и выберите Запуск для выбранной задачи.

Файл HDL mlhdlc_rgb2yuv_fixpt.vhd генерируется для проекта MATLAB. Чтобы изучить сгенерированный HDL-код для создания фильтра, щелкните гиперссылку на файл HDL в окне Генерации кода Журнала.

Очистка сгенерированных файлов

Чтобы очистить временную папку проекта, запустите следующие команды:

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');