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

转——FPGA verilog实现中值滤波

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

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

0 }9 Z3 h* s) x' Z& X4 `# E% w4 g  x, T% S0 O8 U/ S2 z
一、实现步骤:& c! c7 p* [3 i$ w
: K9 a, G, c3 X& C+ X* ^
1.查看了中值滤波实现相关的网站和paper;
5 B) p) K* w  a# q
& m/ ]9 P. P' `; x* H, Z2.按照某篇paper的设计思想进行编程实现;
; ^  K) P+ T# s, P, o$ Y2 s
: j# i1 V7 j" a, m, u" l; G- a7 g3.对各个模块进行语法检查、波形仿真、时序设计、调试验证;0 q2 Z( Z1 g: R, ?  T, U6 S6 n
/ t: _: R. h! g: h$ h  B
4.与matlab的中值滤波结果进行比较。
: b) v# ]9 B. S! g# ~: @  n) @" s& `  q! L
, h2 B) L/ [: b8 H
2 V5 Y! }3 v+ J" l9 t* E7 B- N$ D二、实现过程:
6 x( }% d8 p" O4 s- T8 s; v
4 E+ ?% y3 }5 f5 ^- f1.查看了中值滤波实现相关的网站和paper;
4 h0 k7 J, L- A$ {9 l) Y- r2 X5 w1 n" E& l: }' R
在网上看了很多中值滤波的设计,也有一些代码可以下载,也有一片讲解的,只是感觉讲解的比较模糊而且不完整,最后看了几篇硕士论文,论文竟然主要做了中值滤波的工作,发现了一些设计思路,然后就按照自己的想法进行设计。
) m  ?5 I3 ^+ Q% o% l; [% r) i
  E7 F9 g# j5 j* n0 @; T2.按照某篇paper的设计思想进行编程实现;
9 y& \" e2 T$ Z7 k/ n6 |
2 Q# q* x; A7 V/ O" w) y6 a5 g整个中值滤波模块分为几个小的模块:3*3窗口生成模块、计数器控制模块、3*3中值滤波模块、顶层模块以及最后的测试模块testbench的编写。
1 f% t) w" T0 [1 D" d$ {4 E5 e. S5 A' c5 m6 F6 z
整个框架的设计如下图所示(使用visio画的框架图):6 ]& X7 z6 I# S% F" |$ `

- E5 n( Q+ O" t# v* ]# ~0 N
9 a/ {3 r" K' H3 G2 g
$ W9 G% C8 x6 x. A3 l$ j3 z6 X各个模块的设计:
) G$ _8 h7 u$ W+ d, [
; ]8 d$ [9 |& P9 S1)ROM IP核的生成,用于存储原始灰度图像的数据。
" G8 K0 _% j- q- y9 I9 A使用matlab生成.coe图像数据文件,然后使用Xilinx ISE工具将.coe文件添加到ROM核进行数据初始化,按步骤得到ROM模块,参考生成的.v文件在顶层模块直接调用即可。
% X8 X+ V& i/ P0 e3 f" ?+ w, f) }* D. b7 l2 ^2 f
rom_512by512 rom_512by512_inst$ W/ c* ?1 }/ M1 _
  (
9 C3 L9 ~  s7 l- k! F! u( q; L    .clka(CLK),          //input clka;
' u2 T; p; Z; E    .addra(rom_addr),   //input-from
5 J0 Y% l( V2 l6 S- ]    .douta(rom_data)     //output-to
/ x  ~! \) j% O+ r9 @  );
8 G6 P# q8 G  x( Z8 J
/ l$ V4 [5 Q$ b: L: C
5 p7 H( T% p, o" R+ z注意ROM的存储空间的大小;: S- M4 m. H. p5 K7 _1 y( h
  j8 Q3 {* k; L# E# N& R: P- J
2)3*3窗口生成模块,用于生成滤波的滑动窗口,得到窗口内的所有元素数据。
: z- Z/ G* t+ y; ~. d! g% b
# `  w- Y1 E- k5 c4 s4 e. x  K功能:0 h: ^2 b  z6 K) L8 B8 R. m- b

' I; g& k* V% O/ Y3 w(1)根据中心像素点得到所在其所在的行、列位置;
$ p7 D. c5 E* p' o; J; y1 E( w) A* `7 h# n% n
(2)根据该模块的开始信号设计得到获取数据的有效时间序列;& z8 \9 Z) o. ^8 u/ G# L' w

: d2 t" m. [, h9 o' g& z" q; Y(3)在读取数据的有效时序内,得到窗口内的所有元素数据;
# O/ `% W2 L& h# p. R6 _( _  o! h3 S: S1 M' G
(4)窗口数据的获取按照一定的时序顺序来获得,类似于黑金推荐的“仿顺序操作”,这个比较适合my style;不过后来发现调试的过程中被项目组的硬件人员改动了一些,甚至说不好,感觉可能是本人还没有理解掌握吃透“仿顺序操作”的精髓吧。
; o1 _% X5 b" u. T: J' N' `$ b7 {$ _' Z8 V+ ^- ^& ]; b
(5)根据中心像素点的行、列位置信息得到每个窗口元素的ROM地址,根据某一时刻ROM地址,下一时刻调用ROM模块得到对应的元素数据,下一时刻将数据锁存,然后再读取该地址的数据;所以要注意地址和数据的获取不是在同一时刻,而是需要延迟两个时刻;
7 g9 V$ x3 o' N% D2 R5 C# J. F, Y0 _  B# q$ Y- a1 P$ H
(6)还需要注意的是图像的边界问题的特殊化处理;一般图像处理都会遇到边界问题,这个需要谨慎;( K+ f: }/ N4 W$ t
8 s5 w* X* Y& T8 V! k
(7)对matlab的中值滤波函数medfilt2原理的深入掌握对我们编写这一模块非常重要。matlab并没有主要过程的代码,看注释默认情况下边界元素设置为0,这也可以通过结果反推回去发现的。( P" j* W7 r# k! P

0 `9 d3 j( M! R4 a$ e4 ?1 r1 `timescale 1ns / 1ps% o9 y4 n5 }% }
  2 //////////////////////////////////////////////////////////////////////////////////
4 U6 @# s5 e1 e8 d  3 // Company: 4 S2 v% ^$ a  `! r" {0 m
  4 // Engineer: 4 H: R( D5 E! r5 Y
  5 //
$ \, `' b" o( K7 E! S5 A  6 // Create Date:    , C! m) p/ c9 z
  7 // Design Name: : H( M1 h( b' V& E8 P- [3 u( h
  8 // Module Name:    win3by3_gen
3 N6 ^- F+ z- {) W1 j4 S% E  9 // Project Name:
% m/ T1 C3 }2 x+ I- l( d9 W0 e  c10 // Target Devices:
6 d% v( a, h# s0 Y0 G0 s; \' p11 // Tool versions:
  M* V' u( A3 |" z/ b6 j4 O12 // Description:
  P6 J3 U8 m, ~# e& }13 //, i8 j. Q4 W/ [0 ?
14 // Dependencies: * b- a& W% W, l
15 //; c9 d( c$ O* P) A' `0 H* \
16 // Revision: : Z" x: e# K  Z
17 // Revision 0.01 - File Created
% }) e7 k7 Z1 A) ^; ]+ e2 F% j18 // Additional Comments: + @* ?$ N0 q; [" F; ]( b
19 //' [# S* H5 k- K) T4 {1 e- F% L
20 //////////////////////////////////////////////////////////////////////////////////
* h  P2 ]. J7 ~. m; E# ]' v3 _21 module win3by3_gen(2 M  K1 K6 I$ I+ {- I6 ^  h) f1 N/ W
22   CLK, / S4 i8 ^8 _! |9 i  B+ C
23   RSTn,
" ^+ t# Y" n& o24   center_pix_sig,
: O) f9 h6 [9 e- m" j: ]& V+ {  p25   cols,   // the column numbers of the input image
0 n) G. t5 U. {7 F; K; j7 l26   rows,7 h  s" H/ k) r8 Y; d
27   rom_data_win,   //input-from U1;
' o- j; h+ ?! q1 |. j1 Y+ Z, L28   column_addr_sig,    //input-from U3; //output [9 : 0] addra; & N6 Q1 ?+ \9 A+ O' w( C' s) N$ g
29   row_addr_sig,         //input-from U3; //output [9 : 0] addra;
. s& B. X9 W! ~: k) A8 o6 h30   rom_addr_sig,            //output-to U1;
2 l6 r9 ?, _0 a$ r  |: D4 x31   data_out0,           //output-to U4;2 M9 \5 _/ m; J6 S' O0 T  _( n; @
32   data_out1,) J  g5 @' I, _9 J5 e0 Y
33   data_out2,
5 Z7 v! K. ^$ L6 O- h* r34   data_out3,
- k" D7 T3 `& {/ B. O* e35   data_out4,
4 b7 C+ q8 |- R# O" P4 K+ g' N% M# d36   data_out5,
; a5 L0 |; ?9 d. c6 x37   data_out6,
: x2 @6 w: o; u0 M/ F8 }38   data_out7,5 t6 I( u8 I2 E2 h3 v7 l/ s
39   data_out8,
. X0 M3 X: N' L9 ?) K2 C40   win_data_done_sig            //output-to U4/U3;complete the win data;0 B# ]3 `+ C5 g6 r' N9 @
41     );' F. n6 m4 A- _2 M/ k, Q
42
) }1 o9 `+ H& J43   input CLK;
; L3 h0 g1 a' g; Q- e& m! C% q# n44   input RSTn;  U. E; E/ j1 Y* |
45   input [7:0] rom_data_win;
) g4 _0 s# v7 u3 {' P( C3 M) [5 u46   input [9:0] cols;$ s5 Z& b) Z0 d
47   input [9:0] rows;6 T6 s+ w" S" a0 S
48   input center_pix_sig;  // - f. }6 W5 o8 l/ N( M8 V
49   input [9:0] column_addr_sig;
. O6 m, |" o8 B* f" h50   input [9:0] row_addr_sig;7 K0 a/ ~. ^) c8 |  ?
51   % p2 W3 W& q" L% r" B5 f
52   output [7:0] data_out0;           //output-to U4;; O% R1 {2 T$ V1 |3 r8 m1 u' s1 K$ M
53   output [7:0] data_out1;
7 v! B# K4 q* M) M/ b1 n7 x, T- c  R54   output [7:0] data_out2;
8 h7 n* y- x) x% }9 n: F55   output [7:0] data_out3;7 n0 ?9 L& g7 I3 U
56   output [7:0] data_out4;/ z5 J; N3 p9 w7 E4 c% f, g
57   output [7:0] data_out5;
& _6 S: _) l! \# s9 ]- M58   output [7:0] data_out6;
4 A6 U! J# @* E8 A" t) c! n/ l59   output [7:0] data_out7;
* m3 B' ]% b9 g8 U8 b) i60   output [7:0] data_out8;! C4 p1 V4 \3 v  c0 X) N
61   output [17:0] rom_addr_sig;
" H1 p% y8 b; a4 t& j62   output win_data_done_sig;$ c; X* i! d+ m9 d7 g+ w
63   # B! Z' ?( }  }+ y( q) G! h
64 /******************************************************************************************************************************/ 9 A/ y: ]1 D/ I$ A: Q* L) U' [' W  l
65   
* Y4 \6 s; D0 I8 A; j' C# L66   reg [9:0] m;
* U8 N# l; y' e9 x8 Y/ H+ O67   ! L( K$ }) T- H$ d2 ]2 |0 |
68   always @ ( posedge CLK or negedge RSTn )- D5 [; \) v& l4 g6 K1 ?1 T6 z  {
69     if ( !RSTn )! G. |. W! _+ Z& d$ d
70        m <= 10'd1;! _% z: e/ W3 j+ ^  Y9 w" Z+ G
71      else if (  center_pix_sig )
2 }" }) J% a: X8 L+ Y  U+ w72        m <= row_addr_sig[9:0];  
  \0 H* `$ `  ^. t73        
6 }9 s( [2 I8 W! @74   /******************************************************************************************************************************/ 4 g: l' d$ ~; w3 S: F. v) w" d
75   " {+ ^( p/ A0 V$ W5 |: _6 A
76   reg [9:0] n;3 U2 J. m" M0 C+ S: n$ ]6 e
77     e  c, S8 h5 ]
78   always @ ( posedge CLK or negedge RSTn )
! m3 ]7 ]9 Y* K; C" C79     if ( !RSTn )
4 J7 H; G) L2 y7 e& g% d4 c5 s80        n <= 10'd1;7 i" A  V0 W: P
81      else if (  center_pix_sig )8 U1 V5 a1 v2 f; Z4 }- K( [
82        n <= column_addr_sig[9:0];   
/ O4 D3 E/ I* h83         
; \3 y7 ~+ J: D& Y! s  C/ p84   /*****************************************************************************************************************************/ $ n! y- C- v" I2 n
85   
( W5 h: U4 Q% F' U# M# q86   reg [3:0] i; + X3 f4 `% O. j9 h4 w
87   reg isWinDone;
' J& l9 D5 {, b. M88   reg [17:0] rom_addr;
% |; m& N9 v9 `! W! B89   reg [7:0] a11;
8 S$ c  ]' {: q% B2 ^' k90   reg [7:0] a12;
/ r) ~* n& i9 M8 |91   reg [7:0] a13;% W( \# {/ q: g. F% q  M
92   reg [7:0] a21;3 k+ L$ H$ i' I
93   reg [7:0] a22;' [( V! |* H6 C
94   reg [7:0] a23;( i" X9 S$ s* ]' d, p3 c& W6 E$ @
95   reg [7:0] a31;2 }0 O+ f- _" b8 ~9 H
96   reg [7:0] a32;' ~1 i% A  k+ X7 \
97   reg [7:0] a33;
9 Q( c8 H$ ?0 J98      
' e* F0 u& u; `. B2 F99 /*****************************************************************************************************************************/
: d6 o" U- v# i- p' {- C, [100 . _& f+ }$ |$ N/ t- ^
101 reg get_9point_vld;
: P% }& p9 {7 j) R7 \( R102
& B, ^) n3 R+ Z- Y103 always @ ( posedge CLK or negedge RSTn )
- ^$ T: {$ g7 C0 X: w. X5 q104     if (!RSTn)  \) ^' D0 ~! g5 s1 ^5 ]. G
105            get_9point_vld <= 1'b0;
5 R: P) z5 u: J( G+ I9 S/ G5 U106      else if ( center_pix_sig )  
* b- g" V) b! U# O. g, _107             get_9point_vld <= 1'b1;( b/ b3 Q2 g& }
108      else if ( i==4'd10 )
" i9 j% t; c5 V: Q" M. E: R109             get_9point_vld <= 1'b0;
& P% b% {+ q0 u. ?110
% g9 T, n& a0 x2 t' O111
2 M8 N4 C$ s$ Q8 X) H112 always @ ( posedge CLK or negedge RSTn )# X7 R1 _, v+ {! L7 E5 w6 l  Q* w6 q9 K
113     if ( !RSTn ); _9 I5 ~6 ?$ V8 x) G- a
114            isWinDone <= 1'b0;. q9 h" B) o! @/ Q/ S8 c
115      else if ( i==4'd10 )  1 ?2 W; {8 M% n1 R2 _5 q; f
116             isWinDone <= 1'b1;  B# F+ b3 ?& z( f
117      else
! S1 E6 Z" i+ M0 X* f- D: F6 U: \118             isWinDone <= 1'b0;0 |. P7 y4 j! C
119 6 Y: ]0 M6 n5 [# U( Z- c$ }8 n
120
0 h5 l8 G* {& U121 & h, }* m) c) g3 ~6 T
122 always @ ( posedge CLK or negedge RSTn )% Y* @8 V, N& B8 W
123     if ( !RSTn )7 W/ {% c8 A: t! l8 _; J
124            i <= 4'd0;
# D- O" ?  C* s, {, ]  x125      else if (i == 4'd10)  " i7 W% z* w9 I" W- I1 ~
126             i <= 4'd0;
' n1 r6 ~8 v9 U" c: b& R127      else if ( get_9point_vld )
5 v9 h/ h- e  z5 W128             i <= i + 1'b1;0 W/ n0 U) h% f+ w+ E  s  H7 j
129
  I) W- n6 R$ W# J  c130
* ]( J' p% }4 U' D1 j131 0 p2 @; p1 h/ n9 z
132         
6 S. ]  H: @4 o133 always @ ( posedge CLK or negedge RSTn )/ E6 n6 D! h/ j9 ?( S8 I
134     if (!RSTn) # M* j! g" w) n0 o
135             rom_addr <= 0;( ]+ \8 p( p) J/ }/ B1 g
136      else if ( get_9point_vld)
- M1 C8 z$ V1 x( F% }5 T; \/ E  ~137        case (i)2 L8 p+ Z* ]2 M1 p" c8 y. L9 I) J
138           4'd0:9 A  n8 H2 G! T& }5 i0 v7 m
139             if(!(m==1 || n==1)) rom_addr <= (m-2)*cols + (n-1) -1;   8 R* r# R  D$ Q' j1 @
140           
2 ?) c* _) ^1 m141           4'd1:+ Y$ O8 }9 }, F
142           if(!(m==1 )) rom_addr <= (m-2)*cols + n -1;
4 b+ K) ]& ^% g143            , n* L, s  Z4 {( Q0 \' a3 E# G
144           4'd2:2 @3 y( q3 _1 q+ V% H$ \6 ~
145             if(!(m==1 || n==cols)) rom_addr <= (m-2)*cols + (n+1) -1; 0 [% K0 H* d2 X7 l$ z4 c3 ~
146           * P/ S# X% P5 F; l( q8 m% d  f3 j5 m1 f
147           4'd3:
2 x; L- x4 h. D' ~4 ^% G148             if(!(n==1)) rom_addr <= (m-1)*cols + (n-1) -1;
+ o# a  p! J8 U9 T: }0 T$ v$ T% ^149           
! D3 d$ d9 B: A$ L/ U150           4'd4:- D3 ]' o0 ]% j
151             rom_addr <= (m-1)*cols + n -1; # `' [2 Y9 _1 K  V- e
152           9 X7 L) ^) _; {  z( c  o
153           4'd5:# I( l* @2 X' P2 o& y! e
154             if(!(n==cols)) rom_addr <= (m-1)*cols + (n+1) -1; - h! B2 `8 Q& Q9 j# j( N3 s/ E; f
155           . B' j, b2 F7 ]1 C8 X
156           4'd6:
5 O3 U. L: {/ l4 r! ^2 Q157             if(!(m==cols || n==1)) rom_addr <= m*cols + (n-1) -1;
9 W' P2 G7 b/ I" W& ]  J8 B' U/ O158           
% p* A8 s; g) K; z159           4'd7:8 p9 s: X0 _6 I. r
160             if(!(m==cols)) rom_addr <= m*cols + n -1; 8 k; }" X5 T- \
161           
0 m; l2 i  w4 }" e% G162           4'd8:
1 `3 o3 M& F1 f9 k163             if(!(m==cols || n==cols)) rom_addr <= m*cols + (n+1) -1;
( Y% L! x& z; B8 }/ M; n164              3 c; [1 C! i( ]* i( ^/ `2 ]
165           default:;
1 w5 Z# q& x2 @5 f# t166
9 H: ]% h3 H0 v167         endcase; Y- C# S+ E# N
168         - p- X" c1 G1 H
169 always @ ( posedge CLK or negedge RSTn )9 s$ E( o( G) z
170     if (!RSTn)
8 e4 h+ v% o& {, G7 M8 m. h171        begin, J2 v/ t0 n1 [/ }' ~7 T
172           a11 <= 0;
6 J9 A! P; V: m+ q, `173           a12 <= 0;
7 o, ^/ r; V; Q4 E+ O174           a13 <= 0; 0 O% e0 `" Y" d2 Z2 Y$ c, m8 o5 x
175           a21 <= 0;
) m: |+ s/ ^  H8 c, @0 E176           a22 <= 0;
1 f+ k; X6 B8 w6 m177           a23 <= 0;
4 e6 m4 z2 O6 N+ R0 D178           a31 <= 0;
1 a3 t+ P& S. k* \% c& O179           a32 <= 0;1 h  Y4 S& ?$ O: J
180           a33 <= 0;- j% ]$ ~! h, G9 R) |6 Z, [. S
181         end8 g' {& L$ B- `4 q
182      else if ( get_9point_vld )
  ]* s; ~+ ]# h* }0 m% I  L2 ~183      
4 o7 H. B4 t) K( M7 v184        case (i)4 N8 u+ B2 F5 \# V: v' U  A2 v: e
185   ; O/ R( k3 L% t4 V4 O4 U
186           4'd2:# g- l- n: l: u1 J$ `
187           if ( m==1 || n==1 ) 9 |5 u. x  w9 H$ @5 i
188                 a11 <= 0;     ) \2 d* ]0 U& ]5 ^  o; [* i
189           else ; }5 P% @- \3 R1 \$ G
190                 a11 <= rom_data_win;      & p, }' C3 Y" `) W' B' m: T% r2 k
191             n' u& {8 o/ A  ]% {4 m- @; E/ n
192           4'd3:
% k. w4 N1 K( ?. ]! i193           if ( m==1 )  a12 <= 0; " r4 w2 ^" S9 h2 p/ H1 D
194           else a12 <= rom_data_win;      
9 Z" c; V' t8 k& S% J195           
' J! b5 b( L6 v" J3 `196           4'd4:4 `+ {9 d( P, a) B9 i$ s
197           if ( m==1 || n==cols ) a13 <= 0; 9 z  _. v4 C& m$ z, h
198           else a13 <= rom_data_win; 1 Z# s/ C! ?5 ?9 R6 q
199           . r; p# k# x* Q( u; M+ j
200           4'd5:) K0 }# n+ z! @! v% N- y
201           if ( n==1 ) a21 <= 0; % M5 v/ C% }  \% h! ~. R/ ]
202           else  a21 <= rom_data_win;
& {/ H3 _8 G( q5 j% `" g203           ' {( v1 W4 H' g  n) D! s
204           4'd6:0 i8 }: z& }, b; E0 q7 e7 ~& K4 N) S
205           a22 <= rom_data_win;
# `, O( p. I& W  |+ B% @- Q206                       {' _5 P) V2 d* M1 L2 e
207           4'd7:$ ?. Z9 Y6 C, m2 K
208           if ( n==cols ) a23 <= 0;
! y2 S7 ?! u2 R$ `+ F/ e& w209           else a23 <= rom_data_win;# j+ c& i5 g" A/ B0 g
210           
. f" E7 {7 G! U# Z& D' v$ j211           4'd8:
- {4 `" y' \* I  _: m212           if ( m==cols || n==1 ) a31 <= 0;
% ^  l! g$ ?5 l0 Z8 p% `; K213           else a31 <= rom_data_win;  * ~# q7 A; U( N' Z" h
214           6 T6 v( Z1 o. z& ^* B/ V/ J
215           4'd9:2 E" z. a# \" x% E- ^6 l& R; ~5 [
216           if ( m==cols ) a32 <= 0;
! h+ V* \0 E4 s* D; I& F8 S217           else a32 <= rom_data_win;; V& x5 k  l# K6 ?9 s  y: b- x
218           8 i% b# u9 e6 [3 A. Z0 _5 G
219           4'd10:
# @- e0 L# `; h+ o$ X220           if ( m==cols || n==cols ) a33 <= 0;
' A$ c8 g- d7 R9 @221           else a33 <= rom_data_win;  
+ i+ C; L6 I% X8 q; s222           
& g% _& k/ K% q5 B* S! z4 F223           default:;
( Z2 D8 E( a; o6 |3 T' V- X224           
  v, ]: n7 _* m& k' N: W225       endcase
" }. o+ |- r+ ]: M. y. v+ ?9 L226     H/ ]1 F) ]" p) a5 W2 T! ~; n' t
227 /**********************************************************************************************/
  M8 g) D1 A5 A4 l228   
2 n- c* v+ s/ `- o0 C- ]& M229   assign win_data_done_sig = isWinDone;
& x& i2 z! X) J( T' b230   assign rom_addr_sig = rom_addr;* o. r; k; I5 J; L) [
231   - \9 C9 W3 ~3 f5 E' m# m
232   assign data_out0 = a11;% R# D7 n6 W* J7 k6 F' E& g
233   assign data_out1 = a12;
7 h$ U/ O5 k, m. q( J5 p2 z234   assign data_out2 = a13;
3 w: p8 F4 `$ O+ y- H235   assign data_out3 = a21;
0 q# P( i2 J! P0 j# K( S236   assign data_out4 = a22;- _) A* m/ `; G. H
237   assign data_out5 = a23;
4 I' V2 t; I" g. i* Y238   assign data_out6 = a31;  `2 T$ y  j: t0 P2 g. d
239   assign data_out7 = a32;) u. j3 C. f- S* k' N: l0 c
240   assign data_out8 = a33;; g8 Y, u/ \( a- ]
241   
9 E9 {5 [+ \1 ~+ Q+ T- N242 /**********************************************************************************************/
* X- ]! d9 V7 o& j243  , X2 f0 `) n- F( d5 B
244 endmodule, p" k: N2 E9 \; D) u

, I) r# ~4 K/ O
3 P9 g' ~. I' Q; ~8 g7 m% t9 y% i3)计数器控制模块,主要用于获得中心像素点的地址信息。# z( ~  O$ {9 S  s! F' k
7 E- u2 H2 l. \  m  n+ z: l
(1)系统模块开始信号之后开始获取第一个中心像素点,注意初始化信号值和系统开始的信号值的区别;
  q, J, A" z1 O3 ?; z5 p
% D" Q6 @' N) v- W' M0 R(2)该时刻得到的的数据将在下一个时刻产生结果,该时刻的数据并没有改变;1 g  T! w: v- Q( |6 v, W4 i

2 w" U8 g7 Y5 x3 s4 `# o" [(3)注意中心像素点的行、列位置信息的计算;
+ J3 W1 X! t' b# Q& T' d& c$ Q4 p0 k4 b% p% S
`timescale 1ns / 1ps$ B9 a, T5 j  ]& @" Z9 e
//////////////////////////////////////////////////////////////////////////////////' B5 Y: \+ F1 d
// Company: ' F0 |/ q- b3 T; ^) P
// Engineer: # D# n* O: k- J8 d# M
//
' x. ^9 Z: l" \" e// Create Date:    7 \+ w3 t1 Z" N
// Design Name: % z7 Y2 u) ]: z8 ~. @8 F
// Module Name:    counter_ctrl * J: Y) Z# y1 g( i8 ^) X
// Project Name: 9 j2 ?. w4 l: H) H
// Target Devices:
1 ?# z6 V4 H7 V0 a8 t6 O8 y. I// Tool versions: % `' B' ]: H% @/ B: V
// Description:
" i$ n' K8 ]1 w; E! `' z8 j//
% U9 o8 d, j6 U4 w// Dependencies:
, y! k6 q: F( s/ g//
. J* Z+ q+ E% ~3 a7 {" `// Revision: " ?. M- W4 H8 \1 \; N0 F" ]
// Revision 0.01 - File Created/ m9 _! Q- D% b; E7 E. v) J7 C* a
// Additional Comments:
  u) H4 Y- W2 S//
4 ?; L# F0 D' S) D& t+ L//////////////////////////////////////////////////////////////////////////////////1 `7 t$ o  {8 t# U
module counter_ctrl(
) f( M. z8 R* {  CLK,( C6 {4 |1 H% H4 t$ I4 z
  RSTn,
' ^0 J6 Y" ^$ E2 r' H  start_sig,  //input-from top& \6 H) H. w! H
  nxt_pix_sig,     //input-from --start next center point pixel, Z% V$ c/ I) L& `/ U# c( F9 f; x- w4 K
  cols,                          
6 `8 B* V$ z" C- {3 R  column_addr_sig,  //output
2 j/ j+ O; x1 g& T( Q: e2 r& V" h  row_addr_sig,     //output-to & K( j/ O6 M! W& q  x: V
  pix_done_sig   //output-to
# p- C- c" S# r3 K2 d  k4 a. P. D    );6 i1 _7 r0 S" B
5 y: H- T" J2 |7 ?) \, D
  input CLK;$ r- ^  ^3 ]" p/ B# l- n4 Y
  input RSTn;
5 k  ^5 }* [& m% C( ^  i* p  input start_sig;' Y# d4 |6 y2 {  k
  input nxt_pix_sig;
4 w& V: r; ^. j/ K  x- V  input [9:0] cols;
1 l* B/ N  O: ~6 `. s
  `* C3 a1 P' i  output pix_done_sig;  
. S/ `  Z- K0 e  output [9:0] column_addr_sig;    # {) f3 `$ A& C0 w  A
  output [9:0] row_addr_sig;   3 M: l" E- Z0 n# }
: U7 X! a" k; k) X6 n7 a0 K  b
/***********************************************************************************************/
+ `8 ^0 \/ e5 R( b& h0 Q! Z5 j9 z  O+ T( l9 f& h- D
  reg isCtrlDone;: v8 {7 P* k' F3 O6 g
  //reg isWinStart;
; S8 Q3 {; B+ h! X: m. B  reg [17:0] imk;   //The k-th pixel of the image/ D4 Z( x+ q/ l0 K0 \1 c
  reg [9:0] row_addr;  // The row of the centeral pixel$ @! Y0 r- _# f; }
  reg [9:0] column_addr;   // The column of the centeral pixel4 B% i4 V, y: T7 k
2 l( V9 u4 R, R/ r4 T6 ^3 l" T
  reg start_sig_d;
( c! E) {  p: l$ m: f4 L% i9 b5 f1 y: N/ ?+ \* n, _5 i/ \
  wire start_sig_rising_vld;
3 s9 K3 r$ G- k7 g! y# m! R2 W; E4 {3 [/ ~
   always @ (posedge CLK or negedge RSTn)   //Asynchronous reset  " S" W, J$ o! }/ a
    if (!RSTn)  n) R6 S' w+ ]
        start_sig_d <= 0;
0 r& r2 F# d; P4 L% j1 ]     else
8 a. {" w/ S/ z9 k8 i( F        start_sig_d <= start_sig;* H5 E, k5 b* Q* D/ q

8 n5 k6 N4 v. Z' f  [. U  assign start_sig_rising_vld = start_sig & (~start_sig_d);
: l# F1 A" ~1 [8 }; k: a" x% P0 f- }) }" F
  always @ (posedge CLK or negedge RSTn)   //Asynchronous reset: `2 n( u) S) |8 s1 W, E( X# ?8 L' j
    if (!RSTn)
( h4 m( q. ?% C+ C" W, }- a       begin  + I; O- @) O8 L+ p+ P
        imk <= 18'b0;
' X6 F& B  z0 T        column_addr <= 10'b0;
" z! D% q: `+ n6 A        row_addr <= 10'b0;
* K& o! R7 A( Q" _) G" X3 Q        isCtrlDone <= 1'b0;    , p* I' w+ {0 j1 \0 Y7 r+ r
        end3 r! A7 \. x, }% E: r4 F
     else if (start_sig_rising_vld): T9 ~  e! N/ S8 e  T3 V5 [
       begin  ( l# r" ^9 [0 t# v
        imk <= 18'b1; * n+ c4 a  ^) R3 L" w# S" X
        column_addr <= 10'b1; ; }" c+ X3 N( G* ]) e
        row_addr <= 10'b1;
+ Y: f) ?1 E3 ~2 T$ B8 S2 @        isCtrlDone <= 1'b1;    / f& c, I( F5 j9 @% n# N  S
        end    " \0 a  P% O5 |  v: b1 c$ _! J% L) C
     else if ( nxt_pix_sig )
  W7 F- j0 ?2 ^( p       begin  
/ E% _+ ]" j2 p& ~2 f# R          imk <= imk + 1'b1;; t  g5 P. a7 P8 P: y
          row_addr <= imk / cols + 1;   ( f5 L7 U) d* L* w% `! n7 ]% f% U: Z
          column_addr <= imk % cols + 1;   ' {8 ]9 [& t. K
        isCtrlDone <= 1'b1;
3 `' z5 g/ {- h8 T1 R# ]% Q; ^        end2 t* _. R: M6 N% W! w4 w" k( {
     else isCtrlDone <= 1'b0;    * R1 D4 ?, _+ D8 u6 B
- N! z: U6 K( m
/*****************************************************************************************/. }% j. p) @, l' f
4 n: l) E4 r" W- @- _! @
  assign row_addr_sig = row_addr;* J# P  Y0 e' x3 T% g3 a
  assign column_addr_sig = column_addr;
5 m. J( P( K9 f: p2 Q9 @2 l  assign pix_done_sig = isCtrlDone;( v' k6 Y) [0 x( l# H, B0 e( y7 ?

4 {, A, w2 O8 R& k% F, f/*****************************************************************************************/
2 N5 D, x) s8 G6 zendmodule
$ _2 F$ v, |. r# i3 z7 n" p
8 u5 h* K5 E+ Y% N4) 3*3中值滤波模块* ?- @2 ?/ z$ y- D
" C$ j5 L) w2 u( ^* _8 O  h
功能:得到某一中心像素点的3*3滑窗区域的灰度值的中值,作为中心像素点的值;( u) E: X) b# S
" s5 z7 h( L. L+ z) H. ~
中值滤波原理,网上有很多,大家可以查看一下。9 _' L/ u* W1 }
# G( Q8 X6 I( x3 C8 S' a2 ^# l; [
本项目采用的是快速中值滤波的方法。/ R& g3 l$ O  L# o

' @; v' e* ~4 E7 t4 |(1)若是3*3窗口生成模块完成之后就计算下一个中心像素点,需要将该中心像素点的窗口元素锁存起来,以防计算过程中将这些元素掩盖,不能正确进行中值滤波的计算;
! j' ]8 p5 h: W9 ~- @+ t3 X1 ^3 w0 p! _; E) u
always @ ( posedge CLK or negedge RSTn )
$ k1 U7 @& S1 r    if (!RSTn)4 n( b) T( m; z: g2 V# d7 V/ E5 X
      begin! d$ A  ?  @1 O- K/ [; @/ ^
            a11 <= 0;: V: u- Y, d+ }
            a12 <= 0;
3 B# v" d' C5 R9 F5 Y            a13 <= 0;6 y% s' H; x! |! Q9 R( ~4 {7 d4 {* o
            a21 <= 0;1 w: N9 W- s7 g: Q1 m
            a22 <= 0;8 E, O; k3 c) A4 l0 ]
            a23 <= 0;0 l' k) c- }# o2 I
            a31 <= 0;+ m: b  g9 x' ^+ l
            a32 <= 0;/ l! v$ Z! z6 [" u
            a33 <= 0;
& {+ J$ w. z! t2 M1 L        end
# T' P8 G5 h% ~, k) K" x$ P     else if (win_data_sig)$ z. F* r# h! v$ W9 W# ]3 A. S
       begin. E: q& R( T+ M0 x6 q" e8 T& K4 K
            a11 <= data_in0;: }9 I% U+ H) C& C' L
            a12 <= data_in1;+ |2 `4 K8 v( s5 C$ i6 o
            a13 <= data_in2;
7 |4 B2 c$ D2 x- O            a21 <= data_in3;
0 N0 {& |' a: _$ G            a22 <= data_in4;* [2 D/ c1 V3 I) O* `- u6 ~$ C
            a23 <= data_in5;# q6 J0 F. \. R# X& X* l5 @
            a31 <= data_in6;; E' o$ `- R$ N; a1 ?
            a32 <= data_in7;
7 Y# X, O8 h# |8 C            a33 <= data_in8;
8 o% ~' }+ Y2 {; H        end
* Z7 s- v/ m( v' t' J( p
  C# m. W/ H. m) Y- v. j3 Q0 t0 l4 q% R. Q/ q9 v; T/ \
(2)需要在时序的有效区域内进行计算,怎么设计信号的有效性;
- ?. w: U  h8 h! {- R- a9 s  z5 p* y4 O0 C3 x
  always @ ( posedge CLK or negedge RSTn )
9 z; Z8 f' r5 s" M+ w+ h    if (!RSTn)1 |& ]! J$ C# x* t" h
            cal_vld <= 1'b0;  R% P, ~3 Q3 D$ W3 G5 e8 |2 k( s, x9 [
     else if( win_data_sig )
* q% t9 l3 p1 v( p  k% o            cal_vld <= 1'b1;, c+ N( S& O- t. K, V3 A" z
     else if( i==3'd3 )9 {9 K$ N/ g. ^  a
            cal_vld <= 0;    ) M7 [" S9 ^  R: ~0 X, k/ n
0 w2 l! }' f4 x1 D- g; v' j2 O

+ q, {3 D! i! x/ y2 ^(3)仿顺序操作可以分开进行;每一个时刻只进行一个操作,这样可能更明了(代码中没有这样做);
& D8 T8 C4 ]% K% Z  ]$ ?( c5 f+ R; y; ~( [* P
always @ ( posedge CLK or negedge RSTn )
! e! F8 T1 V4 p) n    if (!RSTn)
& |& e  Y# J! c, T& ?% j            i <= 3'd0;3 l4 z5 f* o, X- }7 k& Q/ {
     else if( cal_vld & ( i!=3 ) )
0 |4 G# q( M- E% p            i <= i + 1;& T9 f  B2 s. ]- [
     else 7 o4 |! e0 V9 b! Q) V7 o4 v9 L
            i <= 0;$ s/ k, Z7 p) j6 z% G( S9 a8 @

$ m7 D# r  J. c(4)verilog编程调用函数的方法,指出输入信号,函数内可以使用其他定义声明的信号,最后的输出信号作为调用函数的结果(突然想起来,如果输出信号有多个元素呢,又该怎么办呢?大家可以想想);
9 @6 j: X7 f; J# {8 X) J) i. p: ~( |2 u: y3 x( [% Y$ {' v5 z
function [7:0] max;//if the data is signed number, please add the char signed behind key function; 2 `3 l6 W1 m: i8 j3 {! {6 I3 l- l
  input [7:0] a, b, c;& v  C; j2 ^7 v5 o9 z6 W
  begin
( W  O  k" r9 S0 u  c: a    max = (((a >= b) ? a : b) >= c ) ?  ((a >= b) ? a : b) : c;. P1 i6 d* t  S. z
  end
1 M# g' j' i, H8 aendfunction. q/ {" g7 o) q  E( z9 Y7 G

8 n: |1 H, f9 \0 \- c; ~( t) w该模块的代码:+ S/ v( k; l  H5 {# V
`timescale 1ns / 1ps
, P  @7 Q( T2 B% y//////////////////////////////////////////////////////////////////////////////////$ F) W# @# l- U9 q) ]) K
// Company:
2 e9 C7 O" S( H3 `) s// Engineer: 4 o* f' V$ C& e- Y! F% _
// * A9 s; S9 O' N
// Create Date:    & J6 T- e1 c7 C
// Design Name:
( ?9 G1 Y: P% C- z// Module Name:    medfilter3by3 9 S; C1 c; v* {
// Project Name: 3 j! W0 H& Z7 |3 f
// Target Devices:
' p, b: \/ x9 A9 q: m( R// Tool versions:
$ i+ \  ?; i9 y% [* q( b// Description:
% c$ M  c% |+ b/ ?' {  ~7 l//
  v: W0 _& t2 g$ ]4 @/ j! w// Dependencies:
8 A4 o- U' V' d/ P" k3 x- H//. Y; ]  K. I- r
// Revision:
- S3 r; N( r% W$ W// Revision 0.01 - File Created
4 z" d; u& h; M' i1 \( s1 x7 p  Z" ^// Additional Comments:
# ?; O2 T- X4 N; L//
* z# ~$ ^$ m% F, m% k//////////////////////////////////////////////////////////////////////////////////
. f) I3 s# z6 Pmodule medfilter3by3(
' Q! e  n3 ^$ n  CLK,
0 _% M) E5 X& C5 x( S  RSTn,9 d4 ?8 G4 Q% L
  win_data_sig,  //input-from module of win3by3_gen;
3 s7 ]) F% @1 \6 ~  medfilt_done_sig,   //output-to top;0 V5 _& j/ o1 W) |& _9 T; D
  data_in0,        //input-from module of win3by3_gen;! K: \. _: b9 t/ O' N; l
  data_in1,
$ R$ }; o7 g1 v) {' i  data_in2,# T* m5 m. n2 V  c
  data_in3,
6 J5 I( ^) m. K, |% t* v  data_in4,# O! H- V$ _  o/ d+ W! a
  data_in5,7 v7 z' ^# F% J
  data_in6,
& g2 H, G: o7 `: ^  data_in7,7 ?; w& @6 @& `4 e5 K
  data_in8,& V0 H+ }  W) R) m6 d8 S
  medfilt_data_out    //output-to top; 4 K+ q  P; u4 W9 v* |( N$ S
    );) ~. P, k6 ?3 A7 x
0 ~+ n; J5 Y/ J  a
  input CLK;
% a: l1 ]) \& @) p  A3 B  input RSTn;3 B8 M1 y( l+ @& ~$ d+ A
  input win_data_sig;
5 [+ q! Y- b6 \1 q  input [7:0] data_in0;           //output-to ;
* ^/ h, ]9 f! U, e; P! C  input [7:0] data_in1;
/ _( m( }( o6 i1 \  input [7:0] data_in2;% j+ M  |& p6 l; r
  input [7:0] data_in3;6 q( t, E5 R% U2 K  m( r
  input [7:0] data_in4;: P8 Q7 `1 F, y& p" E- m
  input [7:0] data_in5;
/ \1 }4 n6 n5 c& m  J  input [7:0] data_in6;0 V$ h, N( t8 H. O5 Y
  input [7:0] data_in7;
6 h7 n6 n% C, U9 q  input [7:0] data_in8;
/ [5 Q9 Y8 M: q, I- T
3 u* C3 o, N2 ]) g( }  output medfilt_done_sig;
6 @/ a, X0 S4 {; K, m  output [7:0] medfilt_data_out;
6 y% |( ^9 j( ?3 C2 _2 m, H
( W3 A4 j0 Z! z) b6 l) N, K/******************************************************************************/ 4 _3 H3 n8 [/ ^8 v8 _5 C% _
  reg [7:0] a11;0 C/ i1 A  P* Y' \" O
  reg [7:0] a12;( X% z- g; w2 \9 P' v4 f3 S) K
  reg [7:0] a13;
( z" T; V" w* V  F. ~' s0 u  reg [7:0] a21;* ~, g' h7 D# ]& ]
  reg [7:0] a22;" {! S8 F9 b4 l9 }# _7 K  f$ t
  reg [7:0] a23;
7 W- G( s( e5 a/ s  reg [7:0] a31;
" O0 O7 h6 g/ ~  reg [7:0] a32;: C6 J6 B. A6 }; G
  reg [7:0] a33;3 T& t- [" d4 o+ _; C/ }
. j9 b4 v0 t" H% r
  reg [7:0] b11;
, h, x! F7 `2 \( N% J  reg [7:0] b12;+ D# V# t- i5 q/ f+ r! p& b$ _
  reg [7:0] b13;9 e. w, B  M( w% c  s6 G, H
  reg [7:0] b21;6 q. T$ [' `9 W( G. d$ M) f, a
  reg [7:0] b22;
4 `- m/ e+ o4 p; x+ R  reg [7:0] b23;; [0 A" r+ E& H. n" g
  reg [7:0] b31;- c# W! [0 U9 T! K5 o6 e. \& p
  reg [7:0] b32;% G  h! q" y! h! B4 L+ X
  reg [7:0] b33;
9 [' h4 q1 |. ^4 B2 l3 J/ N7 U
. ]- O; K3 r& ~& @0 J  reg [7:0] c11;( h! n2 P1 I  }
  reg [7:0] c12;' N0 \" C# r2 p
  reg [7:0] c13;
; k% P; ~( E6 p& y" W( Q  reg [7:0] c21;% j. U( {% A/ h1 f
  reg [7:0] c22;
3 n  u( p4 E, S. `" s" M" _8 w  reg [7:0] c23;
# c8 t) u9 b+ H6 U6 t: Z  reg [7:0] c31;
3 y6 v8 [! ]' x2 S2 I& `. P  reg [7:0] c32;
0 n$ e, G$ o: i' E& S  reg [7:0] c33;0 A, }) ?4 L4 ~! ]

& h2 T+ W* o9 @) ^  reg [2:0] i;6 [" ?9 `7 W/ `& z8 h5 b
  reg [7:0] medfilt_data;
7 W% C$ \3 N8 r! E  reg filt_done;0 Z9 F3 C9 N" Y. v+ b
# |& y9 x7 r% l6 r4 a1 a& l+ e/ B
  reg cal_vld;
  G- E' a: w0 [4 J  _  ^% e4 O+ J* u* z5 D* j
1 Q# E  b9 l8 S3 ]6 y
always @ ( posedge CLK or negedge RSTn )
! J: A7 J$ \. @    if (!RSTn)7 z9 _4 S# r- w+ A
      begin
/ l* T" _2 s; k            a11 <= 0;) J. E" k7 g/ C
            a12 <= 0;
) z( e: ^5 E- E9 A            a13 <= 0;; a; u4 P6 Z  z$ m% j; R5 x
            a21 <= 0;
$ S( E2 X. g( e$ P) L8 y, S( d            a22 <= 0;
' ~9 j6 u% A. _! B            a23 <= 0;
9 G) s" M) s6 u, U, ?9 Z            a31 <= 0;: m' Y% b4 q8 S
            a32 <= 0;% p* t$ |' P$ }6 `" y
            a33 <= 0;0 V3 \. x$ h  l2 R
        end
- T: e& j1 z9 G     else if (win_data_sig)
: y* O8 J: [4 g* c( J, g       begin3 [+ }$ k1 k7 r6 v' o' F
            a11 <= data_in0;( W, k! p( A! V' _& c' w, q9 ^$ R
            a12 <= data_in1;# k- T* d" D3 }6 \& X( V
            a13 <= data_in2;( q/ k$ z0 D7 K
            a21 <= data_in3;" l- G- a( D. {0 c5 N- E
            a22 <= data_in4;
% i' @: v& N; \3 s; d) f            a23 <= data_in5;
; K7 D  F' Y' g( O. m+ u            a31 <= data_in6;) t; P. O/ c" Q% d" H. k( j, W: q
            a32 <= data_in7;1 _) I& h1 e5 ^* f6 ]
            a33 <= data_in8;
0 |% H" T5 d- w+ d% V' m        end
- g8 [% a* z  N# t: q: R' Y- V- j- N' U% M5 x7 p
  always @ ( posedge CLK or negedge RSTn )5 Q' [# F( p1 F  G; U
    if (!RSTn)
3 `) c6 k+ [& @9 p# t% H5 _            i <= 3'd0;
. }! J& i1 [; v     else if( cal_vld & ( i!=3 ) )
9 r6 [/ w, z% m3 ^* f7 u            i <= i + 1;
+ D5 O# q! I& E6 r     else # Z9 i4 s" g5 L
            i <= 0;8 h. j* f; {, ?) Y2 k
) p: z- l. Y0 Y
  always @ ( posedge CLK or negedge RSTn )
) N4 i! n! B4 o9 n* J9 c    if (!RSTn)8 o" n2 q5 T/ f. R
            cal_vld <= 1'b0;
* `8 S1 b2 ^$ g" E4 ]     else if( win_data_sig )
) N7 b& V& |0 V0 D0 v            cal_vld <= 1'b1;6 }9 o' e: B  N0 l
     else if( i==3'd3 )
' G6 ?% o0 y4 ^1 R  _            cal_vld <= 0;            * U) c, |8 V  B0 A, b

2 U% e- ^" j& T  H4 u. i# G' J% h6 V  R2 w1 r, ?8 g. @$ u9 U- ~
  always @ ( posedge CLK or negedge RSTn )" @+ L- q- I4 n. G4 K8 t
    if (!RSTn)
! s$ A" ^5 T, G3 @: @5 ]       begin: {/ c3 o0 j4 k: W: p" S
        filt_done <= 1'b0;
! G4 l9 Z# k! U: O        b11 <= 0;
9 m' f0 f4 c) U8 }' A3 F& M        b12 <= 0;
9 N: p2 {3 W0 {/ ^" K) o* i4 E        b13 <= 0;1 y, U0 D: W, p" b5 f
        b21 <= 0;  R+ b6 `4 \9 ^: f  p
        b22 <= 0;
  I0 j0 e: ?7 C' t) N        b23 <= 0;
9 R& f7 C/ _3 s8 P1 D5 y        b31 <= 0;
, n. q" A% C; j  L4 U4 ?        b32 <= 0;8 e0 P, G* N& E, Q
        b33 <= 0;
0 S0 @" v4 C2 e        c11 <= 0;
- W0 O( o6 J4 _' s        c12 <= 0;
1 l% P, s9 ~" X+ l( V        c13 <= 0;
. f* l" `- I. a0 C; Q* a0 l! e        c21 <= 0;
5 B# I- l' I# ]# p        c22 <= 0;
& @6 d5 P0 n9 ^        c23 <= 0;
4 o6 B8 l/ i5 H, `6 j        c31 <= 0;' ?# g! O: [7 p5 R
        c32 <= 0;
0 r; B7 b; b, B( y1 \0 E1 y, g5 D        c33 <= 0;, Z: _+ p1 w% t
        medfilt_data <= 0;7 A7 s' ?& `- N5 D! x
        end
2 `0 i6 q+ K% I; U. D8 |( [     else if( cal_vld )1 X# M- n# J- @9 u5 H
       case(i)- R+ P7 d2 x; b! H' L+ c
          3'd0:
* D# u9 Z; e9 v* x( e% X/ p, a. z            begin
0 ^2 \; r; u2 h  E( ?1 a& n- }             b11 <= max(a11, a21, a31); 4 G; H, `2 d; v  [' {! U4 d# ^
             b12 <= max(a12, a22, a32);
  V- n+ f' i3 a2 @7 V2 u+ G  K             b13 <= max(a13, a23, a33);
* I/ K: K; f. R& j3 X& [0 A             b21 <= med(a11, a21, a31); 9 {2 `  I4 F6 J+ ?- i/ i
             b22 <= med(a12, a22, a32); $ W8 P: v, v  Y9 Y
             b23 <= med(a13, a23, a33);
' \6 Y8 Z$ |0 l* n, I+ n% P             b31 <= min(a11, a21, a31); 8 a" m, x5 j6 ?0 }$ D7 T
             b32 <= min(a12, a22, a32); ; u' A1 Z! o6 o1 c, V8 B- j
             b33 <= min(a13, a23, a33);
3 a/ k8 i4 @% }2 B; N9 r            end( r' n& g4 N0 |# k# T
  Y  G- i& U& r' {7 g
          3'd1:8 D9 [* N8 m% a
            begin
4 A( c3 g8 p" N4 `$ e; S             c31 <= max(b31, b32, b33);' n" k% s  P. e% n1 \
             c22 <= med(b21, b22, b23);
) X* y2 p! p" a0 p. }1 @+ S             c13 <= min(b11, b12, b13);
% z% m. ^- x/ H( |, ^/ U  t             end
/ o1 y/ W/ H0 d! K; O, D, ?0 ^% C( w6 o* h# U
          3'd2:3 e' }6 V- H( F7 ^# G
             begin
$ z$ B' S$ v7 R8 x9 G             medfilt_data <= med(c13, c22, c31);9 k$ w" w. w( A$ x5 Y
             filt_done<=1'b1;
5 X: ~: @' y. k3 ]6 f             end, I( C. \5 T, W8 h. O/ E

/ `. F( v* k+ y! Q: h/ C, b( x          3'd3:
4 W6 Y3 a2 k* v8 f" O             filt_done <= 1'b0;   D4 r7 z' t# w& M. f

6 n' S% k3 w4 h9 s# U            default:;# W) g$ F+ Z7 E5 \/ Q' h

2 w! F5 f% V3 k$ m4 Y' |$ E0 ^        endcase3 m1 q% L! b5 ]# b6 Q4 [
3 B2 r) f+ \( K4 K, g$ C
/************************************************************************************/
5 v3 A& _- W0 C. U" a8 ^; g& Q+ i3 k3 n3 a' F$ U
function [7:0] max;//if the data is signed number, please add the char signed behind key function; " u: Q( a7 e2 J1 V7 f. c7 {+ h# |
  input [7:0] a, b, c;/ L& }2 F5 T' }% r7 Y: b
  begin
. P! Q; `: ^& r0 a6 J. D    max = (((a >= b) ? a : b) >= c ) ?  ((a >= b) ? a : b) : c;
& w; p% `" J0 a+ n  S- k7 s  end4 t; z& u$ [/ ]' }$ ^# ~% M1 a
endfunction
: X2 ]* T6 h5 R7 c8 a+ _8 ^9 q* A* y- m
function [7:0] med;$ |9 e; ]2 w1 G
  input [7:0] a, b, c;) j8 D4 w( a  W; s, ^$ a
  begin3 p3 k8 R8 y; _' K
     med = a < b ? (b < c ? b : a < c ? c : a) : (b > c ? b : a > c ? c : a);
* D- `) g( G6 A, ~8 N  U7 @$ S  end- b2 d3 v2 R9 K2 c$ j+ R% r
endfunction8 w/ t! J6 ~- z7 r( G8 O

& }% C6 O, x! S# a; F, Rfunction [7:0] min;" u( _7 E! B! @( q
  input [7:0] a, b, c;# @* b4 D' e, n- o+ I
  begin
! L; P$ x# z2 p( f) U' x     min= (((a <= b) ? a : b) <= c ) ?  ((a <= b) ? a : b) : c;" R6 `4 ?4 G! b- t
  end. U  ]3 }8 R" Q. D
endfunction
! j) w+ A5 r+ `* s& R1 x- A& w. G. S* X. t  @- z
/************************************************************************************/
, q: A: y2 Y4 m$ t! t$ d5 L! P5 x- I
+ w9 _' s; n3 Y3 q  assign medfilt_data_out = medfilt_data;: {5 u2 P  P  a$ |8 Z  @5 C
  assign medfilt_done_sig = filt_done;! F) ?1 `6 e# p
' G" r3 k3 Z8 S" n9 K6 B9 h
/**********************************************************************************/ - }& b0 v& c4 }! u- G( V
4 J& C7 q9 X: j+ O7 A7 Q6 B+ P
endmodule
& D! I/ [$ L5 t) {, L- F, I
9 c. u2 y3 L( S1 v  m( f% f& R: D5)顶层模块,用于将低层的各个功能/控制模块衔接起来,得到结果;
! K3 h& U$ M# @* C8 v: h1 u8 z$ W: U4 \, ^
注意输入输出信号,以及不同模块之间是如何进行连线的。( ~) K$ l/ u8 R6 {; v
+ d1 E& A. |8 W6 |, U0 E- y) p
信号的名称尽量有其特别的意义,不要重复使用同一个信号名称,容易造成混乱;
% U0 W% i% x$ Y, A5 u# R5 w1 x5 f5 U9 t1 }7 J
区别wire和reg类型数据的使用情况;2 w% p- M; o0 Y) X! c7 j! B# R

6 b2 d8 c' L: _" S" `$ ^+ X- z. i`timescale 1ns / 1ps
0 Q. _5 y$ {) F& {$ n6 }7 Y  j0 b( a//////////////////////////////////////////////////////////////////////////////////
/ e& W/ k. h) K2 p/ C/ z// Company: ! f# {! o- a' Q6 ^4 I
// Engineer: . t3 P% d2 L, ?- o9 ]2 a
//   L( C6 V# e0 q4 _, H
// Create Date:   
( a1 w0 ^2 \: R// Design Name:
8 |3 s+ A- ^: t: {  |// Module Name:    medfilter2 ' u; M2 B& H. m! ]" q
// Project Name:
+ Q2 ^1 P9 `) K2 M// Target Devices: 2 I4 s: c8 I1 N
// Tool versions: , J, L3 J# g& X+ N/ b
// Description:
8 u2 w6 u7 _5 K1 A7 C. n! w% C//
9 g5 k) v- g# t# t0 R7 w// Dependencies:
; x/ m' r0 E9 [3 P9 Q9 M' b5 c//
1 a) {, W9 T; Z" Q- x! b: {  p// Revision: / x! E$ w6 Z! o$ v( _
// Revision 0.01 - File Created
9 X" U* ^5 c8 J& E! u# Z$ p// Additional Comments: # `# I6 O2 L$ x: h, I, F+ P# t; y( Z
//) @5 _7 F! l1 s  u
//////////////////////////////////////////////////////////////////////////////////+ @2 m" ?( q1 }0 h: t' l6 B

3 }" |  [; B3 i" o2 D3 Mmodule medfilter2  
- f! e7 x. O6 k( l(: k. U# w: I7 D$ x  ~
  CLK,
) H: f, t- S4 A7 c  RSTn,
3 @+ P# \# [4 e2 [6 T  Start_sig,
& r7 L9 @' [- |' Z) j! d  Done_sig,
* Z* Z4 D' f" _  Data_out
2 y9 ]) |7 {& o! a% W0 m: W);
) a& A# J' ^, _( ?) c9 u
; l4 h8 e$ [+ F  input CLK;; S  `' Y# y5 g2 Q
  input RSTn;# ^1 b0 N  T2 _+ G! |' V
  input Start_sig;
3 [. Z6 P" d" U+ z) M  output Done_sig;2 m8 B2 \4 I! O" n. ?
  output [7:0] Data_out;
8 R# Z0 Q, }: i: G* Z% p8 i& r: U- w. Q
  /********************************************************************/
: d2 }2 j# C8 q! l/ t3 [+ P5 F) x8 z7 A, _/ J
  wire [17:0] rom_addr; //
) m" f0 O) ]7 r: t  wire [7:0] rom_data;  //
! V) a) f0 [6 G7 U
0 e* V' b. k+ u& s  rom_512by512 rom_512by512_inst
) y- o* t% r: T1 i6 N: W# o  (
5 X- M, W0 N: a% |$ L( L    .clka(CLK),          //input clka;1 K/ A6 `7 v; X# q3 u7 j4 `% k
    .addra(rom_addr),   //input-from;
) v" s% T9 R( e- w& c; u: S    .douta(rom_data)     //output-to ; 0 r, Q- M& g) c
  );
" o4 R5 R7 P# h+ }# z6 F$ O: T& A3 ?3 r) ~, z
  /******************************************************************************/
, P- W' W: V- p1 r& @
9 z' w  ]' W3 _9 t$ M& p( T  //wire [7:0] win_data[8:0];
% l; G. y. e, i; u8 e  wire [7:0] data_out0;           //output-to ;
6 x% \5 v0 r9 Z3 M" }" _4 u  wire [7:0] data_out1;
) d4 e, D8 k+ ]0 u  wire [7:0] data_out2;
. E- J/ l! k8 `, J# T  @! i  wire [7:0] data_out3;) k+ F/ I- L( u! l/ f
  wire [7:0] data_out4;
) i) I5 j3 v/ j5 L9 ^  wire [7:0] data_out5;. E) ^  E5 n! y8 j# Y0 e% h
  wire [7:0] data_out6;
: Z' {% ?9 y" ]2 z4 U& {  wire [7:0] data_out7;) X5 H( {+ p+ r" u, L- N
  wire [7:0] data_out8;
8 T( {; S9 Y7 c0 \" t  wire win_done_sig;
0 o# R# ^2 K  q+ G
! A; o6 C6 }* {4 xwire [9:0] column_addr_sig;
' }9 [# `. c& a" hwire [9:0] row_addr_sig;/ j" H, q" ?/ H* J+ K" M
, o  c; a. L% A3 J7 y9 g
  win3by3_gen win3by3_gen_inst (3 x  B8 ]% T. H2 X. K
  .CLK(CLK),
' a: A# c, d. z2 A9 ^3 Z  .RSTn(RSTn),
4 X/ `- F8 l* \  .center_pix_sig(win_start_sig), //input-from ;
9 y( ?/ }( k9 f8 A' `9 k$ D  .cols(10'd512),   // the column numbers of the input image
& C/ m4 g, {$ v7 c( d0 a+ r2 w+ J  .rows(10'd512),   // the row numbers of the input image. Y/ ]6 r0 q! @/ J$ V7 B/ |! X
  .rom_data_win(rom_data),    //input-from ;
6 F* L* T0 x9 `$ J6 W( s  .column_addr_sig(column_addr_sig),    //input-from ; //output [9 : 0] addra; $ c1 m% `2 n. i$ M5 r6 q% i3 `- m
  .row_addr_sig(row_addr_sig),         //input-from ; //output [9 : 0] addra;6 P3 Y! S7 z: d4 R0 ~% x
  .rom_addr_sig(rom_addr),   //output-to ; 6 c" C$ c( a# M& ~# q
  .data_out0(data_out0),           //output-to ;
- z' M/ d: {2 H9 x2 G  .data_out1(data_out1),
1 J) p$ R* {" s  G8 `  .data_out2(data_out2),4 K6 A9 t4 |( ~& z' W, P% W+ T1 U- ^
  .data_out3(data_out3),
* M3 @. |/ v+ C! w  .data_out4(data_out4),
6 @: h! \: `4 ?- @7 R) X8 R% Y4 A  .data_out5(data_out5)," s- L+ N9 W: c: s
  .data_out6(data_out6),7 D' F& Y5 I4 r9 F( u8 J' X
  .data_out7(data_out7),
7 f* n# d8 w- E4 d0 w  .data_out8(data_out8),
) S' d/ E  O8 B! H8 \& F  .win_data_done_sig(win_done_sig)  //output-to U4/U3;
, I7 y+ {. a0 |, A: S2 p  C    );3 ]2 i7 L" ^6 b* g) t

  ?+ Z* D! `& U) F  /******************************************************************************/
% r2 q7 ?4 P& t/ R2 T: u, Q5 c/ `+ v1 l% H. d6 h
  counter_ctrl counter_ctrl_inst(
# W* ]0 S  j9 D' i5 i  .CLK(CLK),
- H% F* s5 b1 x  .RSTn(RSTn),
) k% I( I4 L/ _! Z) l* }7 M  .start_sig(Start_sig),  //input-from top
/ ?+ n& x+ |3 n7 I% B  .nxt_pix_sig(win_done_sig),  //input-from 8 T9 y9 c1 R7 e
  .cols(10'd512),
) I- K, x3 l3 _  G# g  d  .column_addr_sig(column_addr_sig),  //output-to ( [0 T9 k7 S; E- r
  .row_addr_sig(row_addr_sig),     //output-to
4 `' A7 j/ B2 G- x0 K9 d: |  .pix_done_sig(win_start_sig)   //output-to    4 Q0 y% A1 ?% @  P+ w' Y  r
  );
: S1 b% g+ @& r% t7 {
  ?1 n4 q1 b* y& Q/*****************************************************************************/: _3 x9 v: [1 p6 z+ h

( v3 y+ Z& t/ y& \wire medfilt_done_sig;
1 ?- a" |9 f: W; G5 m6 ewire [7:0] medfilt_data_wire;
% w( x0 O( k2 k/ l! ^; \3 X' K6 I" F+ w& B$ _
medfilter3by3 medfilter3by3_inst
/ \/ C% l1 j4 D* Q* ^* v) I(  U; G# x- P. I" M; T1 m7 D2 m- U
  .CLK(CLK),
4 s" Z0 {' ?0 P6 }4 G  .RSTn(RSTn), + E1 E3 k" u3 N
  .win_data_sig(win_done_sig),  //input-from; 8 E0 w* X$ c2 C. A, \, d3 u
  .medfilt_done_sig(medfilt_done_sig), //output-to;
3 c4 S* s$ `/ R( x% O, \6 ^  .data_in0(data_out0),        //input-from ;2 X: i+ D' [% e
  .data_in1(data_out1),* w& i1 E8 x4 j% w5 |5 a2 X: z3 }- ?
  .data_in2(data_out2),( e& M& Y2 q# K2 Q+ @
  .data_in3(data_out3),
; N8 x% g  G# m0 `( m3 K  j# n/ k  .data_in4(data_out4),
1 l4 v1 |* Q6 u3 u, z$ x3 q3 }  .data_in5(data_out5),
$ [9 O  }0 [: Q7 t/ u  .data_in6(data_out6),: p/ a' k8 [4 \# m' F8 G
  .data_in7(data_out7),
4 {1 I, t" P, l, U/ V  .data_in8(data_out8),
  h8 k" ^( x. D, t7 f" x  .medfilt_data_out(medfilt_data_wire)     //output-to top; # `! T4 W% N& i
); 2 k; [. P2 I% P1 y8 Q

9 n# K( s) H, ~3 `+ N8 s/ t0 m& z. a/*********************************************************************/+ v6 ]- W% I) x. {! X
wire Done_sig;
" L& `6 o2 M: X3 H7 o3 @1 \wire [7:0] Data_out;9 ?' X( z# f3 A4 L( m
assign Done_sig = medfilt_done_sig;
. J) |+ G: f0 \( r. Yassign Data_out = medfilt_data_wire;: c3 x$ A( h! `

" W% p  D% f. m+ P' L" r6 I/**********************************************************************/% k2 `$ x0 q/ e7 z0 ?! u
endmodule( y. t6 `3 n; p8 h2 \

+ G4 e5 R! `7 M4 ^! z6 M9 S" @  w6)测试模块) c7 o3 K. B* V/ O6 v
/ C6 s' w: u) g2 P) L
如何将数据写入文件,需要定义文件的名称和类型;$ N  H9 X. r) X: j0 Y, T

( D, X. B# {) V- ?" d6 ]  U' winteger fouti;
, {: r  h2 l! |( z! p* h* G
4 U" k0 |4 _  K8 T8 ~& o- L4 V需要在初始化部分打开文件:5 |- G, {, M* f5 @6 y8 F

2 Q% H/ b- q  K* @. N* d3 o8 O' t& rfouti = $fopen("medfilter2_re.txt");0 i3 s# x: P2 E) M( ?& D
2 [# g; n+ \8 O; L0 [) M& a5 w
代码如下:) m& O( h  s! b7 q# X) o0 T6 @
5 h5 {/ m! G" B5 N* W+ ^8 D
`timescale 1ns / 1ps5 p) O$ c* L" m* L

8 k3 g) h( b6 y& K$ b////////////////////////////////////////////////////////////////////////////////$ N( X' C& \" D4 Y
// Company: 7 j, o  \* z, y. d4 G& c: m$ D( R
// Engineer:5 }: u' S. |6 b1 E9 m
//
$ ~1 A" V* O% F3 c. B// Create Date:
" ?3 D. o  U0 a% a7 A+ d5 Z// Design Name:   medfilter2: |+ K0 d3 @) }, |+ b) O# v
// Module Name:   E:/stereo_match_pro/stereo_match_FPGA0518/medfilter_tb.v& y1 x. Y2 V8 b, T( i
// Project Name:  stereo_match_FPGA0518
; [) o8 k3 f; n- ~9 X& B* }// Target Device:  
* x- q5 P+ _$ R; _- w8 F// Tool versions:  : V0 y8 v" d; A) m
// Description:
; ^6 B5 ?$ P+ S& p, A3 Z//
. @6 f0 H( P, ~// Verilog Test Fixture created by ISE for module: medfilter2
4 b( |9 x9 Q, p//
% G6 j% D0 v7 @8 y# Z' y// Dependencies:! ~2 g6 b3 Y; u2 h  F
// , {- b; E: P, A8 `
// Revision:
6 P/ j8 m  `/ w# p; }// Revision 0.01 - File Created3 }% I! j) {; }6 z- ^( Y. g
// Additional Comments:& o. s+ n# _; E: l
// ! {  }) z* t" K- f$ x1 X
////////////////////////////////////////////////////////////////////////////////* b2 p0 j) M; I! v4 a
) V1 }0 ~2 \& j/ l
module medfilter_tb;
" ?) K0 i! k9 X" @, M
+ `+ V, s; v, o* h: X    // Inputs
% S9 M( X; v& ?  J! }: p! ~) _1 C/ p    reg CLK;) J8 m/ U% \# M, D( e; g% k
    reg RSTn;
" _- V% ^$ U2 s8 K4 j* H    reg Start_sig;
5 q, C% B9 E" }( B/ n+ d1 C    reg [18:0] pix_cnt;   //512*512=262144=100,0000,0000,0000,00004 N7 ]& ?2 S: A  I& o. k
7 Q: w( [2 P) |# h9 ^& M9 M/ w% y1 g
1 @% F6 U( g+ b0 O( O" K. M. e+ X
    // Outputs
/ q& S9 h5 E1 K! Q) ?$ ^4 B# ~    wire Done_sig;
: g! X3 x- H5 d7 g    wire [7:0] Data_out;
/ Q6 h! F2 a& H+ s: z- i    integer fouti;
2 _9 e6 M/ o& Z7 |& g+ j6 e$ _: d' v* T. {) ]# A/ s3 C/ f
+ A6 l; t* G! \) E
    // Instantiate the Unit Under Test (UUT)0 e8 f7 D/ ^9 P: K* M) [& z
    medfilter2 uut (
' j0 U3 Y% R$ ~0 r' M        .CLK(CLK),
$ L8 q: Q0 i! A0 X' B7 y4 b* A        .RSTn(RSTn), . h; T8 t' u" F
        .Start_sig(Start_sig), # x( I8 a1 {! u2 Q# C# t4 f1 N
        .Done_sig(Done_sig), 4 B# A9 f: H) D7 ?! R' \
        .Data_out(Data_out)+ ?) l; H* x$ j+ j3 S
    );! c2 q  l% {( C3 W! z

# {9 p% [% g0 z4 s, ^    //assign Data_out = 0;8 p: J6 L8 |, B) j7 L8 k
   //assign Done_sig = 0;
% ]! d: c$ S/ D& ^- B) }0 ^* p8 R: n$ F" b1 ^
    initial begin; F3 v- V. i. E/ |' P) d( f* Z
        // Initialize Inputs7 \7 f$ t: N. F# U
        CLK = 0;
, B! Q6 Z+ K; H2 f1 @        RSTn = 1;
! [, F: w2 T/ g; D6 g        Start_sig = 0;# g. P! i8 }4 e: `3 v) d

* |  J3 q+ f* R( B' H        fouti = $fopen("medfilter2_re.txt");
0 F0 `3 a0 d( m: W& H+ m0 {0 O) J1 ]) T# W$ J
        // Wait 100 ns for global reset to finish( @% q& d" F) Y" V" K5 p3 e
        #100;   // To reset the system& V' g$ _+ F6 K" ?9 ]! ?
        // Add stimulus here4 h( ]: @; U' M. m
        RSTn = 0;0 ~' U0 B2 W# V" E# ?: @" u  B
        Start_sig = 1;. ]/ b3 w9 f1 b
        pix_cnt = 0;
* }3 K- a8 g; [" V9 y' u/ S3 v' B2 }: P) [, d+ t$ l
        #100;   // To start the system
1 r4 }0 r& X% V) v        // Add stimulus here  b& F5 N/ F7 }( a! M
        RSTn = 1;
; A9 t; B0 q% {- {        pix_cnt = 1;! l2 M( r6 F  Z" I7 L9 J

; e- J+ ]- n4 b1 F    end
) n$ o. q- B; Y* N: U9 u1 L7 E6 E( }- `6 w! B
    always #10 CLK = ~CLK;
& D3 i; S4 r) ~* Z( o6 I% N3 N: y
    always@(posedge CLK)' V: j! i5 w. p4 {' m
    begin
, G/ h9 A$ {6 X+ }        if(Done_sig)
! J) N! Z8 l+ ~* {- q) p4 ?, i           pix_cnt <= pix_cnt + 1;$ C5 k' W, x- M
    end
, N+ Z3 I& {4 G* m; [: h
5 ?) l  _7 ^2 N5 d, Y& v6 b% B3 f5 e- P  B    always@(posedge CLK)& P: R4 i2 s4 }# s
    begin2 V+ i1 x7 Y$ J- ^
        if(pix_cnt == 19'd262145)/ q! T4 n5 r# z5 I% s
           begin
9 y) H6 E% S" k4 |6 b: V! g7 F              Start_sig <= 0;   L* ?2 v3 @; ?0 ^/ {7 r" D/ ~2 D
              $display("Image Medfilter Completed!\n");
) A7 r' C2 O: v              $display(</span><span style="color: #800000;">"</span><span style="color: #800000;">The all time is %d \n</span><span style="color: #800000;">"</span>,$time);
: ^; P6 `4 {9 e/ @  Q, i3 K2 t              $stop;1 K% D0 X) t* P7 B
            end
" a  Q; L% \6 F1 ]6 j* P/ ]    end( z4 {% Q; T+ V. V9 F
; \+ Z+ j# a  C( ?5 V: u- R( ~
, I  i; F6 i6 X/ a# F9 A" ?2 f
: y; n& C  v6 A
    always@(posedge CLK)
7 [* D* O! I( @9 N! Z    begin
, Q: r& [2 A6 p; z/ z2 D" L. i5 L        if(Done_sig)
" M) L. q2 `- W5 b- N; A. Z            begin
. W1 E4 r! N8 O* d0 p              $fwrite(fouti, "%d", Data_out, "\n");
( L: g1 O3 \2 D+ U# u$ x              $display("%d",pix_cnt);
1 r  r0 Q8 t. B9 O2 J) |. O8 p% A6 R            end& L7 v; C: P7 \& N
    end
# b  G" j  T% y3 n, K6 @/ B5 @  O
) R4 D, I- M4 A0 }endmodule
: D. n  s( U; u9 y5 Q# U4 ~& C2 Z7 U
整体的代码就是这样的。
0 P% ^+ w# T3 o: e
/ D5 P9 z0 o( z( F3.对各个模块进行语法检查、波形仿真、时序设计、调试验证;. A# w6 r; T  U, u/ O. }

% n: p* S  S+ f4 a) U! x本人觉得原理清楚之后按部就班的编写代码还好,只是刚接触波形仿真和调试的时候是真心不顺心,还好有同事帮忙调试;在调试的过程中其实会学习到很多东西,很多经验,以及很简单的但你之前就是不知道的知识,这就是一个实践的过程,有时候你根本不知道错误在哪里,这怎么会是错误的呢,为什么不可以这样写,我觉得这样写才是正确的,这些就是在调试过程中本人的真实心情写照呀。可是,没有那么多为什么,verilog就是这样编程的,只是你不知道而已!这才是最伤人的,因为你不知道!0 p& l4 \# `3 s: c

& |, f8 r* p/ k   仿真调试的过程中遇到的问题以及解决方法有空专门写一篇,调试的过程中最好是一个一个模块的测试,特别是关键信号的数值,最好搞懂整体模块和各个模块的时序设计过程,推荐使用TimeDesigner进行波形的设计;另外还需要有关联的两个甚至多个不同模块信号的交叉仿真验证。
# q3 G; D- `. M1 z4 ]9 a* v" _% w& v  s6 G. H; E
4.与matlab的中值滤波结果进行比较) ~2 p) Q9 ^) Y. W7 q2 j$ O

" A! C! {% l  X: [+ C# ^$ P0 x( K使用matlab编程基于自带的中值滤波函数得到处理之后的图像与数据,并将verilog得到的滤波数据转换为图像,将二者进行比较。5 b; i! l$ o9 t, j' j- r

8 W; j1 X8 ^2 d使用matlab自带的中值滤波函数medfilt2生成原图像的灰度图像的滤波数据;" Q" ~! \& [7 |7 o4 Z

, x1 M* w2 S. [# ]' l% mcode to median filter for one jpg image, and create a image data file* ^* n* ?& h8 u) Z/ z( a
src = imread('lena.jpg');3 `3 a' f& o, m/ E, a9 I$ Q* i, `
gray = rgb2gray(src);4 g1 h2 T: \2 [
1 E3 y) _: \! E2 y+ j  q
medfilt2im = medfilt2( gray );( e% \1 p# ~% `# q5 ^+ F) y( K
[m, n] = size( medfilt2im );                  % m行 n列
/ E; q* u7 K6 v" t
; O% s5 S! T: X# fN = m*n;                               %%数据的长度,即存储器深度。
# T& I3 n- b6 ~- `1 `% iword_len = 8;                          %%每个单元的占据的位数,需自己设定
5 l3 {  O0 n) T( i( z8 K* flena_gray = reshape(gray', 1, N);% 1行N列/ K" O2 B. O) ~$ ?3 U
lena_medfilt = reshape(medfilt2im', 1, N);% 1行N列8 q5 y; H. y! h

4 p, @* B! m$ k, }; r$ [6 afid_gray=fopen('lena_gray.txt', 'wt');       %打开文件3 j3 }9 E( S% U
fid_medfilt=fopen('lena_medfilt.txt', 'wt');       %打开文件3 T3 w2 r( l4 c2 R2 g- {
% fprintf(fid, 'MEMORY_INITIALIZATION_RADIX=16;\n');
2 D* v' ]. I7 T# V' n! X% fprintf(fid, 'MEMORY_INITIALIZATION_VECTOR=\n');4 ^7 S: ^1 `; y& ~1 l" e8 c
& p: r$ U# w  b
/ S6 f; g9 w- _5 d: B5 L- Y
for i = 1 : N-1
1 }% C* x" C+ E    fprintf(fid_gray, '%d,\n', lena_gray(i));%使用%x表示十六进制数2 c* u; F4 ^5 N  b+ f' X7 L2 o) ~
end
/ i2 G; X' O# h  M# K  r+ u/ qfprintf(fid_gray, '%d;\n', data(N));                 %%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
6 @# V# i. O$ |, V+ gfclose(fid_gray);                            %%关闭文件5 m; Q5 v8 }' H+ u0 J8 T# y

! D5 h* v5 O8 g- }! Nfor i = 1 : N-1
! C7 E1 i; C- u    fprintf(fid_medfilt, '%d,\n', lena_medfilt(i));%使用%x表示十六进制数4 c" F: ^( h; z# M
end1 W. G& T/ A; ^1 @) Z& `
fprintf(fid_medfilt, '%d;\n', lena_medfilt(N));                 %%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号) T6 {, y; J. P  ]; m2 V
fclose(fid_medfilt);                            %%关闭文件. ^) x3 F' L$ ?

! x) I+ h% j% r6 u3 ~将medfilt2函数和verilog产生的滤波数据转换为图像,并与matlab直接产生的滤波图像进行对比,代码如下:
8 ~8 j0 U9 n. l7 h: X9 T$ J6 f: u4 T4 X: S
% code to create image data from txt file
( C5 Q1 p0 {1 z+ y) N& Cclc;
' O- F5 A* x! _2 O- v; v6 uclear all;) p' ^9 Q4 M- \2 @* \5 j
close all;" ~' t- b' L5 i) C% }
I_rgb = imread('lena.jpg');
% H; ~7 h- C( O% Q' b2 z$ ^subplot(2, 3, 1), imshow(I_rgb), title('lena-rgb')/ D, L8 T+ V% A7 ?& Q

1 E6 ^7 o2 u0 ~9 uI_gray = rgb2gray(I_rgb);: Y1 @4 ~' D/ C1 Y* ~
subplot(2, 3, 2), imshow(I_gray), title('lena-gray')% c3 E* y% o8 X8 i7 P% G

' g7 M+ f3 ?* y0 Wmedfilt_m_load = load('.\lena_medfilt.txt');6 e. I4 w+ B  M& }" m" Z- u; T  f
%medfilt_m_load = load('.\lena.coe');5 c1 m( o7 K  a& o
medfilt_v_load = load('.\medfilter2_reV1.txt'); % verilog 产生的中值滤波之后数据
) ^0 G! N# R  F% D: [
0 ?$ o1 L  I" G9 n" A" Z. amedfilt2im = medfilt2( I_gray );
9 K# k2 h! y) Q0 y7 v- {subplot(2, 3, 3), imshow(medfilt2im), title('lena-medfilt2')7 k8 f3 j4 D9 G3 ]. v% G6 H1 B. r
" M$ A4 s0 I. G1 D. K( B$ T
m = 512;" W$ w0 K% u( B# ~' @
n = 512;- s0 L5 h/ X) k0 E2 t9 J2 u" {& P+ h
medfilt_m = reshape(medfilt_m_load, m, n);7 T0 s. l- G; L
medfilt_v = reshape(medfilt_v_load, m, n);% B' m/ l  @( u
medfilt_m = uint8(medfilt_m');4 U- p% q1 ]+ z
medfilt_v = uint8(medfilt_v');1 b# D/ U6 u# z5 d" @+ n1 ^2 p
  V. x5 @% x2 R4 M0 Y
aa = medfilt2im - medfilt_m;) d( P; B  y* B2 ^6 r* @- B6 I* j  a
bb = medfilt2im - medfilt_v;
7 h! i2 D7 G$ y, S+ a7 a& pcc = medfilt_m - medfilt_v;/ P1 |  Z" e9 h- ?* _  J& R2 j
% [& K0 p& \. C8 w, c0 M- v+ q
subplot(2, 3, 5), imshow(medfilt_m), title('medfilt-matlab');0 B7 n) ?- w4 B
subplot(2, 3, 6), imshow(medfilt_v), title('medfilt-verilog');
; H$ u: C+ Q, q8 m/ U. A  Y% k* p' ~
显示的结果如下图所示:
+ D9 y9 E1 ?0 d6 h" {6 E$ O
8 o9 @3 i! E& N$ s9 h; @( k, r7 B" G$ C9 A
结果:两种滤波产生的图像数据完全一致,不过感觉函数直接产生的图像颜色更深一些,不知道为什么。
* z! ?$ P6 B/ }' @, S4 z6 I
/ q2 j7 W4 V/ f6 {% K这里需要了解一下medfilt2这个函数的原理。结果数据表明,默认情况下该函数对图像边界采用的是补0的方法进行处理的。) }( Q7 U" J5 E
! r: B5 r7 B9 d" [
结论4 X/ @: R$ `* I
. Q$ K, L* I; l4 z) F
中值滤波终于告一段落了!简单的问题还是需要深入进去研究的,实践的过程中你才会发现自己之前了解的东西是多么的浅薄,对已知的知识掌握的是多么的流于表面!7 ~$ |1 t+ @3 S9 e' e
: @9 k' E" G' A* `6 y5 M2 A
最后结果的数据还是很让人开心的!) b6 l# m$ P# @- `! f
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-29 05:48 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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