【基于FPGA的图像处理工程】边缘检测工程之灰度转换模块代码解析
【基于FPGA的图像处理工程】 ——边缘检测工程:灰度转换模块代码解析作者:陈刀刀本文为明德扬原创文章,转载请注明出处!灰度转换模块的功能:该模块将接收到的RGB数据经过灰度转换公式计算,输出灰度数据给下一个模块。一、设计架构
RGB图像转换成灰度图像的公式为:Gray = (red * 70 + green * 150 + bule *30)>>8公式中的RGB是888格式,即R、G、B均用8比特表示。注意,本模块输入的是565格式,即R、G、B分别是5、6、5表示。RGB565转成RGB888的方法,只要后面补0或者低位即可。例如R后面补3个0。
如上图,第1个像素进来的din为16’h0001,即R=5’b00000,G=6’b000000,B=5’b00001。改为RGB888格式后,R=8’b00000000,G=8b’00000000,B=8’b00001000
如上图,第2个像素进来的din为16’h0203,即R=5’b00000,G=6’b001010,B=5’b00011。改为RGB888格式后,R=8’b00000000,G=8’b00001010,B=8’b00000011。
二、信号的意义
信号类型意义
Clk输入信号时钟信号。
rst_n输入信号复位信号,低电平有效。
din输入信号输入数据,16位。
din_vld输入信号数据有效信号,din_vld为1,数据有效,din_vld为0,数据无效。
din_sop输入信号第一个有效数据指示信号,本帧的第1个像素。
din_eop输入信号最后一个有效数据指示信号,本帧最后1个像素
dout输出信号输出的灰度图像数据。收到din_vld有效信号时,dout输出的数据为(red * 70 + green * 150 + bule *30)的值右移8位。
dout_vld输出信号输出数据的有效指示信号,dout_vld为1时,数据有效,dout_vld为0,数据无效。
dout_sop输出信号输出的第一个有效数据指示信号吧,本帧的第1个像素。
dout_eop输出信号输出的最后一个有效数据指示信号,本帧最后1个像素。
red内部信号RGB图像中红色数据。该数据为8位,0到2位补0。3到7位为有效数据的11到15位。
green内部信号RGB图像中的绿色数据。该数据为8位,0到1位补0,2到7位为有效数据的5到10位。
bule内部型号RGB图像中的蓝色数据。该数据为8位,0到2位补0,3到7位为有效数据的0到4位。
三、参考代码
下面展出本模块的设计,欢迎进一步交流,如果需要源代码,欢迎与本人联系。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475module rgb565_gray( clk , rst_n , din , din_vld , din_sop , din_eop , dout , dout_vld , dout_sop , dout_eop ); input clk ; input rst_n ; input din ; input din_vld ; input din_sop ; input din_eop ; output dout ; output dout_vld ; output dout_sop ; output dout_eop ; reg dout ; reg dout_vld ; reg dout_sop ; reg dout_eop ; wire red ; wire green ; wire bule ; assign red = {din , 3’b0}; assign green = {din, 2’b0}; assign bule= {din , 3’b0}; always@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dout <= 8'd0; end else if(din_vld)begin dout <= (red * 70 + green * 150 + bule *30) >> 8; end end always@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dout_vld <= 1'b0; end else begin dout_vld <= din_vld; end end always@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dout_sop <= 1'b0; end else begin dout_sop <= din_sop; end end always@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin dout_eop <= 1'b0; end else begin dout_eop <= din_eop; end end endmodule
明德扬专注FPGA研究,我司正在连载两本书籍:《基于FPGA至简设计法实现的图像边缘检测系统》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=691)、《ASIC和FPGA时序约束理论与应用》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=705),有兴趣点击阅读。也欢迎加入群(838209674),及时获取最新的文章信息,个性化问题也可以找我哦:Q1277642036(陈刀刀)。
页:
[1]