High-Level Synthesis Code Generation for Image Format Conversion from RGB to YUV
This example shows how to generate High-Level Synthesis (HLS) code from a MATLAB® design that converts the image format from RGB to YUV.
MATLAB Design and Test Bench
Set up the rgb2yuv
model for this example.
design_name = 'mlhdlc_rgb2yuv'; testbench_name = 'mlhdlc_rgb2yuv_tb';
Review the rgb2yuv
design.
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;
Review the rgb2yuv
test bench:
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.png')); 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
Test the MATLAB Algorithm
To avoid run-time errors, simulate the design with the test bench.
mlhdlc_rgb2yuv_tb
Create HDL Coder™ Project
To generate HLS code from a MATLAB design:
1. Create a HDL Coder project:
coder -hdlcoder -new mlhdlc_rgb_prj
2. Add the file mlhdlc_rgb2yuv.m
to the project as the MATLAB Function and mlhdlc_rgb2yuv_tb.m
as the MATLAB Test Bench.
3. Click Autodefine types to use the recommended types for the inputs and outputs of the MATLAB function mlhdlc_rgb2yuv
.
For more information, see Get Started with MATLAB to High-Level Synthesis Workflow Using the Command Line Interface or Get Started with MATLAB to High-Level Synthesis Workflow Using HDL Coder App.
Run Fixed-Point Conversion and HLS Code Generation
To generate HLS code from the MATLAB design:
1. At the MATLAB command line, set up the path for HLS code generation by using the function hdlsetuphlstoolpath
.
2. Start the Workflow Advisor by clicking the Workflow Advisor button.
3. In the HDL Workflow Advisor, select Code Generation Workflow as MATLAB to HLS.
4. In the Select Code Generation Target step, from the Synthesis tool list, select Cadence Stratus.
5. Right-click the HLS Code Generation task and select Run to selected task to run all the steps from the beginning through the HLS code generation.
Examine the generated HLS code by clicking the hyperlinks in the HLS Code Generation task log window.