fpga图片灰度处理

时间:2022-04-18 20:29:02

fpga图片灰度处理

 

vga显示静态图品主要分为两个部分,一个是驱动vga,另一部分控制vga显示。

vga驱动部分之前写过,直接例化过来用即可。

另一个是vga显示,从网上找了一个200*200的lena图品,然后用BMP2Mif软件

将图片转换成mif文件,24*40000,24代表rgb三原色,4000代表像素,在200*200

的区域内,一共有40000个像素点,然后把mif文件存进rom里,vga显示出来即可。

/*-----------------------------------------------------------------------

Date : 2017-XX-XX
Description : Design for .

-----------------------------------------------------------------------
*/


module vga_control
(
//global clock
input clk, //system clock
input rst_n, //sync reset

//vga interface
input [10:0] value_x,
input [10:0] value_y,
output [23:0] rgb,

//rom interface

output reg [15:0] rom_addr, //
input [23:0] rom_q
);


//--------------------------------
//Funtion : display_区域

wire display_addr;
assign display_addr = ((value_x >= 8'd100 && value_x < 9'd300) && (value_y >= 8'd100 && value_y < 9'd300)) ? 1'b1 : 1'b0;



//--------------------------------
//Funtion : rgb

assign rgb = (display_addr == 1'b1) ? rom_q : 1'd0;

//--------------------------------
//Funtion : rom_addr

wire [10:0] display_x;
wire [10:0] display_y;

assign display_x = value_x - 8'd100;
assign display_y = value_y - 8'd100;


always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
rom_addr
<= 1'd0;
else if(display_addr)
rom_addr
<= display_x + display_y*200;
else
rom_addr
<= 1'd0;
end


endmodule

fpga图片灰度处理 

将图品进行灰度处理,把图片进行灰度化我搜了一下,一是可以加快运算速度,第二点色彩对于计算本身并没有作用,所以把它舍弃。

彩色转灰度公式 : gray = RX0.299 + GX0.587 + BX0.114;

fpga里面的寄存器都是整数,所以需要对数据进行放大,可能思维固化了吧,第一反应是这样的

因为都是三位小数,我会乘上1000然后除1000,但是除法速度明显不如移位,其实可以这样

把每位都乘上2^16,然后右移16位即可

//--------------------------------
//Funtion : rgb

//assign rgb = (display_addr == 1'b1) ? rom_q : 1'd0;
assign rgb = (display_addr == 1'b1) ? {3{gray}} : 1'd0;


//--------------------------------
//Funtion : 转灰度处理
wire [7:0] gray;

assign gray = (rom_q[23:16]*19595 + rom_q[15:8]*38469 + rom_q[7:0]*7472) >> 16;

这样一看,灰度化其实也挺简单的,没有那么神秘