找回密码
 注册
关于网站域名变更的通知
查看: 500|回复: 1
打印 上一主题 下一主题

转——FPGA verilog实现中值滤波

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-18 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
转——FPGA verilog实现中值滤波

. G$ c+ [% \2 @/ x# W, s! ^# n1 U( [7 c6 _1 p
一、实现步骤:
. P4 w: g! K# ?
2 G' M: ~2 q% p3 J9 Z$ O/ M' m1.查看了中值滤波实现相关的网站和paper;0 A' j, y% W( h, B+ ~8 J

3 G; |' N- N% F$ J2.按照某篇paper的设计思想进行编程实现;8 j, x  Y1 r0 T" g8 a3 R5 v* ]5 U

6 C; r( ^+ Z7 y% x+ i- H& _3.对各个模块进行语法检查、波形仿真、时序设计、调试验证;, e; L& h8 L* y6 ]% U
* Z& z) ~; R$ m; C; a! G; P
4.与matlab的中值滤波结果进行比较。# x' S0 y8 A6 P& g/ m7 t4 k

# U( T# N8 R, R8 ^% f+ Z* k: R7 }0 S. e1 I
二、实现过程:- x% Y) K8 g; o1 W7 j9 m

  j- ^) U; c4 k. g1.查看了中值滤波实现相关的网站和paper;3 H- w# ?' H" C3 |8 J$ P0 d

( Y& }' n1 ?7 e在网上看了很多中值滤波的设计,也有一些代码可以下载,也有一片讲解的,只是感觉讲解的比较模糊而且不完整,最后看了几篇硕士论文,论文竟然主要做了中值滤波的工作,发现了一些设计思路,然后就按照自己的想法进行设计。
! u2 N0 T# \3 E& v
* w! J0 v3 U9 r, v2.按照某篇paper的设计思想进行编程实现;
: m9 E0 b" I4 E+ v1 ]- |9 H$ u
7 U' N4 p6 }  J1 e  f. l- g整个中值滤波模块分为几个小的模块:3*3窗口生成模块、计数器控制模块、3*3中值滤波模块、顶层模块以及最后的测试模块testbench的编写。" b& U$ B+ y8 D1 u4 |6 ?; e8 z

: j) g( B0 s0 _( C) y整个框架的设计如下图所示(使用visio画的框架图):6 ^5 o" U; B9 W8 y+ m) ^

+ _) V5 ]& E# P0 ?2 M* t! |7 L . ^  F: G; S8 f! p4 t/ J

. N# H$ o. L0 ^8 A各个模块的设计:
; t/ }# F  O  q2 u
  H, M: L) X" m# f& D1)ROM IP核的生成,用于存储原始灰度图像的数据。
5 W) L' K9 I$ J( e# }使用matlab生成.coe图像数据文件,然后使用Xilinx ISE工具将.coe文件添加到ROM核进行数据初始化,按步骤得到ROM模块,参考生成的.v文件在顶层模块直接调用即可。
0 E9 W9 N% J/ U
, Q: R. \, C# s6 B6 G0 Nrom_512by512 rom_512by512_inst
+ ~; F% S6 T& w  M  (5 _2 N- [2 I2 B- K. x8 U
    .clka(CLK),          //input clka;
2 z7 ]" D9 B7 j# L! a% x) U" k% T- m    .addra(rom_addr),   //input-from
0 ~) X( X2 L& V; ]+ }5 n    .douta(rom_data)     //output-to : C3 Z; q7 d  i4 k6 `+ N) S
  );
5 o  _& Q# v* ]# k% j# q5 ]2 T; S0 t2 x9 T

! _/ J+ e' L* v注意ROM的存储空间的大小;
3 L: k) e1 @7 |2 y
% b0 n& R  c- M3 y% p/ a2)3*3窗口生成模块,用于生成滤波的滑动窗口,得到窗口内的所有元素数据。
8 H- P- R$ n& w. |; ]8 Z+ E5 U$ w
功能:) [7 _+ w1 Z( A2 p. f# L: F

7 B1 ?! @  K, X# A; X9 _8 p+ o. G(1)根据中心像素点得到所在其所在的行、列位置;# B$ g! a  g, n) y) w
% D$ c" X! |: w/ `9 \
(2)根据该模块的开始信号设计得到获取数据的有效时间序列;
; d1 K% S& I& ?7 z% u, N  c
/ {' e7 S* t  p  p! h: R(3)在读取数据的有效时序内,得到窗口内的所有元素数据;; j1 K+ x& S" _

! B6 e" |% o4 y* ?$ L8 H6 u(4)窗口数据的获取按照一定的时序顺序来获得,类似于黑金推荐的“仿顺序操作”,这个比较适合my style;不过后来发现调试的过程中被项目组的硬件人员改动了一些,甚至说不好,感觉可能是本人还没有理解掌握吃透“仿顺序操作”的精髓吧。
4 ]: L1 c& n8 U# ]8 P  i! d% i
+ V1 y7 R! o" C, a& }7 \" o8 _- W(5)根据中心像素点的行、列位置信息得到每个窗口元素的ROM地址,根据某一时刻ROM地址,下一时刻调用ROM模块得到对应的元素数据,下一时刻将数据锁存,然后再读取该地址的数据;所以要注意地址和数据的获取不是在同一时刻,而是需要延迟两个时刻;: ~' E+ t9 k- x& P5 f( V
/ @7 v* I& r7 V  B2 N
(6)还需要注意的是图像的边界问题的特殊化处理;一般图像处理都会遇到边界问题,这个需要谨慎;
& o5 N! |* X7 G$ o8 b$ N& D& l2 k) Z+ H3 S6 o) z0 N$ e9 w
(7)对matlab的中值滤波函数medfilt2原理的深入掌握对我们编写这一模块非常重要。matlab并没有主要过程的代码,看注释默认情况下边界元素设置为0,这也可以通过结果反推回去发现的。5 o$ C" Y2 z2 s: j; S9 K" \

: y# C0 p! w# k! q0 g" E& r2 O/ u1 `timescale 1ns / 1ps, W2 P( P1 C( t  [# K
  2 //////////////////////////////////////////////////////////////////////////////////4 |9 F1 H3 G) V
  3 // Company: / {9 H9 d& e7 }9 S; G
  4 // Engineer:
7 a1 f  F) `- ?* c( E- `, r  5 //
4 _2 I  }4 ?+ p8 g: ?. w  6 // Create Date:    % j' ^0 A7 i5 J2 [
  7 // Design Name: 5 u$ @0 A! y4 b# @0 y5 @
  8 // Module Name:    win3by3_gen 7 j. W3 h: S  u: A1 X) V
  9 // Project Name: 3 n0 D' o! a2 I8 j$ E& n$ }- x
10 // Target Devices:
( a! e5 j; t. r' h& D11 // Tool versions:
8 T2 L1 J5 y  z3 y) Y12 // Description:   a, c! h+ k. w* m4 o) ?" ?
13 //
! |5 `6 D0 `1 ^. A* R14 // Dependencies: 0 t3 e: N0 ?+ Y* ]$ d; h( `+ Q
15 //5 R& s7 }2 i: i
16 // Revision: 6 K! J/ z2 Q0 M  Z. w* \) v; V
17 // Revision 0.01 - File Created
3 \3 r7 R7 H4 t& I18 // Additional Comments: : y8 b1 g- J8 m/ i
19 //
4 E8 [% S1 V' f2 ^& X# ]5 q20 //////////////////////////////////////////////////////////////////////////////////3 D. g4 l- y% x! k. S( |
21 module win3by3_gen(
" m- w: y1 f* r& |! ^9 t22   CLK, % d2 K( _8 t, _$ H2 G: a
23   RSTn,) K$ \6 m$ _8 t5 r# y! H
24   center_pix_sig,
7 I8 W. W/ H1 H* G5 E- J7 G  g25   cols,   // the column numbers of the input image
) x7 o( z$ y' X+ n26   rows,
3 I3 K0 |  _) }27   rom_data_win,   //input-from U1; 6 h6 V- i" G8 u9 x" ~. Q  x0 a! V
28   column_addr_sig,    //input-from U3; //output [9 : 0] addra; 0 I* X+ Y, X8 t7 p8 Z
29   row_addr_sig,         //input-from U3; //output [9 : 0] addra;
1 j- ]* e9 c2 J4 T6 r1 O! c30   rom_addr_sig,            //output-to U1;
+ S7 g3 B, i# z9 X9 ?7 N" \31   data_out0,           //output-to U4;
( H% `0 ?( j7 C8 U. j32   data_out1,: I- m6 Q, ~$ f/ ^5 `& h! V
33   data_out2,
2 J$ O: u5 c  r4 U5 z' C34   data_out3,
/ ~6 H' s# a8 U35   data_out4,
8 L( h. K0 Y6 {, ]/ n' ^1 M$ G* C36   data_out5," M. H- C( f1 G: M
37   data_out6,0 x  J1 w/ l: [
38   data_out7,) N, A' m+ D# {* `6 T8 N; q+ l* c
39   data_out8,& w. N  _6 e2 u
40   win_data_done_sig            //output-to U4/U3;complete the win data;$ ]+ A4 f0 B' Y; m- j
41     );0 G8 {/ s& o6 ~6 Z4 B
42 5 g' b9 Y3 j# i/ U; z4 K5 H
43   input CLK; 6 h' L8 {5 a; s$ |+ @; Q9 ?4 y2 k
44   input RSTn;% [$ m4 ?  O/ f  E" r* f
45   input [7:0] rom_data_win;! L3 H' Z8 c* {) @' K
46   input [9:0] cols;
+ @/ ?* t: ^8 l5 M  P% \: o6 R47   input [9:0] rows;
6 E: r$ d) m% p48   input center_pix_sig;  // # r2 n4 d6 j4 K* x3 ?6 \6 G
49   input [9:0] column_addr_sig;
6 u% O0 x2 Q! S3 V( @50   input [9:0] row_addr_sig;
) _& C2 S" h( n" L4 O0 J9 J' |51   
) c2 I/ @0 b! ^* U4 `, L52   output [7:0] data_out0;           //output-to U4;
. W  K5 A) d. k1 T# R8 F53   output [7:0] data_out1;! B0 n( i; W" Z7 D( H5 A6 @
54   output [7:0] data_out2;
: \1 }2 w  D9 L+ V' |55   output [7:0] data_out3;
; q4 n1 L; l1 h* a. Q* T5 G* \56   output [7:0] data_out4;/ u0 v" i. [2 F2 N
57   output [7:0] data_out5;
9 E3 B5 m( \) B3 y6 C, m1 V' k$ X58   output [7:0] data_out6;
) l' y* |: c6 n2 C# Y, q6 E59   output [7:0] data_out7;
! h' |# x, e4 f/ f3 ~2 f5 H60   output [7:0] data_out8;
. W: E; C0 [4 [# U9 [' o( @# M61   output [17:0] rom_addr_sig;4 J4 Y. C5 H2 E5 B: H+ R* X
62   output win_data_done_sig;
6 E, Z+ u5 x7 c  q. Y. ?63   7 y. A$ x0 Z- z
64 /******************************************************************************************************************************/ ; ?$ x$ _2 {- _
65   
3 Y9 |1 o' Z, t6 c66   reg [9:0] m;
  ^' W% R  `" J) x( [! _+ p- Q67   ; n6 ~, b) l6 B: e# x
68   always @ ( posedge CLK or negedge RSTn )% C: y  q# _6 G8 K2 g9 Z
69     if ( !RSTn )% P/ `$ ^* u* c$ x( w5 N" o
70        m <= 10'd1;
7 _. `5 a! y# Q1 R71      else if (  center_pix_sig )9 _9 V3 P7 Y0 t. t# N$ r7 S! ^9 k
72        m <= row_addr_sig[9:0];  : z9 P: L) u" T4 \6 y
73        2 J% W: l  p/ }. \/ b! _
74   /******************************************************************************************************************************/
1 b: |. ~3 N- M* u) I4 x: e75   # Z# f1 Z, j, d
76   reg [9:0] n;
5 |( N1 T/ c- Q' y/ e4 H  Q7 _$ N77   - w0 \: R8 ^  V
78   always @ ( posedge CLK or negedge RSTn )4 k) @  B# w" ]. m: g: J0 ]
79     if ( !RSTn )
% G; C% b9 m8 ?5 C80        n <= 10'd1;
# E* s% x& U# o5 F. L  o9 o81      else if (  center_pix_sig )# Y3 t; Z# q) ~- W1 [
82        n <= column_addr_sig[9:0];   
* r( [! {* f; M3 {: I83         
7 F/ y1 O; V6 M4 B$ |3 r84   /*****************************************************************************************************************************/ $ ?. R. P# B2 ~+ M- Q& d: N
85   ( Y5 R( `: R$ p6 E9 g
86   reg [3:0] i; ' ~9 R; S1 h" t( N. q( }
87   reg isWinDone;
9 D) R9 X2 q2 X88   reg [17:0] rom_addr;
/ C9 T3 N; o  o0 d  y' o& O89   reg [7:0] a11;% i5 T+ O3 t+ K& v8 t3 \4 c# G
90   reg [7:0] a12;
# F8 J$ T5 b' z- ?6 e6 X: X91   reg [7:0] a13;
# i# A, _5 L7 k0 W/ ]7 F1 ~92   reg [7:0] a21;
; k' q3 [% A0 f5 K5 n" C* w* R4 Q( t93   reg [7:0] a22;2 U; H" ?+ q% W
94   reg [7:0] a23;6 S' [+ s! x3 x- z% ^
95   reg [7:0] a31;
* x; w" s! t; A! ^96   reg [7:0] a32;
4 Y% w& y$ S2 _# G3 L; }97   reg [7:0] a33;
. g9 p; a! v. B$ A* V" t! g98      
; F; v9 a7 e% R' P, e99 /*****************************************************************************************************************************/
: @  C+ r: w# i. X' c* u100
- B+ F, @# i+ \6 c101 reg get_9point_vld;; G  V+ I! C+ t- M) a" h
102
8 c; p* ?5 P4 k- F4 b; w( x1 ?' W103 always @ ( posedge CLK or negedge RSTn )* I' n" M' g2 E0 S; q0 S' x7 J8 \% e
104     if (!RSTn)1 S4 z- J% a2 s) ^8 X% U( f3 G
105            get_9point_vld <= 1'b0;
, l( R9 S' s; |9 `106      else if ( center_pix_sig )  8 x# _* h: s/ S
107             get_9point_vld <= 1'b1;4 I2 I& N7 N# R8 s* b% ^" X
108      else if ( i==4'd10 )
$ p* y8 ~3 I( P/ m5 S* k3 b7 |109             get_9point_vld <= 1'b0;! M$ C2 b1 J) Y3 W1 ]/ x7 x1 j
110 7 `* @# ?) m- O7 t5 l5 z* {
111
  h: C3 Z! l, s112 always @ ( posedge CLK or negedge RSTn )
7 {' L' J/ m1 R+ Q$ L# s5 ~- j113     if ( !RSTn )$ }  a0 y  }8 u+ J
114            isWinDone <= 1'b0;6 Y( C3 T% |/ V3 |) D' M0 X8 X
115      else if ( i==4'd10 )  
) o1 f* G0 l" L) `116             isWinDone <= 1'b1;% O. M3 H$ {& J$ Q: {7 |, w
117      else - ~  K3 Q# M0 N3 m
118             isWinDone <= 1'b0;/ J. V- J! F* V; l0 q7 @2 {9 T& ~
119
, G9 d! O, H& X. _" V) K2 |120
+ h; {2 a, `1 j% I& v121
( X% P, y  J7 \* `* b, g0 v+ n122 always @ ( posedge CLK or negedge RSTn ): x* C5 H* }; W& O: W1 d
123     if ( !RSTn )% _. K+ v: V6 P5 D7 t$ b
124            i <= 4'd0;( P9 u, \' |) }2 R5 F/ y* O1 O* }2 U
125      else if (i == 4'd10)  
% `0 T9 s$ a5 X; Z3 `- P126             i <= 4'd0;5 W. x0 G% ]3 d8 c0 X; H
127      else if ( get_9point_vld )
& E* M4 h. o+ F% t: v. y9 _- L128             i <= i + 1'b1;  C# i, c1 S  f0 }/ r- D
129
- w. h8 C8 H, T5 M& z130
' [. u( b' X/ K5 Q131 3 T$ Q3 O2 g2 _  ~8 }, ^# w/ ^
132         # L- N0 @  V5 s# ^3 r
133 always @ ( posedge CLK or negedge RSTn )
0 |- Y5 `+ b* r& |; h- g( P134     if (!RSTn) . y5 {6 K( L7 i& L! j) I- H
135             rom_addr <= 0;
5 G0 j! ?: @4 d' `136      else if ( get_9point_vld)5 p% C/ U! T- p/ C. m. ?
137        case (i)+ V  d; R8 r& A3 j) W" E# X
138           4'd0:7 |  h. \+ S' D2 r
139             if(!(m==1 || n==1)) rom_addr <= (m-2)*cols + (n-1) -1;   
- B4 y( H4 B# y0 H% ]140           6 }3 C7 l9 s: q5 x0 D* @
141           4'd1:
% }( M  ?' J7 ]142           if(!(m==1 )) rom_addr <= (m-2)*cols + n -1; 7 l. X  O. |7 l7 \" p
143            
: m7 U$ Q- b. {/ X' P144           4'd2:5 K& j8 B( w/ |. ~, k
145             if(!(m==1 || n==cols)) rom_addr <= (m-2)*cols + (n+1) -1; ; i4 D3 m% i$ Q$ O; D
146           
" C6 m: {9 n/ [9 k147           4'd3:/ L$ K) d: w( J
148             if(!(n==1)) rom_addr <= (m-1)*cols + (n-1) -1;
, A' J: ^6 i6 y! ?8 L. n+ {6 `149           - I, G( G  m$ T' @3 A
150           4'd4:# U! y0 T) R3 B, q- e
151             rom_addr <= (m-1)*cols + n -1; $ ~1 \7 G$ `$ ?
152           $ I9 K% i  y6 F. M
153           4'd5:" W: H8 x- s) C* R, e) L
154             if(!(n==cols)) rom_addr <= (m-1)*cols + (n+1) -1;
7 o) Q6 N3 X& L2 U6 M" @' @* L% b155           
( V1 Y$ H$ q- m1 k2 W% L/ q156           4'd6:5 [3 u( M( j: d! R7 U3 K
157             if(!(m==cols || n==1)) rom_addr <= m*cols + (n-1) -1; , n# ~, V9 I* I& s$ x; W4 B3 U- M
158           8 l5 _# W9 a: E( A% W
159           4'd7:
9 a1 \0 L7 ]6 P$ h) r3 N160             if(!(m==cols)) rom_addr <= m*cols + n -1;
# R) R6 N1 X/ O161           
/ ^( n* {6 A. v# j9 a6 g: [162           4'd8:
( j( n3 X6 S4 o5 d1 j$ v* H163             if(!(m==cols || n==cols)) rom_addr <= m*cols + (n+1) -1; / E! p- |4 I# S7 }8 I% z# h1 y
164              
  g* d: a1 ^! |6 n165           default:;& s* A5 s; |- z) U( v1 |# L
166 5 i. C: O5 }1 M
167         endcase
, M& W1 h) J# {6 ^8 ]7 u168         
0 r, |- o& }6 V169 always @ ( posedge CLK or negedge RSTn )
3 L$ A) }) a- ~5 v170     if (!RSTn)
0 S  U. V  a  p5 ~171        begin& }# A, J/ j2 S4 H
172           a11 <= 0;
, l; Q. \9 O' N+ x173           a12 <= 0;
% w  A$ o( f; E" ^174           a13 <= 0; 0 @& a( z4 H5 i
175           a21 <= 0;
8 N- k/ m/ s+ k/ h176           a22 <= 0;
! y/ s: f, r( w8 z. C% W2 C177           a23 <= 0; ! ?$ b) f% o, c# F
178           a31 <= 0; 5 a, O. E; Y, c/ z( y
179           a32 <= 0;) {0 U+ e# K  B3 J6 L8 }
180           a33 <= 0;$ k2 y+ F2 ?' M% q2 x
181         end
+ |7 p( i( n# V! f; u182      else if ( get_9point_vld )& O& a$ Y7 F) M9 o* c) c/ r
183      " f& R2 b! w) }' D1 q
184        case (i)0 v& Y$ d" _7 V+ C: s
185   ! n( Z3 Q8 T% ?, C8 H( m
186           4'd2:2 i# i% v" |% _2 A$ |/ R
187           if ( m==1 || n==1 ) 9 U5 v2 q) s8 X* W2 c
188                 a11 <= 0;     9 z8 o, C* K: M* Z& |4 [+ J6 v% f) O3 T1 Y
189           else - t) S. |; ~4 h, x6 `; n  v* e
190                 a11 <= rom_data_win;      
  W  e9 x0 F: t6 a191           ( g3 g5 N  m( H: E( C" s% o
192           4'd3:
1 c, v. `+ M3 \: o* A" j$ m3 B193           if ( m==1 )  a12 <= 0;
* x1 S( K3 M4 q, E/ H* S1 Q194           else a12 <= rom_data_win;       - x4 t1 r) M, q: I" b
195           4 p* C  D1 J3 p
196           4'd4:, q0 j$ C& ]; x% j4 `
197           if ( m==1 || n==cols ) a13 <= 0;
4 J8 J/ a7 X  u198           else a13 <= rom_data_win;
. y% q$ {2 f  Q. {199           : b8 W, s- A: d  a
200           4'd5:# G' n+ }, }% h, e# R9 B
201           if ( n==1 ) a21 <= 0;
9 w) I  ]% N% W! ^; q2 [202           else  a21 <= rom_data_win; ! j2 _6 S( C1 }; {( L4 \
203           
" f  I# a: o0 G, y' ^9 Z/ a204           4'd6:
! V+ ]( r2 H: E1 m, d8 |! Z205           a22 <= rom_data_win;
* W. [. I4 G6 p/ H9 I; ^- t206                     
% j) p1 H2 i& ?207           4'd7:3 {# ^# I; b% U) o: a3 n
208           if ( n==cols ) a23 <= 0;
0 I: U+ L. K" E# z/ r& A; D+ y6 a1 D209           else a23 <= rom_data_win;
% R4 U$ N8 h# ?3 ?+ F9 K210           7 z7 i. x7 z, F* K
211           4'd8:
$ ]) R/ G6 E$ |! k3 f/ v212           if ( m==cols || n==1 ) a31 <= 0;
% s  x- ^0 q& `2 }) s5 f213           else a31 <= rom_data_win;  
. ^9 a+ k  p, P; I+ N1 W214           
/ R5 ]: R8 @1 Z3 X7 P/ ]' W215           4'd9:
' g+ c0 M  A! N8 B216           if ( m==cols ) a32 <= 0;, o$ ?! Q! V/ B
217           else a32 <= rom_data_win;
% P* e6 B# y! j# |* B218           , }) }% d& ~$ A7 D
219           4'd10:
2 o8 T. B4 I$ n) s) i" w; a220           if ( m==cols || n==cols ) a33 <= 0; ) b8 h% }" r5 o/ C9 y5 v
221           else a33 <= rom_data_win;  
" D$ x- f1 X* |  ?222           
5 p( b  ]( A5 y0 I# x8 v223           default:;; I3 T, h7 {; `( q! _: {+ e
224           
) z( d7 D( a& T225       endcase8 }: D& y1 k3 F: l, {' ?
226   0 @: F3 L3 A0 D: [  H9 S, U
227 /**********************************************************************************************/, N" L! M/ Y, g$ w  e
228   
6 H$ l, c8 w/ D' g229   assign win_data_done_sig = isWinDone;
5 Q+ G7 G9 ]+ j' m" ?% N1 u230   assign rom_addr_sig = rom_addr;. i* k+ [5 G) Z! N0 O
231   
) Y- i, D0 D; V# T3 [232   assign data_out0 = a11;" q# _) r+ E" h4 z7 D& L
233   assign data_out1 = a12;
( h9 t3 ]7 {8 T% ]234   assign data_out2 = a13;
" f! T& B8 \& Y5 d. ^. [235   assign data_out3 = a21;
* f: t" ]/ Y5 R1 ~236   assign data_out4 = a22;
% K* s# {# f1 Q. g1 |4 r237   assign data_out5 = a23;
4 B  l5 h2 T0 }% b1 }* d) I238   assign data_out6 = a31;* m5 Y/ F. b& P5 f
239   assign data_out7 = a32;
  O/ N; d$ _4 k5 S* g240   assign data_out8 = a33;9 ]# T6 ^8 \2 Y0 `0 h. w. p) b3 p
241   5 R- f9 y# }% @, M
242 /**********************************************************************************************/ - ^2 I! s+ K- n( ]( y  T1 I
243  * o8 l9 t( ?3 D: x% |6 u
244 endmodule
- h1 D9 F7 ?$ B- K7 j: o# {7 S0 v- Z  g) T  u) ~

) \: ^- O2 I. o# y1 @* v8 i( v3)计数器控制模块,主要用于获得中心像素点的地址信息。( d" \+ ~: ]+ T4 e
. u) D% o, h' X  Z  C3 ?8 n
(1)系统模块开始信号之后开始获取第一个中心像素点,注意初始化信号值和系统开始的信号值的区别;
+ r& V* _* F* ~" R. h$ h; c; Z+ W/ n( h
(2)该时刻得到的的数据将在下一个时刻产生结果,该时刻的数据并没有改变;
7 H' D% m0 d) M
$ ?, |& q$ U' t% `: I(3)注意中心像素点的行、列位置信息的计算;
+ U! h* h) _3 O# L( z6 u9 t
* e7 _  |# R. f. A: H' E% p9 R`timescale 1ns / 1ps
! ^( z( U3 o4 V0 f//////////////////////////////////////////////////////////////////////////////////
+ h* J! r9 q- L& Z2 L  B- l// Company:
! e$ ~8 I8 `" x" A5 C// Engineer:
" t$ A2 I; ]( H7 P: N& G' ~//
2 _9 l; z( _2 S" r; x( f2 b, J// Create Date:    # ]( U: |4 |+ p: [- a. k
// Design Name:
2 |* }5 b, z. D" H, R$ j& [5 b// Module Name:    counter_ctrl
0 ?' p3 ?8 J; T9 j// Project Name: 9 N3 t2 j" [& W' h) ~& v
// Target Devices:
6 G, D! j' V2 x// Tool versions: ' e4 e. f+ d# }  H: j. N. v% x
// Description:
' g8 w8 H* Y- n- R# f//
( l) j) @# D8 s: y( d) _// Dependencies:
" k& G  x% l5 H3 K2 @//, b. w: j" u' l/ L' X
// Revision:
$ K+ {0 N5 Z, C# G1 R  s// Revision 0.01 - File Created
  k8 ^# c. g$ Q// Additional Comments: ( ~( a; r  f! A2 g/ H, a- L. o5 m
//
! G' Q9 A5 P! q, f# K" Q. B  s" D8 n//////////////////////////////////////////////////////////////////////////////////9 _9 h" |) i$ [  v: D+ ~! x+ c
module counter_ctrl(0 |/ Y# M1 Q8 s6 a# p
  CLK,/ g. q5 ^* Y; n) [% u  s
  RSTn,1 p* Q- w0 V, W
  start_sig,  //input-from top
9 o5 p2 a# b4 z2 w( s4 F, G  nxt_pix_sig,     //input-from --start next center point pixel
' P( r. k3 H2 d' ?, C- n7 g, K* Y0 F  cols,                          
* K' }/ Y$ V5 e$ ^4 M/ f- H  column_addr_sig,  //output
- E5 \" z+ U( C0 x# E; a4 ~9 R  row_addr_sig,     //output-to . |" j- @8 Z6 s6 h  ?
  pix_done_sig   //output-to
& u. D0 V# l6 \* B    );
  _. W2 @. ]: D! M- o8 ^* S6 |# y5 t6 C% ?. x
  input CLK;
# k1 M$ F2 ]9 r- I8 y) m  input RSTn;" _" ?' C: e4 {# s, w
  input start_sig;
% P, E! B9 @! E  input nxt_pix_sig;
* G2 g* e- n1 Y% e! i' g  input [9:0] cols;
5 q; ]# @, h" G4 i8 ]2 @, ~  D6 |7 S) L8 z, o- H: M
  output pix_done_sig;  
1 m4 D; {" u  x4 H( ]! v3 a3 I  output [9:0] column_addr_sig;    3 J: E) v0 \% M1 `9 }
  output [9:0] row_addr_sig;   
+ D- q$ K) F! O$ b( |7 W- H, ~3 o* h
/***********************************************************************************************/
  V' A1 s5 Q* I* @% P" C! p' M  c+ o) d6 D- @
  reg isCtrlDone;1 w) k+ u8 w3 c! S
  //reg isWinStart;
% D- k+ [& z8 E  reg [17:0] imk;   //The k-th pixel of the image* T0 D5 H' A2 m) L
  reg [9:0] row_addr;  // The row of the centeral pixel3 A& Q$ W5 P- U+ ^2 D- p
  reg [9:0] column_addr;   // The column of the centeral pixel7 N4 B5 Z. f' |. i7 H* n
6 K; U, L1 C+ g; y$ T+ R" z5 v  J$ W1 @
  reg start_sig_d;: a6 a. I3 T& W2 ]2 j, Y1 \
7 K/ E! C) T7 _: t0 C  h
  wire start_sig_rising_vld;
1 v  a; f# p+ ^' g" m0 k" i8 c2 A/ G) x; {2 Y, z$ V! c5 x
   always @ (posedge CLK or negedge RSTn)   //Asynchronous reset  
- Z  Q  ^) ^. h6 e# T1 U    if (!RSTn)! A; F* @8 F9 v# {. t  h
        start_sig_d <= 0;
( L6 C9 u- ~8 G. l     else
" i, N  g, [* w8 T        start_sig_d <= start_sig;3 ~6 ~0 ?- j8 X3 ^, K8 U4 e
. Q7 x$ B1 {5 L7 ?" y+ J
  assign start_sig_rising_vld = start_sig & (~start_sig_d);$ |4 H* ?5 F2 \, ~3 [: {6 Q5 R# k) N

8 q+ f( t$ a0 c; h  always @ (posedge CLK or negedge RSTn)   //Asynchronous reset6 ~& d; A3 @. k* v" z
    if (!RSTn)
; |4 G, G3 U1 \( J! W; D1 i       begin  3 B/ R6 m6 r; |0 y+ M
        imk <= 18'b0; % N; \2 @# _! m" M: O+ p% L( k
        column_addr <= 10'b0; ! O) I' b, u& ~/ k- x" w$ p
        row_addr <= 10'b0;, i3 d+ m4 o% }4 h+ ~
        isCtrlDone <= 1'b0;   
* e& ?& M8 k+ s  K2 }' b" m; m8 l        end5 @1 u/ j1 r3 v6 b. p+ T( D+ S
     else if (start_sig_rising_vld)6 R* ]! r. d7 t. a: b
       begin  # K+ K0 ~& U/ E1 [3 d
        imk <= 18'b1;
$ B6 N# K3 A3 Y! H, Q# ~        column_addr <= 10'b1; 9 i' p3 _! p/ V! ^1 _
        row_addr <= 10'b1;. X6 D" ~+ _  S" A8 d' m
        isCtrlDone <= 1'b1;    - R; z& v3 i8 D3 n. ^5 C, ?* D  H! T
        end   
: @% `; E7 H+ H" R     else if ( nxt_pix_sig )6 U/ U9 F" e2 p0 T0 r- F
       begin  
" u8 w) D& s1 x  ~4 O          imk <= imk + 1'b1;
$ Q  x$ g) k+ {/ E5 C          row_addr <= imk / cols + 1;   
" R$ n! t* u/ x          column_addr <= imk % cols + 1;   
8 {9 a: i3 `+ p) q        isCtrlDone <= 1'b1; 2 k1 e7 U  R; \& z9 U' i
        end
" p* Z1 i( h" l! \# e3 I) [     else isCtrlDone <= 1'b0;    9 C; v* Z3 w* {( f
& d' e( p; _2 X) G" ~
/*****************************************************************************************/
* R* U- ~0 v: R! y( k
+ A+ N- p8 W- X+ Q1 z& C  assign row_addr_sig = row_addr;
; L0 w% @/ a2 R! G4 B  assign column_addr_sig = column_addr;
% K, s% n6 ~5 W# P  assign pix_done_sig = isCtrlDone;/ O5 h2 u  _+ f/ H$ S7 K, {' Z
5 t/ y' W. }# G: w8 ?
/*****************************************************************************************/
- z% Q8 j3 P" [6 sendmodule
$ E0 @* [/ h* l1 b- L- x0 U. J
! ^  b+ J; R+ I' D: e4) 3*3中值滤波模块4 l# u7 T( |9 E

  E  L. N6 @$ n) t) T5 `* S' N* |功能:得到某一中心像素点的3*3滑窗区域的灰度值的中值,作为中心像素点的值;
% b0 E/ T/ |5 v
: Z& t5 k( c: t- g中值滤波原理,网上有很多,大家可以查看一下。
+ D7 ]6 x; W0 k9 w$ z7 b- I3 _$ n2 b+ T- q
本项目采用的是快速中值滤波的方法。0 l# i; M0 Q3 ^1 w! m& m

/ u9 g+ h3 U( H9 F(1)若是3*3窗口生成模块完成之后就计算下一个中心像素点,需要将该中心像素点的窗口元素锁存起来,以防计算过程中将这些元素掩盖,不能正确进行中值滤波的计算;: A5 e" y% W5 ]- u, T
  r6 q& u; b8 R' h* J) R$ o' ]
always @ ( posedge CLK or negedge RSTn )& U1 O  g1 x9 ?( G; i% p3 A& d
    if (!RSTn)) t' j2 ~5 w8 b& A
      begin
3 S' {6 u. Y# s2 s8 b2 }            a11 <= 0;
7 I9 J# o2 r  C( ~6 x& M7 R/ ^" _            a12 <= 0;
1 j$ C9 w$ k. s$ b# Q5 s            a13 <= 0;
5 K! T1 L* T+ @5 d- d$ m* o. O            a21 <= 0;
/ U& k, H+ \8 v0 C            a22 <= 0;
: Y8 _! `$ a9 h' R4 T- u            a23 <= 0;6 A% G- \& U. D+ f; k
            a31 <= 0;
, |" f; {: o+ _& c            a32 <= 0;
, v, g% r; E0 p# ?            a33 <= 0;' ^$ x5 m6 _! p0 y# M" g
        end, j3 S% P6 N0 [+ R
     else if (win_data_sig)
5 k. t9 w( i1 F9 n       begin5 j1 U( s" F% u; N* K& k7 ^) A
            a11 <= data_in0;
5 C% e0 `, c3 Z0 _, E            a12 <= data_in1;
8 d+ F2 x2 E; _0 v) R) ?' `, k            a13 <= data_in2;. j- C6 j1 L7 m' ]. b+ J) N
            a21 <= data_in3;
% E: m8 j% i# Y+ m' P6 c, t8 F            a22 <= data_in4;
. Z" D" x! Y5 o) B; Z            a23 <= data_in5;
: E1 O+ G" T) S+ I& D            a31 <= data_in6;
5 A: `! q8 n$ J" O: A            a32 <= data_in7;
$ a5 z0 S/ G; F# O) ~9 m0 I- D5 d            a33 <= data_in8;
8 A1 B; S) m# V; [* T' m        end
$ W4 P- N' R+ q. W0 K) O5 i/ M  G. h3 B5 R7 V# l/ ~" C
! M& }8 H+ u* M2 `" S8 P
(2)需要在时序的有效区域内进行计算,怎么设计信号的有效性;, e& z& m& ?- \* g" S
% ]; B$ W. e6 @
  always @ ( posedge CLK or negedge RSTn )3 Q- z" t' e9 |/ d' ~7 J
    if (!RSTn)
9 @9 l9 P- J# G' |! G+ _2 d( H            cal_vld <= 1'b0;
: R* t! R9 p, K' L5 P* \% P     else if( win_data_sig ): ]& t2 L$ h" |( C( C
            cal_vld <= 1'b1;
1 C6 D6 V  W) A- {     else if( i==3'd3 )
) Y2 D" i! y7 M- Q2 P$ T            cal_vld <= 0;    / h- B0 @9 M6 X1 F) b8 s# x8 S

% U$ ]& R) ^$ s( q3 ?* [' |
2 h& \; Q- `6 Q(3)仿顺序操作可以分开进行;每一个时刻只进行一个操作,这样可能更明了(代码中没有这样做);/ O! p. T# F( U5 u
8 d/ R$ U% S5 [
always @ ( posedge CLK or negedge RSTn )
, J9 N5 F) C) l3 z9 P7 t. E! A    if (!RSTn)
0 m5 G. q2 I3 ?, @% A- T9 e            i <= 3'd0;( M& z: o* z( w; y4 D9 u6 l  f
     else if( cal_vld & ( i!=3 ) )
' h) G' \8 P3 {            i <= i + 1;! H! j  l$ [! o5 }; d' |) y2 J
     else
# N8 a: q4 Q2 D# A            i <= 0;
, ?4 S. w$ f6 n/ x* r7 s& k! ]2 Z$ @% @5 ^! O0 E
(4)verilog编程调用函数的方法,指出输入信号,函数内可以使用其他定义声明的信号,最后的输出信号作为调用函数的结果(突然想起来,如果输出信号有多个元素呢,又该怎么办呢?大家可以想想);7 A8 \( _- _: T6 W8 g' f

/ t% l; h! s7 c' F9 jfunction [7:0] max;//if the data is signed number, please add the char signed behind key function;
: |' ]7 J1 C4 a6 m  input [7:0] a, b, c;
1 R5 Q% n2 s+ \( q+ y  begin
) }. R7 U4 j' z8 ?  ^/ @    max = (((a >= b) ? a : b) >= c ) ?  ((a >= b) ? a : b) : c;
" {1 J! g  ^. A) F  end* r# X: u' x5 `6 S0 c6 y& w
endfunction
+ m, F. b( X) o
' U5 [: x1 N$ k* X: {该模块的代码:2 `3 Y0 Y3 \( _: G/ V! \" V+ F
`timescale 1ns / 1ps$ i5 @0 A: g/ N, Y( [
//////////////////////////////////////////////////////////////////////////////////
9 ?# s7 C4 i: _$ Y// Company: 8 R) k/ H. {! \% `/ u2 f4 s- J% H9 A
// Engineer:
, v, V5 H2 ?6 R) e/ ~- o  ]//
9 F! A. z- x& D% a& d// Create Date:    2 q5 z6 h  Y" T: Q+ C* I
// Design Name:
7 W! ]9 E; C3 y// Module Name:    medfilter3by3
4 P5 t6 a; e' w) I7 }8 l) V0 l$ @// Project Name:
' B8 R" z+ J! i- M8 q4 W$ ~" u/ N0 ?9 m// Target Devices:
8 x. v' V/ _  m" ?* N1 ~! G// Tool versions: ( a$ D2 r/ ]( n3 N+ k" t
// Description: 9 k1 ^3 z7 i/ c
//
4 f0 O- ^# J$ ?$ B7 T( w* x* Q// Dependencies: ( u" J+ s+ U2 K+ g
//
! s8 `- d- p) w( p5 Z// Revision:
6 f7 t# b0 I0 C+ P8 R/ i// Revision 0.01 - File Created
7 k6 p/ j; Z) y( t4 \7 f( G% i+ r// Additional Comments: ) p0 K  k& x$ ]. _& Y
//
# |" {. U5 m4 Q0 N//////////////////////////////////////////////////////////////////////////////////
7 L6 v2 J0 \% Hmodule medfilter3by3(: N3 {7 M: ^$ D  D
  CLK,
8 R9 Y/ M2 A+ t$ j7 f" K. f  RSTn,
& ?5 O5 P$ U' Z  win_data_sig,  //input-from module of win3by3_gen; 8 v' H2 D: ^" w/ }3 ~
  medfilt_done_sig,   //output-to top;$ u8 \" ~5 R' I  j! E7 b6 }
  data_in0,        //input-from module of win3by3_gen;" {1 K  z8 j2 ~. W& V4 l
  data_in1,
( x/ v7 X9 r. b* V& [' }' W3 p  data_in2,% K9 E6 L0 x- x0 {+ Q( `5 ^# \
  data_in3,
3 T/ J: q1 B1 U- N. p  data_in4,* r2 p  U4 S# |/ i
  data_in5,
' a% B" ^; S+ x2 F  data_in6,- g# ?. v& s6 G5 f
  data_in7,4 t4 p  G( `0 k- u  ~1 p0 s8 E
  data_in8,3 _# X0 P& p% X2 r+ l3 Q
  medfilt_data_out    //output-to top; ' K- P) }, r/ A8 m) l! L
    );
/ @+ @% V0 n1 d- W5 B; C7 [0 [- E* G! }& [9 c
  input CLK;- U" \3 p2 W4 d0 @4 p! \, |0 l
  input RSTn;
6 V4 R3 o6 @/ O! v  input win_data_sig;
9 W8 o' c! S! g1 u& d  input [7:0] data_in0;           //output-to ;
5 j7 e0 B1 U6 S5 i5 v0 ^. B  input [7:0] data_in1;
( O0 e5 X. e& @& b/ x1 S  input [7:0] data_in2;$ J( M* X) V% H0 x" j8 Y4 R7 h$ D
  input [7:0] data_in3;
. K. b' T6 w  Q: k  input [7:0] data_in4;4 Q: n$ k- q% U/ N0 I, A" ]8 N9 J
  input [7:0] data_in5;% V" g( r. W1 F  ]2 m( _
  input [7:0] data_in6;$ W4 }% L6 M5 e4 z
  input [7:0] data_in7;
8 Q3 U( t* _& ?4 e  input [7:0] data_in8;9 U9 u' @+ `% N5 b8 u2 |7 {

) Y( f( z* ?, e  output medfilt_done_sig;
2 s/ ]3 S* Z! {& ^  output [7:0] medfilt_data_out;
# l6 H* x# d/ Z$ o" X* x, X" W! O' y4 K9 e6 U; q1 K% h
/******************************************************************************/ + o" D8 P5 O8 i4 e2 O  M0 g3 `3 V0 G
  reg [7:0] a11;
4 j" S. y+ }) Y7 F, H( p  reg [7:0] a12;
7 C8 q( g# g9 Y  reg [7:0] a13;  X4 J+ I% v0 o+ F% @
  reg [7:0] a21;' _8 G9 a4 q; H! Y, L; c. p5 V* `
  reg [7:0] a22;# v  u$ q. @0 P+ p
  reg [7:0] a23;
- v; S8 b* ^+ B6 R+ C  reg [7:0] a31;0 p* E7 `2 K% q& I: N
  reg [7:0] a32;) f. d, C1 w9 Q& @+ V$ ?1 g- ~" o
  reg [7:0] a33;: T3 n5 x4 A$ \% U/ V, W

* o: }& C2 t" Y: L. p  reg [7:0] b11;9 J, X2 u7 ]5 x
  reg [7:0] b12;8 n& a9 L  S1 W/ I0 U0 C8 v) D
  reg [7:0] b13;' w( H6 g- I4 |4 I+ O
  reg [7:0] b21;! o( ~! C2 e, Q5 X
  reg [7:0] b22;" n, [! p, Y$ G! ^/ f; R/ C9 M' f
  reg [7:0] b23;
2 O* p' J: y) \  reg [7:0] b31;; _9 ?8 ]* M$ M  T  f
  reg [7:0] b32;' b" p7 n/ C7 U: o" ~8 z
  reg [7:0] b33;& W! p! S. x3 x$ s0 Z% g7 t/ I

9 b8 i' M& N/ T! H) S  reg [7:0] c11;
( c1 [! A' j  N9 w  reg [7:0] c12;8 T" a5 w8 P" O% w% w0 D
  reg [7:0] c13;. Z. y6 c# W  j
  reg [7:0] c21;
+ C3 j0 I. B- X  reg [7:0] c22;' a3 a1 |8 _' h6 j4 ]+ R* n
  reg [7:0] c23;2 A9 U$ X% z. C8 U$ G1 ^
  reg [7:0] c31;) O: i. [- W0 {% Y
  reg [7:0] c32;
8 L; m  x( [0 e/ O  reg [7:0] c33;' v) w3 G9 h" x2 @5 \

9 A3 I; f4 w2 t& T9 j* d  reg [2:0] i;
) @' |! o5 i" J9 D  reg [7:0] medfilt_data;% F# n* q4 \/ h
  reg filt_done;
$ ?$ F" v/ v2 l2 v$ {. y2 g+ D2 N4 X0 M( ?3 z
  reg cal_vld;
+ c$ m" I# z% u. V6 z- F/ ^* F) u1 I+ E( N

( J8 z. ^: g/ ]0 n' J; l2 }) Balways @ ( posedge CLK or negedge RSTn )
3 E5 _/ |8 B% n    if (!RSTn)
4 ]& d+ E8 ^$ N" {( D5 g      begin( p$ `* b* J. K& _5 J
            a11 <= 0;
' D7 ^, P5 f" r/ G! D( j& m- I            a12 <= 0;
& v  n3 C3 ]0 U6 S3 l            a13 <= 0;
- f! J+ D+ Y, g* r            a21 <= 0;8 y. ^1 P& i5 P1 h
            a22 <= 0;4 |2 o$ H! H1 o) X4 f
            a23 <= 0;- `5 e2 v1 {0 y! @; Z0 r
            a31 <= 0;  U: Z9 X0 u$ Z4 o( O
            a32 <= 0;
  f) {& v( k% _; z" N1 n8 W            a33 <= 0;# K4 a8 L/ }4 I" x/ I$ ~# ~
        end
% L0 a% }& q; V1 o7 ~4 B  X     else if (win_data_sig)$ P& E' @" M# l' ~( K/ o& I
       begin
% X% K& g+ ?" ?# H, f            a11 <= data_in0;# o( c& O: |9 R, x" x6 s. [
            a12 <= data_in1;
, T9 n' `# {$ [1 o3 [, ^            a13 <= data_in2;
# t+ Y8 H' o# }/ j            a21 <= data_in3;( `  K3 \4 o$ U# ~2 h/ K
            a22 <= data_in4;) B+ d7 l! R6 c' S3 R
            a23 <= data_in5;
- a: }$ e4 {! S            a31 <= data_in6;/ ]! N7 _+ D- \/ K/ }/ e4 x, L
            a32 <= data_in7;$ q) ~' G: v, k& @) T
            a33 <= data_in8;
9 v, z/ Q5 L# ?" R9 \) J3 u        end  r$ P0 a8 X' x' ?: T
# V" k/ B3 ^: D1 W- _
  always @ ( posedge CLK or negedge RSTn )
0 E/ R# y" q+ `  M  W    if (!RSTn)7 d+ r+ O8 D( A% [' e( m
            i <= 3'd0;
* w- f( Y, r' \* l# G     else if( cal_vld & ( i!=3 ) )4 Y4 m! G0 n  g) U8 Q1 r
            i <= i + 1;5 Y, O$ ^2 m* \
     else
5 V8 O( b+ n( T, Q            i <= 0;
& [; r; `$ r. u* h& ]
3 n$ C1 a/ E# B7 R! |- M- r: J* v" r6 d  always @ ( posedge CLK or negedge RSTn )
! E, c' N/ A) X' L9 A    if (!RSTn)
0 Y3 X% [6 R) d+ ?            cal_vld <= 1'b0;
5 y) i7 u, g, r     else if( win_data_sig )0 x, Z% v1 i2 f* y
            cal_vld <= 1'b1;
3 ^0 g" Z7 u$ B. \+ ^     else if( i==3'd3 )
8 k  F* i* v4 @8 O            cal_vld <= 0;            5 j: Y  u; \9 l4 D
4 {- k  y; O8 T* E8 [2 R- P

2 T# S$ P, o! @- h+ `6 n  always @ ( posedge CLK or negedge RSTn )
  w3 X( ], q! |5 P( a6 c0 ]    if (!RSTn)
  ^( m+ E8 @: y  r       begin: T+ n) K; U- @$ _
        filt_done <= 1'b0;8 A- P' `$ l: W2 I+ s4 y
        b11 <= 0;
% E/ A- s6 m8 ?. ~4 z6 I        b12 <= 0;' L! _9 v4 M9 C7 C
        b13 <= 0;
  _- c4 H! W" [' D        b21 <= 0;- S2 S9 V% G, r. E5 t
        b22 <= 0;
+ e+ C; R% S* |5 ~7 e, e        b23 <= 0;: O$ ^7 e  I9 Z9 X3 S6 T0 f. A0 b
        b31 <= 0;' b7 ]; j# D, v$ O
        b32 <= 0;
" X( A% i) j+ h1 Y        b33 <= 0;1 K8 F! a$ J5 A7 a7 k
        c11 <= 0;- I) S' a0 h3 L% Z5 R2 O
        c12 <= 0;* T7 _* f7 [' t
        c13 <= 0;
( }! Q, e1 c2 T( X) C        c21 <= 0;
- a8 L' L3 ^3 J+ L- T! L2 O7 u( i, n        c22 <= 0;
+ Y7 i" r( \8 Q4 q$ l3 `  f        c23 <= 0;
6 J  G0 A' C1 K$ a7 r, U        c31 <= 0;
* n7 \3 ]" F2 v/ A, G3 B. ?- D9 b# D        c32 <= 0;+ q% p2 ^3 o2 \1 b$ z. o) S
        c33 <= 0;' n( d2 u5 ^7 I( l# U& `5 Q
        medfilt_data <= 0;
* `3 R$ h0 n5 a5 B0 |9 N        end, B. c' D. J( t  b: n- N
     else if( cal_vld )
1 g0 R7 l8 n) ~  I: O, x; [       case(i)3 l7 ?/ ]8 O( J# Q$ O  N% o5 Q
          3'd0:/ H: H! T* w+ _6 [
            begin
, }4 `, C0 U6 {             b11 <= max(a11, a21, a31); ; s* ?) ]5 v7 I, L% R
             b12 <= max(a12, a22, a32);
; j  _9 f6 k! h2 t* |             b13 <= max(a13, a23, a33);
! u2 V) C2 Y- f& Y             b21 <= med(a11, a21, a31);
( r' |2 w5 }4 g  A) q             b22 <= med(a12, a22, a32);
5 h; p2 H) s# \3 }' m, q4 h. E* W             b23 <= med(a13, a23, a33);
0 X4 o0 c& f- X& [% x             b31 <= min(a11, a21, a31); 9 L# g0 U; C  z: D
             b32 <= min(a12, a22, a32); 6 C# E2 e7 x; Y0 }4 V) C
             b33 <= min(a13, a23, a33);0 T' L! U+ H6 n: G" U; \# H: F% Z! S7 J/ `
            end
3 D7 Y/ v# ^  G7 M
" b* I4 ]4 {  r          3'd1:
( Y; @) {# H% m2 U8 H            begin
+ ]' w9 F( v& y& L& u             c31 <= max(b31, b32, b33);
1 A1 b' B! T( d# ^' R, }* j             c22 <= med(b21, b22, b23);
; ^. ]/ X9 ^9 x$ K7 i2 G             c13 <= min(b11, b12, b13); , G! U# ?* Z' r5 ]9 X4 \
             end; k0 D3 i' E/ N! k
8 ?& X2 n  ?, f& Q
          3'd2:4 R" B/ r% B% `9 F1 k
             begin% k% P4 h. s2 H5 V" S; M$ y5 |
             medfilt_data <= med(c13, c22, c31);
3 E8 r2 I0 O7 ]' |& A' z/ t1 h             filt_done<=1'b1;/ d. O1 {: n% v& j) t
             end  O3 {# o! }5 F* U
1 q1 _2 k9 t4 k# Y
          3'd3:
5 a2 ~3 H! \5 h- f, Q( H9 m3 C             filt_done <= 1'b0;
* w, ]2 a5 q' k$ ?1 t+ w. j* t9 R6 f  e) B7 H
            default:;
, n8 H  z. _' G# P  C3 v$ W' h5 K! _, r6 C: @+ b; z/ Q
        endcase8 l; I) }3 g" j* y
$ ?' u; o' M, ~
/************************************************************************************/ ) ^( H2 F3 {0 z; Y  m* A+ P1 V4 Y
6 X' q( m6 y! z# g" c* d+ L
function [7:0] max;//if the data is signed number, please add the char signed behind key function; " r% ~" |% n1 `/ _- X
  input [7:0] a, b, c;
( w7 _8 l+ `+ z$ s( s) D3 s  begin% g- ~2 A9 e7 L& L8 J5 E8 b
    max = (((a >= b) ? a : b) >= c ) ?  ((a >= b) ? a : b) : c;" {2 i0 s; B4 u! q7 K
  end4 K- w3 ?6 B! t8 W& y
endfunction
4 R( W) K( W" W0 {
& J7 b0 `9 S8 X! Efunction [7:0] med;
3 ^: K& a  b4 e& [" ^  input [7:0] a, b, c;; I3 |- n, S! |/ r, ^& h8 a) l
  begin
$ X9 U( H! N2 R     med = a < b ? (b < c ? b : a < c ? c : a) : (b > c ? b : a > c ? c : a);1 a8 ~$ l2 d7 H& O! J
  end
) l6 p8 A; l' S* r0 d( y8 z9 xendfunction
4 m4 I! z; @1 m5 ^5 x9 i2 J$ C  p. |+ F! M) G* `6 i
function [7:0] min;
' s: {! w1 M3 j* v2 X0 z0 k  input [7:0] a, b, c;
  d/ K0 s; r6 |+ r  e1 Z. d  begin. \* m# W; K% _+ @5 D
     min= (((a <= b) ? a : b) <= c ) ?  ((a <= b) ? a : b) : c;
3 \" W6 l8 p& {  end6 u7 |" Q0 `0 A' s
endfunction/ w" \  @  [& Z; b) e( ?: d
! h- z2 L. d1 e) d6 ]4 F+ C$ j
/************************************************************************************/ - l- A. m: a- ~% w- E8 c1 ~
! h8 [# v/ k- ~( P3 t# }. a
  assign medfilt_data_out = medfilt_data;
! ~( e% n/ v1 D7 s' @1 }; b  assign medfilt_done_sig = filt_done;
+ V6 }. O1 j! R/ V. ~" s9 @  m: e" H: H
/**********************************************************************************/
2 K- X0 h% Y2 A" {/ [, y3 f2 N5 {: ]' L7 L
endmodule
6 b9 u: Z  \6 G
1 s! N$ g: z. N7 Q7 @4 u5)顶层模块,用于将低层的各个功能/控制模块衔接起来,得到结果;5 c: E) w1 a/ {4 O0 ^

) `/ r4 `3 b9 O" R7 f" E' e9 L注意输入输出信号,以及不同模块之间是如何进行连线的。
* \4 @$ b  l) J" l) s7 C$ }! t5 d+ X- M$ z# x8 c& l3 k
信号的名称尽量有其特别的意义,不要重复使用同一个信号名称,容易造成混乱;" J& r7 K# w& O. ?$ I$ k

/ {" M+ Z+ B, j% _6 h# M区别wire和reg类型数据的使用情况;
6 C7 T0 d* k) O% p) l
- c$ U9 E/ ?) Z$ C6 n3 V`timescale 1ns / 1ps
* h+ I3 M: t, z! r% \" ~  h//////////////////////////////////////////////////////////////////////////////////& x5 A% S5 j- a( g. O' Q
// Company:
. A9 u* i7 R) N  Q* n. C// Engineer: ' ~& m* Z5 d5 Z/ r$ e- m6 o
// 7 m% N7 _( \' S
// Create Date:    ' d+ L4 c3 A+ S4 Z- _! k
// Design Name: 0 \8 g+ W! g5 z/ L2 Q+ q6 q5 e0 c1 G3 ?
// Module Name:    medfilter2 ; M" X) M# Y7 R; X7 i8 t
// Project Name: + T5 b( _" g2 O) n8 I
// Target Devices:
& M% g4 r* j6 [+ o6 n' D' z// Tool versions: 1 u+ g; \2 E, d
// Description:
3 ~0 t; B* }! ]8 T0 H* I$ W//, p! N) v' {# W- G8 g# M9 O
// Dependencies: # P, I7 y# f% C, a0 ]9 V
//; r: k  B. y8 M8 R& r  Q2 y
// Revision: # w, p" a9 Q1 W4 a" |
// Revision 0.01 - File Created; F* {. F$ ]9 F$ G! F2 t
// Additional Comments:
2 L7 H  n6 T( d$ V1 I$ T1 V4 p- W% ^2 c+ `//
; F7 K  y6 y; s# F" Y: \//////////////////////////////////////////////////////////////////////////////////
8 Z7 i! z8 E: x. G/ c% P& g" V; [- p6 n- y& [3 f+ V! w
module medfilter2  : a  \* D- o4 R, m
(3 r) V. B( K! f8 X. Z
  CLK,   V+ k, g: ], ]) Z. q8 B4 j7 E
  RSTn,) w5 i5 T- b% v1 s# a* J0 L, |5 `
  Start_sig,
7 U# `6 d% g! m9 k! z  Done_sig,3 J) Y) \) o$ ]3 X) Z- e+ @
  Data_out
2 ^* ]! B. D6 W, l);
- D* B$ B7 S4 \9 M& g; p6 E7 x& B$ l0 ?5 J8 X; X( |2 p
  input CLK;: }4 J/ u) V! f5 k0 T. A
  input RSTn;
0 ?" ^4 f, M$ k# d; \  input Start_sig;
/ T' r! C3 }6 O) I! t$ @  output Done_sig;: G! t! q7 }7 u. A9 H9 D3 p
  output [7:0] Data_out;
1 _9 A2 f% r% A  m5 m- C& u% k" W9 [. x* U; C  M* h6 F+ P# m
  /********************************************************************/
6 Q! a# q0 D: T$ l$ w8 a! u6 P# v# J
  wire [17:0] rom_addr; //
& f0 X0 ]0 X! q. F# j  wire [7:0] rom_data;  //
. Y# m$ q5 x; k$ f+ h! W
. z3 o' {3 P8 _  rom_512by512 rom_512by512_inst! q2 N* U# w1 n" J
  (
# R  O3 J/ \- z$ N  c; W    .clka(CLK),          //input clka;
; g) S! c) ^1 ^0 T) ^9 m    .addra(rom_addr),   //input-from;
% N* l; A! ~0 g' K8 I6 H, C% K    .douta(rom_data)     //output-to ;
% Y! G! D& d# y% {! i  );9 C6 N0 b5 E4 U2 h
8 L& I0 B% \4 r/ X8 n" x) ~3 C
  /******************************************************************************/
' ^9 q) D% s% V4 F% I5 d7 }; v6 Q% d
  //wire [7:0] win_data[8:0];
/ i( t$ S; y9 P  wire [7:0] data_out0;           //output-to ;
8 C1 m" W' P, O; h: U. [$ X/ v  wire [7:0] data_out1;9 B3 v2 m' U2 D8 @! H8 M7 ]
  wire [7:0] data_out2;
& P5 p1 q6 w& w# ~: V7 |  wire [7:0] data_out3;% a' Q$ n" Q  F9 b
  wire [7:0] data_out4;# p+ d/ F" p* D. b) q- i. D1 J& Z
  wire [7:0] data_out5;
2 e; p* R8 O! F0 `9 k  wire [7:0] data_out6;! Y, |2 j5 ^% c: C; c
  wire [7:0] data_out7;! y3 V& q$ v+ W6 U* ^
  wire [7:0] data_out8;3 d. s: n! _$ {! n$ z- r3 l6 D
  wire win_done_sig;% ?  F6 Q& G: a, k

# C/ q) |& F% O3 Y0 ?1 Zwire [9:0] column_addr_sig;
( d. H" P" [' d# K6 vwire [9:0] row_addr_sig;9 V* P$ ^* Z8 Z- Q9 t( q3 c! a+ j
$ g  _) I7 q! \9 J7 w$ Z# N
  win3by3_gen win3by3_gen_inst (
) c6 M7 K. T, S; U  .CLK(CLK), 7 b7 z4 L& O* S' K5 R
  .RSTn(RSTn),4 |5 F& o; ]9 E+ b0 f
  .center_pix_sig(win_start_sig), //input-from ; 6 m- b# U9 A9 O: g+ x& p3 u
  .cols(10'd512),   // the column numbers of the input image
% @. ?8 u' I. O" h  .rows(10'd512),   // the row numbers of the input image
) M2 ?/ k  G3 r& H, G  .rom_data_win(rom_data),    //input-from ;
6 A1 q8 R2 j4 D3 _. d  i! @  .column_addr_sig(column_addr_sig),    //input-from ; //output [9 : 0] addra; ( F: U* H( J, ~# O3 o
  .row_addr_sig(row_addr_sig),         //input-from ; //output [9 : 0] addra;
7 l8 I8 z% v) C/ h2 q' u  .rom_addr_sig(rom_addr),   //output-to ;
6 }2 K$ J1 ^% f! p2 g* L6 v  .data_out0(data_out0),           //output-to ;
. E& n3 ^& V1 {3 \- ]- Z. R( Z( G  .data_out1(data_out1),
6 v  D* H7 h5 @& K  .data_out2(data_out2),1 p8 [8 N3 ^5 {$ ?
  .data_out3(data_out3),! `0 P  b3 w8 Y) F
  .data_out4(data_out4),4 i7 T! m( X# S% x
  .data_out5(data_out5),
! }  `* P9 Y2 d. m( D# t  .data_out6(data_out6),
. A. C, S; ?6 m; q/ T0 E  .data_out7(data_out7),
6 t% \; l9 n: L; @  .data_out8(data_out8),# k# z; {' Q# G4 m% a! ]
  .win_data_done_sig(win_done_sig)  //output-to U4/U3; 8 w8 D& u9 R1 `$ B: `
    );
; c6 W' E* \. X/ ^' r8 U9 F# _$ X
" }# Q& h# Y' I  /******************************************************************************/ # }6 U( f5 f% [, j3 [4 ?* D% t
& G( t8 w2 F  T& {2 a7 u
  counter_ctrl counter_ctrl_inst(- I" ^" C# _* p5 l
  .CLK(CLK),& [) [+ Y! a" _5 H8 F7 G
  .RSTn(RSTn),% s& R) k- ?! i5 R: ?* g: z
  .start_sig(Start_sig),  //input-from top
; f6 f* b" p2 n$ a6 v5 K2 p0 e  .nxt_pix_sig(win_done_sig),  //input-from 8 h4 G# S: l# y
  .cols(10'd512), 9 E5 V6 K  j4 y1 \5 R
  .column_addr_sig(column_addr_sig),  //output-to
/ c& K2 c: V) f) ~  .row_addr_sig(row_addr_sig),     //output-to
+ D$ ^1 [# r, P2 t9 J: `3 L  .pix_done_sig(win_start_sig)   //output-to    4 t1 w6 ?4 V  O4 d
  );
* B2 G% W% t  E$ P: R5 k
& m* a# q5 a" {6 {! F/*****************************************************************************/5 [# i. y, B, s! y

  w* W6 Y8 A3 R# Y# D9 Wwire medfilt_done_sig;
2 |/ @2 v  o0 d  n' B$ Fwire [7:0] medfilt_data_wire;) ?  @0 ]' L! ?' D# z

# I, X' O9 V$ t+ q& tmedfilter3by3 medfilter3by3_inst
6 J3 t6 ]3 K) \* t8 S4 @  }. m0 l(* ?5 Y% T" v. H% R* h# [
  .CLK(CLK),
9 G1 f! ~5 {; q+ r  .RSTn(RSTn),
/ ?. M# A4 }. W  .win_data_sig(win_done_sig),  //input-from; ! y! i# \4 B6 b6 U3 K
  .medfilt_done_sig(medfilt_done_sig), //output-to;' g, d! A0 L1 ~2 b
  .data_in0(data_out0),        //input-from ;
$ i; b0 m: T3 X5 J5 J  .data_in1(data_out1),# ~8 [, E3 H+ ~+ v) U. Q
  .data_in2(data_out2),' l  R; Y; i! _
  .data_in3(data_out3),' d4 T; y- O& V* e; t
  .data_in4(data_out4),
+ S* p, ^4 _% U  .data_in5(data_out5),
, {/ j; v5 }. Y$ }  .data_in6(data_out6),2 P/ N$ y, J0 N+ R/ ~3 p$ y  ~
  .data_in7(data_out7),
- `. h' J+ ?8 z( W0 K  .data_in8(data_out8),) H7 |$ J; F1 T+ E) \
  .medfilt_data_out(medfilt_data_wire)     //output-to top; 3 P1 S* [- I1 F' q8 @
); , X  X$ R0 Q  _; \

5 M5 |1 M0 t2 g+ F  r6 E# J9 J; O8 K/*********************************************************************/
9 j4 X, y- F( S: Y9 z2 i7 z4 Awire Done_sig;
4 \- d- @5 u2 [1 _6 H. V6 ~wire [7:0] Data_out;
- w- d4 m3 P' Dassign Done_sig = medfilt_done_sig;
- T+ G: d# G7 N* u9 Z2 f/ W5 Nassign Data_out = medfilt_data_wire;% N, [1 ], H  N1 U; D

1 K9 p7 O, q; E* E5 {/**********************************************************************/
+ c9 o# D' T; {- E0 ~3 [endmodule
0 N5 M0 y6 @; a7 Q# p9 W2 X- m$ p' i6 j
6)测试模块
0 C1 f4 }) O1 J; i; w8 E% i" [: \0 m2 L
如何将数据写入文件,需要定义文件的名称和类型;
9 F9 e2 h. n$ z6 [) F+ p2 k( u1 v& z1 C0 i  Z2 v% K- z, C7 J
integer fouti;
4 u/ Y2 j( A( G& n
6 l2 t* W) l/ e8 B. D需要在初始化部分打开文件:
6 t* V" s! A1 a; j7 ?) U$ f, g" u
1 U3 Q: c3 t2 d: w1 t$ O6 ?fouti = $fopen("medfilter2_re.txt");9 F$ G  n7 s3 X2 ]& F) q* s4 q

, i' V4 i- Q/ i0 G! m3 ^4 D代码如下:( M5 c& ^7 Q2 G+ b. q, b8 A

! d7 z6 Z/ c- U6 i5 I' s1 U# r`timescale 1ns / 1ps. m/ F! B: r) m
( |0 A7 j! n, t9 F
////////////////////////////////////////////////////////////////////////////////
! J7 c+ H  F  }+ c// Company:
% ^( {2 Z" D: f7 s* X// Engineer:
9 _$ o; [" G$ }! k, K//
, B+ b" ~' N" F& t! e// Create Date: $ _. F( K6 }  d/ ~2 K8 R5 c( Y, b
// Design Name:   medfilter2
  @; L5 |3 P% y% [/ F. f+ }// Module Name:   E:/stereo_match_pro/stereo_match_FPGA0518/medfilter_tb.v
, E! f. t- \6 z' d// Project Name:  stereo_match_FPGA0518, S  V) J: h8 b% i  [
// Target Device:  
2 I, ]- ~8 H; S  ^' q+ d// Tool versions:  . `4 R7 c6 ]$ @2 i+ {( P& m
// Description: 1 \- J, U; E( x+ e( C" X8 @
//" [2 ~/ c+ E# e9 J1 q
// Verilog Test Fixture created by ISE for module: medfilter2% S6 j% ~3 @! |0 _
//5 e# H& p, e) ]) |
// Dependencies:
9 j8 E2 |6 g3 y/ u' v// - B1 @; |* {3 y; |! s
// Revision:! p+ ]  b' `4 c- e6 m. I6 X
// Revision 0.01 - File Created* i2 N- @/ e0 S2 b- `
// Additional Comments:
4 X; _( @( c6 E// . V5 C: Q% T5 z$ B# c
////////////////////////////////////////////////////////////////////////////////
3 F. s; k3 q$ K2 D8 E. V5 \+ D  k8 ~. K" p% ^
module medfilter_tb;
2 }) s5 W1 {5 h4 G7 r3 F  K
9 ]2 i& {( x- w5 o: P0 o# h* u    // Inputs
" D/ M( G. H9 P5 A( E# z    reg CLK;
& N' [6 u1 ]; Y/ I* z. }( ?5 f0 s5 J    reg RSTn;
, f3 s3 s# v: r# ^1 J3 V0 c% u9 @6 g    reg Start_sig;
5 k, @5 b! |( V4 J/ N- u    reg [18:0] pix_cnt;   //512*512=262144=100,0000,0000,0000,0000( G" L1 \8 {. d- }* y1 f7 U
# C8 b" }: ?$ v: H8 g
0 r1 F$ c! ?0 \5 F% b5 n
    // Outputs1 m1 N. Y! u, S8 G! X. H4 u
    wire Done_sig;
5 g* r' i  B. O' A% Q3 M    wire [7:0] Data_out;
! q' s$ y, m* j4 g' G- A    integer fouti;
* R6 r" V, k0 Q0 V+ y  [
* A3 @) Q: o2 l# e) Q) ~- Y8 O) q% j' @/ `6 ^4 c; h
    // Instantiate the Unit Under Test (UUT)2 e0 X; u( X" @) D! `8 p$ X
    medfilter2 uut (
6 `" g) c0 C! D8 J% k5 h5 u        .CLK(CLK),
1 R" E$ E7 L. F6 ~7 d( p5 _        .RSTn(RSTn), * z$ s9 E1 O/ O
        .Start_sig(Start_sig),
2 b% O/ x; U" ]) p+ }0 S. x( G        .Done_sig(Done_sig), 9 J! u: R# ^* x1 j& T! g& d
        .Data_out(Data_out)
/ Q3 j3 F. h; Y5 u/ D5 Y: v: _; V    );
) V- `7 r5 w3 m  o( h) P* I3 W
* }$ q$ E- e% v! Y- s' h    //assign Data_out = 0;
& S9 F% h5 Y) C. S9 c9 S0 w   //assign Done_sig = 0;
' s% N. \5 W" ]* n; Z8 |
* w1 \' _" |4 x! _6 f    initial begin% S; h; I9 ?' q, h% s) ~
        // Initialize Inputs
! U9 t+ O* z2 V" t9 d        CLK = 0;
( ]) u# n# y) d/ B- L        RSTn = 1;
( k; N( N# a. N% r  z; @        Start_sig = 0;
2 h" N6 T0 F/ Q; e1 i4 F
' H7 T% F2 ?; b$ `! F9 e8 ?5 V        fouti = $fopen("medfilter2_re.txt");
" {( n7 \$ g+ V) x, q
. C# b. L0 t/ x/ {0 i        // Wait 100 ns for global reset to finish, |" v# X) m' O" m; T" b; x& l
        #100;   // To reset the system
; K  H+ H% h) E        // Add stimulus here
# O/ x9 n1 E- w) Y8 }  M3 P5 a        RSTn = 0;
4 x7 Q1 Z, M) L9 V0 v9 }. @  w        Start_sig = 1;
  Q( A  o% M. W& |: c7 ]" F        pix_cnt = 0;* b9 W4 s* m( _" X

6 w! ?$ S, h4 w& w) |8 z* o        #100;   // To start the system; p7 F9 i7 p$ r  L' @* {
        // Add stimulus here
' R; S# |+ n- U6 W        RSTn = 1;
, `3 q0 s9 N; p: A        pix_cnt = 1;
, z: T0 l3 }: M9 ?; a. u, D1 l$ C' _. e  l
    end8 s& D- ^4 y3 D; _+ `+ u- }7 o

' ^& i: u7 E7 K; X; O, q, A    always #10 CLK = ~CLK;
/ m( I6 e# z% g% f7 H0 E" Q3 [: b
    always@(posedge CLK)
7 C+ @) d3 c" E( r    begin$ n2 e( R8 f! w, o, I& q
        if(Done_sig)
  E$ [2 G  n! i0 p$ U9 A           pix_cnt <= pix_cnt + 1;9 J" `* z( v. M' S* r
    end2 ]( Q, r! m) \

3 j4 a/ G  u+ _9 J    always@(posedge CLK)/ F: W7 s& M9 m9 c' n3 I% Y3 E
    begin* V2 x# v+ m" J' r7 ^9 O7 ?5 Q
        if(pix_cnt == 19'd262145)2 d8 {1 {, ^% M$ `+ q5 P# y
           begin - }, U( @5 {) x$ w) U0 @+ H
              Start_sig <= 0; 5 |- M2 v* v* v7 k& ~; }* {
              $display("Image Medfilter Completed!\n");
$ y2 v+ j- }: ?* J1 H3 I              $display(</span><span style="color: #800000;">"</span><span style="color: #800000;">The all time is %d \n</span><span style="color: #800000;">"</span>,$time);
; U4 D5 B. `/ Q4 `' K! o              $stop;  D" R" N: o% F) \) x8 g
            end% p4 b2 N  ]6 J
    end
. {5 P* p( d. T7 V5 Y/ q# [( J7 t) q- Q; f  z- g6 P7 Z

+ a5 A( o# a) t/ q& @6 U+ G; f$ b3 n) _" W; T+ {7 U4 @. ~
    always@(posedge CLK)1 i( a2 |3 l% z/ a
    begin% u, S5 i: O, a! e- Y
        if(Done_sig), o- Z. V- j+ e# c7 B( ]
            begin
9 n/ l0 V! ^. {! f  H! g              $fwrite(fouti, "%d", Data_out, "\n");
( s* q: `: r0 z/ @              $display("%d",pix_cnt);+ ?. ~. L0 t1 O2 H' Z
            end
; t! q, {! q0 u9 R7 V    end
+ b/ R" T# S8 H3 }2 b7 o* |* V. D$ b) I/ b
endmodule
/ f5 H7 u7 a6 f: f; j0 b  m" A% V3 Z& F4 w7 ]8 c
整体的代码就是这样的。
$ u# P$ p2 _  K2 J9 F0 R7 c
& V# q7 f7 M- _# n2 g3.对各个模块进行语法检查、波形仿真、时序设计、调试验证;
- i' B* k  Q; \+ ?2 {2 F
( ~- V9 D: C9 \, t9 D. y本人觉得原理清楚之后按部就班的编写代码还好,只是刚接触波形仿真和调试的时候是真心不顺心,还好有同事帮忙调试;在调试的过程中其实会学习到很多东西,很多经验,以及很简单的但你之前就是不知道的知识,这就是一个实践的过程,有时候你根本不知道错误在哪里,这怎么会是错误的呢,为什么不可以这样写,我觉得这样写才是正确的,这些就是在调试过程中本人的真实心情写照呀。可是,没有那么多为什么,verilog就是这样编程的,只是你不知道而已!这才是最伤人的,因为你不知道!0 ]- j1 e; r5 c( c3 H, R

; x7 O  Z  P( {5 c+ a  E: y+ x, b   仿真调试的过程中遇到的问题以及解决方法有空专门写一篇,调试的过程中最好是一个一个模块的测试,特别是关键信号的数值,最好搞懂整体模块和各个模块的时序设计过程,推荐使用TimeDesigner进行波形的设计;另外还需要有关联的两个甚至多个不同模块信号的交叉仿真验证。" [+ L% i  ]; ]: c6 |# Q# N2 g

  t) f8 n3 f% p4.与matlab的中值滤波结果进行比较
" `' J* s* u( g9 q5 r
) R, q3 E% e  r7 a  S' x使用matlab编程基于自带的中值滤波函数得到处理之后的图像与数据,并将verilog得到的滤波数据转换为图像,将二者进行比较。$ [/ D. s, w* E

6 I/ f7 G3 J9 b/ j/ o( o! C7 s7 Z使用matlab自带的中值滤波函数medfilt2生成原图像的灰度图像的滤波数据;
; c8 t6 n& n0 P
" ?) l7 A& Y, u8 `4 u4 ]% mcode to median filter for one jpg image, and create a image data file$ Y" \4 K0 W' W2 Z8 }* T7 O  T
src = imread('lena.jpg');
) F8 }& F* ]+ f, C" _' B9 e' k( O' sgray = rgb2gray(src);( q- S6 |; e( ^6 Y( }; [

9 D# H8 D% {) A7 ]8 w1 amedfilt2im = medfilt2( gray );
1 s, R6 f7 _, L[m, n] = size( medfilt2im );                  % m行 n列
0 t9 e: f: v( |( c9 m; F( i' ]2 V+ C3 Q- P  {2 `3 a
N = m*n;                               %%数据的长度,即存储器深度。
# C, S) {. Q4 Oword_len = 8;                          %%每个单元的占据的位数,需自己设定
# b& }( A/ \: Q3 Ylena_gray = reshape(gray', 1, N);% 1行N列
0 |4 |5 V/ n0 m7 `1 s+ mlena_medfilt = reshape(medfilt2im', 1, N);% 1行N列* T$ i: P" H6 k9 J% Q) j: v& V# W
$ v8 Q& H! w) L
fid_gray=fopen('lena_gray.txt', 'wt');       %打开文件
& }2 S, }* s3 {, w( ffid_medfilt=fopen('lena_medfilt.txt', 'wt');       %打开文件
- x3 m% b' k2 g6 J3 |% fprintf(fid, 'MEMORY_INITIALIZATION_RADIX=16;\n');8 f" g* m7 @0 E7 {. W0 \4 z
% fprintf(fid, 'MEMORY_INITIALIZATION_VECTOR=\n');
4 X9 Y0 C: T8 K# l* h5 n) u) M8 g* h8 z% b, ]* M* @

5 a. n1 j0 g" A2 d  V+ yfor i = 1 : N-1! N- X6 }. x" P& h$ a9 H: `
    fprintf(fid_gray, '%d,\n', lena_gray(i));%使用%x表示十六进制数
7 B" e. m6 X0 C! rend' s  a, P6 m5 ^
fprintf(fid_gray, '%d;\n', data(N));                 %%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
% Q& l: }/ ]/ ffclose(fid_gray);                            %%关闭文件- P5 h. j: C* h4 C! ^. U
  ?8 C5 |& D( z
for i = 1 : N-1) @) i( W9 K5 {  ]
    fprintf(fid_medfilt, '%d,\n', lena_medfilt(i));%使用%x表示十六进制数4 \# F( U. G4 B, }
end# p2 p1 c/ ]( N
fprintf(fid_medfilt, '%d;\n', lena_medfilt(N));                 %%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
5 q: i# A. t& u! y6 g: ^7 mfclose(fid_medfilt);                            %%关闭文件0 J( o& L" ^9 @5 m3 H3 s

+ ]( y; B* ?; D/ v7 c# D3 d+ D将medfilt2函数和verilog产生的滤波数据转换为图像,并与matlab直接产生的滤波图像进行对比,代码如下:4 u/ q+ l! V2 y: j2 d
  r# m2 r% s9 m0 _1 ]( }
% code to create image data from txt file. y! ]0 j. C5 p' U  A/ ]" `- g5 m
clc;
& p4 R  f0 |8 C& w' L% Z( tclear all;* s+ A' F! @- E9 w
close all;8 t" m7 ?9 r) B4 i$ t
I_rgb = imread('lena.jpg');
  x1 A$ O1 s& ?subplot(2, 3, 1), imshow(I_rgb), title('lena-rgb')
4 i, V: U& i6 T4 B$ t, `0 I3 V1 _( l3 T) y' O( Q9 \/ W$ s
I_gray = rgb2gray(I_rgb);  Z  E" L- h8 ~' p7 O7 t
subplot(2, 3, 2), imshow(I_gray), title('lena-gray')
7 v' n, t% x9 Z8 ?6 f
2 \0 s6 }% C8 G  T  imedfilt_m_load = load('.\lena_medfilt.txt');: ~/ N# {3 d- L/ G9 c, N# }1 T
%medfilt_m_load = load('.\lena.coe');  G  X6 C% i- y2 P; {' z6 _
medfilt_v_load = load('.\medfilter2_reV1.txt'); % verilog 产生的中值滤波之后数据
  }& q- ?8 h" m) P- l! T  D8 y
% B& l% v7 E9 q. g' O' t4 hmedfilt2im = medfilt2( I_gray );5 R, P. ~8 {; F$ o
subplot(2, 3, 3), imshow(medfilt2im), title('lena-medfilt2')( H: \# l- E1 N6 e" g
9 }9 B* Z: }3 d0 [  e" k' _
m = 512;
3 K1 D8 w+ m5 C' _n = 512;5 y  Q4 S0 D. `4 r$ A
medfilt_m = reshape(medfilt_m_load, m, n);) G/ I* D8 A4 Z/ k
medfilt_v = reshape(medfilt_v_load, m, n);
+ x6 p. O) B' s, J3 bmedfilt_m = uint8(medfilt_m');; d% V) n: Q8 T: D
medfilt_v = uint8(medfilt_v');
) ^/ P  Q0 S' s' T- P* i( n% R  ^5 Z8 V# ^: U+ r9 K
aa = medfilt2im - medfilt_m;: |" d4 m6 V0 |) j  @
bb = medfilt2im - medfilt_v;: f/ p% @: B* N; J# H" Y
cc = medfilt_m - medfilt_v;) B6 I1 E4 B& Y; q7 c: m% N
4 a( k3 u$ S8 [5 O9 M: t
subplot(2, 3, 5), imshow(medfilt_m), title('medfilt-matlab');
7 f& E9 N, I: qsubplot(2, 3, 6), imshow(medfilt_v), title('medfilt-verilog');
' q! A/ h# c% Y: e; r2 U; X! V  v5 t9 |6 E) P) T, u- I9 f) |
显示的结果如下图所示:
4 o- i8 D, G% J/ [" y5 H& Q# k3 N
, P, K# }4 A0 h. _6 a' I2 d: ?9 k+ z5 T1 x8 ?" ?( X
结果:两种滤波产生的图像数据完全一致,不过感觉函数直接产生的图像颜色更深一些,不知道为什么。( _! G9 v/ g: L

4 T- L( X7 ]$ f$ ]. |这里需要了解一下medfilt2这个函数的原理。结果数据表明,默认情况下该函数对图像边界采用的是补0的方法进行处理的。6 c; X# T" f7 N- b3 U2 [7 Q! D$ q' j
' L& h" l( L- f2 ?2 c
结论
! l& ?- T, t0 X5 L* L- N9 F) o
- l1 H8 h" q2 u7 V$ }$ k$ V中值滤波终于告一段落了!简单的问题还是需要深入进去研究的,实践的过程中你才会发现自己之前了解的东西是多么的浅薄,对已知的知识掌握的是多么的流于表面!
- Y% q, u$ C8 h; H) e- n
8 R- z, m) h. Y0 U0 g0 _) R  T7 e2 q( c最后结果的数据还是很让人开心的!1 h' d  E, c9 |/ M9 f9 t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 16:19 , Processed in 0.203125 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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