前言
具体关于色域的知识就不细说了,简单来讲YUV中Y通道可以理解为就是图像的灰度图,因此,将RGB转化为YUV是求彩色图的灰度直方图、进行二值化操作等的基础。
HDMI时序生成模块
这里先介绍一下仿真时用于生成HDMI时序,用这个时序来向数据处理模块输入数据,一是可以做到通过同步信号简化对图像数据的管理,二是可以让测试的数据处理模块更方便的适配用HDMI显示的图像处理工程。
HDMI的单帧时序如图,具体时序知识不细说,下面代码实现的功能简单理解就是当data_req(数据请求)信号拉高时,开始向模块内输入图像数据,连续输入一行的数据,然后直接输出图像数据,当输出数据时拉高hdmi_de(数据有效)信号。因为本次是单帧的图像,所以hdmi_vs(场同步)信号以及hdmi_hs(行同步)信号是用不到的。
要注意不同尺寸的图像对应的参数不同,本模块适用于1280*720像素的图像
module hdmi_tim_gen(
input clk ,
input rst_n ,
input [23:0] data_in ,
output hdmi_hs , //行同步信号
output hdmi_vs , //场同步信号
output hdmi_de , //数据使能
output [23:0] hdmi_data , //图像数据
output reg data_req
);
//1280*720 分辨率时序参数
parameter H_SYNC = 11'd40;
parameter H_BACK = 11'd220;
parameter H_DISP = 11'd1280;
parameter H_FRONT = 11'd110;
parameter H_TOTAL = 11'd1650;
parameter V_SYNC = 11'd5;
parameter V_BACK = 11'd20;
parameter V_DISP = 11'd720;
parameter V_FRONT = 11'd5;
parameter V_TOTAL = 11'd750;
reg [11:0] cnt_h;
reg [11:0] cnt_v;
reg [10:0] pixel_xpos;
reg [10:0] pixel_ypos;
assign hdmi_de = data_req;
assign hdmi_hs = ( cnt_h < H_SYNC ) ? 1'b0 : 1'b1;
assign hdmi_vs = ( cnt_v < V_SYNC ) ? 1'b0 : 1'b1;
//图像数据输出
assign hdmi_data = hdmi_de ? data_in : 24'd0;
//请求像素点数据输入
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
data_req <= 1'b0;
else if(((cnt_h >= H_SYNC + H_BACK - 2'd2) && (cnt_h < H_SYNC + H_BACK + H_DISP - 2'd2))
&& ((cnt_v >= V_SYNC + V_BACK) && (cnt_v < V_SYNC + V_BACK+V_DISP)))
data_req <= 1'b1;
else
data_req <= 1'b0;
end
//像素点x坐标
always@ (posedge clk or negedge rst_n) begin
if(!rst_n)
pixel_xpos <