此程序在HDMI图像显示基础上增加了图像处理模块和RAM模块存储处理之后的图片再通过HDMI显示。
在top文件中的思路:先在ROM中缓存一张图片,将读出的数据送入img_processor中进行处理,并将处理后的数据存入RAM中,最后送入hdmi显示模块。
图像处理模块:
一、先读取ROM中的像素数据
always @(posedge pixel_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
rom_addr <= 16'd0;
//当横纵坐标位于图片显示区域时,累加ROM地址
else if((rom_addr < RAM_NUM) && rom_rd_en)
rom_addr <= rom_addr + 1'b1;
//当横纵坐标位于图片区域最后一个像素点时,ROM地址清零
else
rom_addr <= 16'd0;
end
二、灰度化原理:R G B三通道的数值相等
具体实现:1、原始数据是RGB888格式,先通过公式转成YCbCr格式(3级流水线)
2、提取Y分量,将R G B三通道都赋成Y的值
三、RAM写入
ram_wr_en:RAM写使能,rom读到第三个数时拉高,开始写入
//RAM端口A使能信号,输出第一个灰度化数据时拉高,同时拉高写使能
always @ (posedge pixel_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
ram_wr_en <= 1'b0;
else if(rom_addr >= 16'd3)
ram_wr_en <= 1'b1;
else
ram_wr_en <= 1'b0;
end
//RAM端口A写地址,0~RAM_NUM-1
always @ (posedge pixel_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
ram_wr_addr <= 16'd0;
else if((ram_wr_addr < (RAM_NUM-1)) && ram_wr_en)
ram_wr_addr <= ram_wr_addr + 1'b1;
else
ram_wr_addr <= 16'd0;
end
处理后的像素数据存储模块(RAM)
写入接Img_Processor,读出接pic_display,输出给pic_display
图像显示模块
在图像显示区域将RAM相应地址中的值赋给显示像素数据pixel_data
框图如下: