verilog fpga rgb565 转灰度图 (rgb565输出)

module grey (
	//system signals
	input						clk, 
	input						rst_n,
	
	//user
	input						pre_frame_vsync,
	input						pre_frame_hsync,
	input						pre_frame_de,
	input			[15:0]   	pre_rgb,

	//user 
	output	 					post_frame_vsync,
	output	 					post_frame_hsync,
	output	 					post_frame_de,
	output	 reg		[15:0]  post_rgb


);    


//=============================================================================
//****************************     Main Code    *******************************
//=============================================================================


//****************************    同步其他 信号    *******************************

//打三拍
reg   [ 2:0]  pre_frame_hsync_d;
reg   [ 2:0]  pre_frame_vsync_d;
reg   [ 2:0]  pre_frame_de_d;

assign post_frame_hsync = pre_frame_hsync_d[2];
assign post_frame_vsync = pre_frame_vsync_d[2];
assign post_frame_de = pre_frame_de_d[2];

always @ (posedge clk or negedge rst_n) begin
    if(rst_n == 1'b0) begin
        pre_frame_hsync_d <= 1'b0;
        pre_frame_vsync_d <= 1'b0;
        pre_frame_de_d <= 1'b0;
    end 
    else begin
        pre_frame_hsync_d <= {pre_frame_hsync_d[1:0],pre_frame_hsync};
        pre_frame_vsync_d <= {pre_frame_vsync_d[1:0],pre_frame_vsync};
        pre_frame_de_d <= {pre_frame_de_d[1:0],pre_frame_de};
    end    
end




// Grey = R*0.299 + G*0.587 + B*0.114

reg			[ 15:0]   	img_red_grey_d0;
reg			[ 15:0]   	img_green_grey_d0;
reg			[ 15:0]   	img_blue_grey_d0;


reg			[ 7:0]   	img_red_grey_d1;
reg			[ 7:0]   	img_green_grey_d1;
reg			[ 7:0]   	img_blue_grey_d1;
reg   		        [ 7:0]  	img_y;

always @ (posedge clk or negedge rst_n) begin
	if(rst_n == 1'b0) begin
		img_blue_grey_d0 <= 1'b0;
		img_green_grey_d0 <= 1'b0;
		img_red_grey_d0 <= 1'b0;

	end	
	else begin
		img_red_grey_d0 <= pre_rgb[15:11] * 8'd77;
		img_green_grey_d0 <= pre_rgb[10:5] * 8'd150;
		img_blue_grey_d0 <= pre_rgb[4:0] * 8'd29;

		img_red_grey_d1 <= img_red_grey_d0[15:8];
		img_green_grey_d1 <= img_green_grey_d0[15:8];
		img_blue_grey_d1 <= img_blue_grey_d0[15:8];

		img_y <= img_red_grey_d1+img_green_grey_d1+img_blue_grey_d1;
        
		post_rgb <= {img_y[7:3],img_y[7:2],img_y[7:3]};


    end  
end









endmodule

如果要输出rgb888的格式

assign rgb888_r={rgb565[15:11],rgb565[15:13]};
assign rgb888_g={rgb565[10:5],rgb565[10:9]};
assign rgb888_b={rgb565[4:0],rgb565[4:2]};

-----------------------------------------------------------------------------------------------

1. 公式是 Grey = R*0.299 + G*0.587 + B*0.114


2. 输入的RGB是总共16位,使用RGB565的格式,从高向低分别是
R 5位,G 6位, B 5位

3. 这里以R的计算举例


第一步取出R,放在一个16位的寄存器里,并乘以77
img_red_grey_d0 <= pre_rgb[15:11] * 8'd77;

这里解释下为什么乘以77,R的公式是乘以0.299,但是我们可以先乘以256,然后再取高八位(舍弃低8位,等于除以256)
也就是 R * (0.299*256)/256  = R * 77 然后 取高八位

第二步 取高8位
img_red_grey_d1 <= img_red_grey_d0[15:8];

第三步加总RGB
img_y <= img_red_grey_d1+img_green_grey_d1+img_blue_grey_d1;

第四步 输出
灰度值只需要8位就可以表示了,img_y就是8位,如果输出的位数是8位,就直接输出,
如果是5位数,就取高5位。


由于我们输出的数据格式也是RGB565
所以取出高5位,高6位,高5位的数据放入
post_rgb <= {img_y[7:3],img_y[7:2],img_y[7:3]};

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值