明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 6160|回复: 0

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

[复制链接]
发表于 2019-12-27 11:56:07 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

作者:小黑同学
本文为明德扬原创文章,转载请注明出处!
本模块的功能是,接收输入的像素数据,进行伽马校正之后输出。
一、设计架构
1、架构图
下图为本模块的架构图。
image001_看图王.jpg
上图所示,输入的像素数据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,就是对应输入的像素数据伽马校正之后的数据。
2RAM
image003.png
上图为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。
  
表示的是一个像素点的值。其中,
  
[15:11]:表示像素中R的值。
  
[10: 5]:表示像素中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。
  
输入像素数据中的[15:11]表示像素中R的值。
din_g
中间信号
输入像素数据的G的值,位宽为6bit。
  
输入像素数据中的[10:5]表示像素中G的值。
din_b
中间信号
输入像素数据的B的值,位宽为5bit。
  
输入像素数据中的[4:0]表示像素中B的值。
dout_r
中间信号
输出像素数据的R的值,位宽为5bit。
  
输出像素数据中的[15:11]表示像素中R的值。
dout_g
中间信号
输出像素数据的G的值,位宽为6bit。
  
输出像素数据中的[10:5]表示像素中G的值。
dout_b
中间信号
输出像素数据的B的值,位宽为5bit。
  
输出像素数据中的[4:0]表示像素中B的值。

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



  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),有兴趣点击阅读。也欢迎加入群(838209674),及时获取最新的文章信息,个性化问题也可以找我哦:Q1817866119(N老师)。
加QQ:1744527324,获取更多FPGA资料!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号 )

GMT+8, 2024-11-22 18:19 , Processed in 0.058385 second(s), 24 queries .

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表