明德扬小冉 发表于 2019-12-27 11:56:07

【基于FPGA的图像处理工程】边缘检测工程之伽马矫正模块代码解析

【基于FPGA的图像处理工程】                                                            —边缘检测工程:伽马矫正模块代码解析
作者:小黑同学本文为明德扬原创文章,转载请注明出处!本模块的功能是,接收输入的像素数据,进行伽马校正之后输出。一、设计架构1、架构图下图为本模块的架构图。上图所示,输入的像素数据din是由R、G、B三部分组成,经过数据分解电路将其分开,其中din表示R的值,赋值给din_r;din表示G的值,赋值给din_g;din表示B的值,赋值给din_b。三个RAM中存储的是像素的颜色数据对应的伽马矫正之后的数据,din_r、din_g、din_b分别作为ram_r、ram_g、ram_b的地址,对应的输出dout_r、dout_g、dout_b即是伽马校正之后的颜色数据,将三个数据经过数据拼接电路重新按照R、G、B的顺序拼接起来得到的dout,就是对应输入的像素数据伽马校正之后的数据。2、RAM上图为RAM的地址“address”与输出“q”的关系,在RAM中,一个地址就对应一个数据,假设地址0对应的数据是0、地址1对应数据是1、地址2对应数据是2,这样以此类推,然而在实际输出的时候可以发现,输入相应的地址后,“q”是在下一个时钟周期的时候输出对应的值,也就是输入经过ram之后会有一个时钟的延时。那么为了实现dout_vld、dout_sop、dout_eop等指示信号的作用,输入的din_vld、din_sop、din_eop就要经过时序逻辑延时一个时钟才能赋值给输出的对应的信号。
二、信号的意义

信号类型意义
clk输入信号时钟信号。
rst_n输入信号复位信号,低电平有效。
din输入信号输入的数据,位宽为16bit。表示的是一个像素点的值。其中,:表示像素中R的值。:表示像素中G的值。[ 4: 0]:表示像素中B的值。
din_vld输入信号输入数据有效指示信号。当其为1时,表示输入的数据有效,为0时表示输入数据无效。
din_sop输入信号第一个有效输入数据指示信号,位宽为1bit。当其为1时,表示输入进了一幅图像的第一个像素数据。
din_eop输入信号最后一个有效输入数据指示信号,位宽为1bit。当其为1时,表示输入进了一幅图像的最后一个像素数据。
dout输出信号输出的数据,位宽为16bit(2个字节)。由伽马校正之后的R、G、B三个值拼接得到。
dout_vld输出信号输出数据有效指示信号,位宽为1bit。当其为1时,表示开始输出一幅图像经过伽马校正之后的像素数据。
dout_sop输出信号输出第一个有效数据指示信号,位宽为1bit。当其1时,表示输出一幅图像经过伽马校正之后的第一个像素值。
dout_eop输出信号输出最后一个有效数据指示信号,位宽为1bit。当其为1时,表示输出一幅图像的最后一个像素数据。
din_r中间信号输入像素数据的R的值,位宽为5bit。输入像素数据中的表示像素中R的值。
din_g中间信号输入像素数据的G的值,位宽为6bit。输入像素数据中的表示像素中G的值。
din_b中间信号输入像素数据的B的值,位宽为5bit。输入像素数据中的表示像素中B的值。
dout_r中间信号输出像素数据的R的值,位宽为5bit。输出像素数据中的表示像素中R的值。
dout_g中间信号输出像素数据的G的值,位宽为6bit。输出像素数据中的表示像素中G的值。
dout_b中间信号输出像素数据的B的值,位宽为5bit。输出像素数据中的表示像素中B的值。

三、参考代码下面展出本模块的设计,欢迎进一步交流,如果需要源代码,欢迎与本人联系QQ:1817866119


module   mdyGamma(
      clk       ,
      rst_n   ,
      din       ,
      din_sop   ,
      din_eop   ,
      din_vld   ,

      dout      ,
      dout_sop,
      dout_eop,
      dout_vld   

);

input         clk         ;
input         rst_n       ;
input din         ;
input         din_sop   ;
input         din_eop   ;
input         din_vld   ;

outputdout      ;
output      dout_sop    ;
output      dout_eop    ;
output      dout_vld    ;

wire   din_r       ;
wire   din_g       ;
wire   din_b       ;
wire   dout_r      ;
wire   dout_g      ;
wire   dout_b      ;
reg    dout_r_ff0;
reg    dout_r_ff1;
reg    dout_g_ff0;
reg    dout_g_ff1;
reg    dout_b_ff0;
reg    dout_b_ff1;
reg         dout_vld_ff0;
reg         dout_sop_ff0;
reg         dout_eop_ff0;
reg         dout_vld    ;
reg         dout_sop    ;
reg         dout_eop    ;



assign din_r = din;
assign din_g = din;
assign din_b = din;

ram_r u_ram_r(
    .clock   (clk),
    .address   ({1'b0,din_r}),
    .q         (dout_r)
);
ram_g u_ram_g(
    .clock   (clk),
    .address   ({1'b0,din_g}),
    .q         (dout_g)
);
ram_b u_ram_b(
    .clock   (clk),
    .address   ({1'b0,din_b}),
    .q         (dout_b)
);



assign dout = {dout_r,dout_g,dout_b};


always@(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
      dout_vld_ff0 <= 0;
      dout_vld   <= 0;
      dout_sop_ff0 <= 0;
      dout_sop   <= 0;
      dout_eop_ff0 <= 0;
      dout_eop   <= 0;
    end
    else begin
      dout_vld   <= din_vld;
      dout_sop   <= din_sop;
      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),及时获取最新的文章信息,个性化问题也可以找我哦:Q1817866119(N老师)。
页: [1]
查看完整版本: 【基于FPGA的图像处理工程】边缘检测工程之伽马矫正模块代码解析