欢迎光临散文网 会员登陆 & 注册

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

2023-07-31 07:12 作者:明德扬易老师  | 我要投稿

【基于FPGA的图像处理工程】

                                                            —边缘检测工程:伽马矫正模块代码解析


本文为明德扬原创文章,转载请注明出处!

本模块的功能是,接收输入的像素数据,进行伽马校正之后输出。

一、设计架构

1、架构图

下图为本模块的架构图。

上图所示,输入的像素数据din是由R、G、B三部分组成,经过数据分解电路将其分开,其中din[15:11]表示R的值,赋值给din_r;din[10:5]表示G的值,赋值给din_g;din[4:0]表示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就要经过时序逻辑延时一个时钟才能赋值给输出的对应的信号。



二、信号的意义



三、参考代码

下面展出本模块的设计源代码:


  1. module   mdyGamma(

  2.         clk       ,

  3.         rst_n     ,

  4.         din       ,

  5.         din_sop   ,

  6.         din_eop   ,

  7.         din_vld   ,


  8.         dout      ,

  9.         dout_sop  ,

  10.         dout_eop  ,

  11.         dout_vld   


  12. );


  13. input         clk         ;

  14. input         rst_n       ;

  15. input [15:0]  din         ;

  16. input         din_sop     ;

  17. input         din_eop     ;

  18. input         din_vld     ;


  19. output[15:0]  dout        ;

  20. output        dout_sop    ;

  21. output        dout_eop    ;

  22. output        dout_vld    ;


  23. wire   [4:0]  din_r       ;

  24. wire   [5:0]  din_g       ;

  25. wire   [4:0]  din_b       ;

  26. wire   [5:0]  dout_r      ;

  27. wire   [6:0]  dout_g      ;

  28. wire   [5:0]  dout_b      ;

  29. reg    [4:0]  dout_r_ff0  ;

  30. reg    [4:0]  dout_r_ff1  ;

  31. reg    [5:0]  dout_g_ff0  ;

  32. reg    [5:0]  dout_g_ff1  ;

  33. reg    [4:0]  dout_b_ff0  ;

  34. reg    [4:0]  dout_b_ff1  ;

  35. reg           dout_vld_ff0;

  36. reg           dout_sop_ff0;

  37. reg           dout_eop_ff0;

  38. reg           dout_vld    ;

  39. reg           dout_sop    ;

  40. reg           dout_eop    ;




  41. assign din_r = din[15:11];

  42. assign din_g = din[10:5];

  43. assign din_b = din[4:0];


  44. ram_r u_ram_r(

  45.     .clock     (clk),

  46.     .address   ({1'b0,din_r}),

  47.     .q         (dout_r)

  48. );

  49. ram_g u_ram_g(

  50.     .clock     (clk),

  51.     .address   ({1'b0,din_g}),

  52.     .q         (dout_g)

  53. );

  54. ram_b u_ram_b(

  55.     .clock     (clk),

  56.     .address   ({1'b0,din_b}),

  57.     .q         (dout_b)

  58. );




  59. assign dout = {dout_r[4:0],dout_g[5:0],dout_b[4:0]};



  60. always  @(posedge clk or negedge rst_n)begin

  61.     if(rst_n==1'b0)begin

  62.         dout_vld_ff0 <= 0;

  63.         dout_vld     <= 0;

  64.         dout_sop_ff0 <= 0;

  65.         dout_sop     <= 0;

  66.         dout_eop_ff0 <= 0;

  67.         dout_eop     <= 0;

  68.     end

  69.     else begin

  70.         dout_vld     <= din_vld;

  71.         dout_sop     <= din_sop;

  72.         dout_eop     <= din_eop;

  73.     end

  74. end





  75. 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),有兴趣点击阅读。


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

分享到微博请遵守国家法律