//RGB转灰度
always @(posedge cam_pclk or negedge rst_n) begin//RGB拆分
if(!rst_n)
begin
r <= 0;
g <= 0;
b <= 0;
end
else if(cam_href)
begin
r<=cmos_data_t[15:11];
g<=cmos_data_t[10:5];
b<=cmos_data_t[4:0];
end
end
always @(posedge cam_pclk or negedge rst_n) begin//灰度计算
if(!rst_n)
begin
rgb_gray <= 0;
end
else if(cam_href)
begin
rgb_gray <= (r*76 + g*150 + b*30) >> 8;
cmos_data_t_gray <= {rgb_gray[7:3],rgb_gray[7:2],rgb_gray[7:3]};
end
end
assign cmos_data_final = (GREY_EN == 1'b1) ? cmos_data_t_gray: cmos_data_t;
首先对16位RGB565数据拆分,得到三色中转值用于计算
r<=cmos_data_t[15:11];
g<=cmos_data_t[10:5];
b<=cmos_data_t[4:0];
对灰度计算,不同精度不同位宽数据对应不同计算公式
rgb_gray <= (r*76 + g*150 + b*30) >> 8
最终对计算灰度数值取565位合并输出,使R=G=B。