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]};