
根据这个原理图,写出对图像进行灰度化的verilog代码FPGA实现(紫光同创盘古开发板)
module rgb_to_gray
(
input pixclk,
input vs,
input hs,
input de,
input [7:0] r,
input [7:0] g,
input [7:0] b,
output pixclk_o,
output vs_o,
output hs_o,
output de_o,
output [7:0] r_o,
output [7:0] g_o,
output [7:0] b_o
);
reg vs_r1;
reg hs_r1;
reg de_r1;
reg vs_r2;
reg hs_r2;
reg de_r2;
reg [7:0] r_r;
reg [7:0] g_r;
reg [7:0] b_r;
reg [7:0] gray_r;
//通常 RGB 亮度按这个公式计算 Y = 0.299R + 0.587G + 0.114B
//把 RGB 这3个通道相等,且都等与上面的这个算出来的亮度就完成了彩色转灰度
assign r_o = gray_r;
assign g_o = gray_r;
assign b_o = gray_r;
//下面的计算,分解成了先求 3 个颜色与系数乘积,再求和。这样做会降低每个单位时钟的计算量。
//在做一些 4K 视频时,这样的处理时序任然会紧张,就需要用 FPGA 专用的 DSP 或乘法单元来处理。
always@(posedge pixclk)
begin
r_r <= 0.299 * r;
g_r <= 0.587 * g;
b_r <= 0.114 * b;
gray_r <= r_r + g_r + b_r;
end
assign pixclk_o = pixclk;
assign vs_o = vs_r2;
assign hs_o = hs_r2;
assign de_o = de_r2;
//在 3 通道的计算中,时钟用了 2 拍。这里与颜色数据同步的 VS,HS,DE 也需要延时 2 拍
always@(posedge pixclk)
begin
vs_r1 <= vs;
vs_r2 <= vs_r1;
hs_r1 <= hs;
hs_r2 <= hs_r1;
de_r1 <= de;
de_r2 <= de_r1;
end
endmodule