%% Design Video Processing Algorithms for HDL in Simulink
% This example shows how to design a hardware-targeted image filter using 
% Vision HDL Toolbox(TM) blocks. It also uses Computer Vision Toolbox(TM) blocks.
%
% The key features of a model for hardware-targeted video processing in Simulink(R) are:
%
% * *Streaming pixel interface*: Blocks in Vision HDL Toolbox use a streaming
% pixel interface. Serial processing is efficient for hardware designs, because
% less memory is required to store pixel data for computation. The serial 
% interface allows the block to operate independently of image size and format
% and makes the design more resilient to video timing errors. For further 
% information, see <docid:visionhdl_ug.budgsr5-1 Streaming Pixel Interface>.
% * *Subsystem targeted for HDL code generation*: Design a hardware-friendly
% pixel-streaming video processing model by selecting blocks from the Vision
% HDL Toolbox libraries. The part of the design targeted for HDL code generation
% must be in a separate subsystem.
% * *Conversion to frame-based video*: For verification, you can display 
% frame-based video or compare the result of your hardware-compatible design
% with the output of a Simulink behavioral model. Vision HDL Toolbox provides
% a block that allows you to deserialize the output of your design.
%% Open Model Template 
% This tutorial uses a Simulink model template to get started.
% 
% Click the Simulink button, or type |simulink| at the MATLAB(R) command prompt.
% On the Simulink start page, find the Vision HDL Toolbox section, and click
% the Basic Model template. 
% 
% The template creates a new model that you can customize. Save the model with a new name.
modelname = 'SimulinkVisionHDLTutorial';
open_system(modelname);
set_param(modelname,'Open','on');
set(allchild(0),'Visible','off');

%% Import Data
% The template includes a Video Source block that contains a 240p video sample.
% Each pixel is a scalar |uint8| value representing intensity. A best practice
% is to design and debug your design using a small frame size for quick debug
% cycles, before scaling up to larger image sizes. You can use this 240p source
% to debug a design targeted for 1080p video.

%% Serialize Data
% The Frame To Pixels block converts framed video to a stream of pixels and
% control structures. This block provides input for a subsystem targeted for
% HDL code generation, but it does not itself support HDL code generation.
% 
% The template includes an instance of this block. To simulate with a standard
% video format, choose a predefined video padding format to match your input
% source. To simulate with a custom-size image, choose the dimensions of the
% inactive regions that you want to surround the image with. This tutorial
% uses a standard video format.
%
% Open the Frame To Pixels block dialog box to view the settings. The source
% video is in 240p grayscale format. A scalar integer represents the intensity
% value of each pixel. To match the input video, set *Number of components* to 1,
% and the *Video format* to 240p.
% 
% Note : 
% The sample time of the video source must match the total number of pixels
% in the frame size you select in the Frame To Pixels block. Set the sample
% time to *Total pixels per line* &times; *Total lines*. In the |InitFcn| callback, the
% template creates a workspace variable, |totalPixels|, for the sample time of a 240p frame.
% 
% <<../simulinktutorial_f2pmask.png>>

%% Design HDL-Compatible Model
% Design a subsystem targeted for HDL code generation, by modifying the HDL
% Algorithm subsystem. The subsystem input and output ports use the streaming
% pixel format described in the previous section. Open the HDL Algorithm 
% subsystem to edit it.
%
% In the Simulink Library Browser, click Vision HDL Toolbox. You can also 
% open this library by typing |visionhdllib| at the MATLAB command prompt.
%
% Select an image processing block. This example uses the <docid:visionhdl_ref.bt4qqzr-1 Image Filter> block
% from the Filtering sublibrary. You can also access this library by typing
% |visionhdlfilter| at the MATLAB command prompt. Add the Image Filter block
% to the HDL Algorithm subsystem and connect the ports.

set_param([modelname '/HDL Algorithm'],'Open','on');

%%
% Open Image Filter block and make the following changes:
%
% * Set *Filter coefficients* to |ones(4,4)/16| to implement a 4&times;4 blur operation.
% * Set *Padding method* to |Symmetric|.
% * Set *Line buffer size* to a power of 2 that accommodates the active line
% size of the largest required frame format. This parameter does not affect 
% simulation speed, so it does not need to be reduced when simulating with 
% a small test image. The default, 2048, accommodates 1080p video format.
% * On the *Data Types* tab, under *Data Type*, set *Coefficients* to |fixdt(0,1,4)|.

%% Design Behavioral Model
% You can visually or mathematically compare your HDL-targeted design with 
% a behavioral model to verify the hardware design and monitor quantization
% error. The template includes a Behavioral Model subsystem with frame-based
% input and output ports for this purpose. Double-click on the Behavioral 
% Model to edit it.
%
% For this tutorial, add the <docid:vision_ref.f73492 2-D FIR Filter> block from Computer 
% Vision System Toolbox. This block filters the entire frame at once.
% 
% Open the 2-D FIR Filter block and make the following changes to match the
% configuration of the Image Filter block from Vision HDL Toolbox:
%
% * Set *Coefficients* to |ones(4,4)/16| to implement a 4&times;4 blur operation.
% * Set *Padding options* to |Symmetric|.
% * On the *Data Types* tab, under *Data Type*, set *Coefficients* to |fixdt(0,2,4)|.

%% Deserialize Filtered Pixel Stream
% Use the Pixels To Frame block included in the template to deserialize the data for display.
% 
% Open the Pixels To Frame block. Set the image dimension properties to match
% the input video and the settings you specified in the Frame To Pixels block.
% For this tutorial, the *Number of components* is set to 1 and the *Video format*
% is set to 240p. The block converts the stream of output pixels and control
% signals back to a matrix representing a frame.

%% Display Results and Compare to Behavioral Model
% Use the Video Viewer blocks included in the template to compare the output
% frames visually. The |validOut| signal of the Pixels To Frame block is 
% connected to the |Enable| port of the viewer. Run the model to display 
% the results.

sim(modelname);

%% Generate HDL Code
% Once your design is working in simulation, you can use HDL Coder(TM) to generate
% HDL code for the HDL Algorithm subsystem. See <docid:visionhdl_ug.buqrazy-1 Generate HDL Code From Simulink>.

%% 
% Copyright 2015 The MathWorks, Inc.