|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
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
|
|