|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
. G$ c+ [% \2 @/ x# W, s! ^# n1 U( [7 c6 _1 p
一、实现步骤:
. P4 w: g! K# ?
2 G' M: ~2 q% p3 J9 Z$ O/ M' m1.查看了中值滤波实现相关的网站和paper;0 A' j, y% W( h, B+ ~8 J
3 G; |' N- N% F$ J2.按照某篇paper的设计思想进行编程实现;8 j, x Y1 r0 T" g8 a3 R5 v* ]5 U
6 C; r( ^+ Z7 y% x+ i- H& _3.对各个模块进行语法检查、波形仿真、时序设计、调试验证;, e; L& h8 L* y6 ]% U
* Z& z) ~; R$ m; C; a! G; P
4.与matlab的中值滤波结果进行比较。# x' S0 y8 A6 P& g/ m7 t4 k
# U( T# N8 R, R8 ^% f+ Z* k: R7 }0 S. e1 I
二、实现过程:- x% Y) K8 g; o1 W7 j9 m
j- ^) U; c4 k. g1.查看了中值滤波实现相关的网站和paper;3 H- w# ?' H" C3 |8 J$ P0 d
( Y& }' n1 ?7 e在网上看了很多中值滤波的设计,也有一些代码可以下载,也有一片讲解的,只是感觉讲解的比较模糊而且不完整,最后看了几篇硕士论文,论文竟然主要做了中值滤波的工作,发现了一些设计思路,然后就按照自己的想法进行设计。
! u2 N0 T# \3 E& v
* w! J0 v3 U9 r, v2.按照某篇paper的设计思想进行编程实现;
: m9 E0 b" I4 E+ v1 ]- |9 H$ u
7 U' N4 p6 } J1 e f. l- g整个中值滤波模块分为几个小的模块:3*3窗口生成模块、计数器控制模块、3*3中值滤波模块、顶层模块以及最后的测试模块testbench的编写。" b& U$ B+ y8 D1 u4 |6 ?; e8 z
: j) g( B0 s0 _( C) y整个框架的设计如下图所示(使用visio画的框架图):6 ^5 o" U; B9 W8 y+ m) ^
+ _) V5 ]& E# P0 ?2 M* t! |7 L . ^ F: G; S8 f! p4 t/ J
. N# H$ o. L0 ^8 A各个模块的设计:
; t/ }# F O q2 u
H, M: L) X" m# f& D1)ROM IP核的生成,用于存储原始灰度图像的数据。
5 W) L' K9 I$ J( e# }使用matlab生成.coe图像数据文件,然后使用Xilinx ISE工具将.coe文件添加到ROM核进行数据初始化,按步骤得到ROM模块,参考生成的.v文件在顶层模块直接调用即可。
0 E9 W9 N% J/ U
, Q: R. \, C# s6 B6 G0 Nrom_512by512 rom_512by512_inst
+ ~; F% S6 T& w M (5 _2 N- [2 I2 B- K. x8 U
.clka(CLK), //input clka;
2 z7 ]" D9 B7 j# L! a% x) U" k% T- m .addra(rom_addr), //input-from
0 ~) X( X2 L& V; ]+ }5 n .douta(rom_data) //output-to : C3 Z; q7 d i4 k6 `+ N) S
);
5 o _& Q# v* ]# k% j# q5 ]2 T; S0 t2 x9 T
! _/ J+ e' L* v注意ROM的存储空间的大小;
3 L: k) e1 @7 |2 y
% b0 n& R c- M3 y% p/ a2)3*3窗口生成模块,用于生成滤波的滑动窗口,得到窗口内的所有元素数据。
8 H- P- R$ n& w. |; ]8 Z+ E5 U$ w
功能:) [7 _+ w1 Z( A2 p. f# L: F
7 B1 ?! @ K, X# A; X9 _8 p+ o. G(1)根据中心像素点得到所在其所在的行、列位置;# B$ g! a g, n) y) w
% D$ c" X! |: w/ `9 \
(2)根据该模块的开始信号设计得到获取数据的有效时间序列;
; d1 K% S& I& ?7 z% u, N c
/ {' e7 S* t p p! h: R(3)在读取数据的有效时序内,得到窗口内的所有元素数据;; j1 K+ x& S" _
! B6 e" |% o4 y* ?$ L8 H6 u(4)窗口数据的获取按照一定的时序顺序来获得,类似于黑金推荐的“仿顺序操作”,这个比较适合my style;不过后来发现调试的过程中被项目组的硬件人员改动了一些,甚至说不好,感觉可能是本人还没有理解掌握吃透“仿顺序操作”的精髓吧。
4 ]: L1 c& n8 U# ]8 P i! d% i
+ V1 y7 R! o" C, a& }7 \" o8 _- W(5)根据中心像素点的行、列位置信息得到每个窗口元素的ROM地址,根据某一时刻ROM地址,下一时刻调用ROM模块得到对应的元素数据,下一时刻将数据锁存,然后再读取该地址的数据;所以要注意地址和数据的获取不是在同一时刻,而是需要延迟两个时刻;: ~' E+ t9 k- x& P5 f( V
/ @7 v* I& r7 V B2 N
(6)还需要注意的是图像的边界问题的特殊化处理;一般图像处理都会遇到边界问题,这个需要谨慎;
& o5 N! |* X7 G$ o8 b$ N& D& l2 k) Z+ H3 S6 o) z0 N$ e9 w
(7)对matlab的中值滤波函数medfilt2原理的深入掌握对我们编写这一模块非常重要。matlab并没有主要过程的代码,看注释默认情况下边界元素设置为0,这也可以通过结果反推回去发现的。5 o$ C" Y2 z2 s: j; S9 K" \
: y# C0 p! w# k! q0 g" E& r2 O/ u1 `timescale 1ns / 1ps, W2 P( P1 C( t [# K
2 //////////////////////////////////////////////////////////////////////////////////4 |9 F1 H3 G) V
3 // Company: / {9 H9 d& e7 }9 S; G
4 // Engineer:
7 a1 f F) `- ?* c( E- `, r 5 //
4 _2 I }4 ?+ p8 g: ?. w 6 // Create Date: % j' ^0 A7 i5 J2 [
7 // Design Name: 5 u$ @0 A! y4 b# @0 y5 @
8 // Module Name: win3by3_gen 7 j. W3 h: S u: A1 X) V
9 // Project Name: 3 n0 D' o! a2 I8 j$ E& n$ }- x
10 // Target Devices:
( a! e5 j; t. r' h& D11 // Tool versions:
8 T2 L1 J5 y z3 y) Y12 // Description: a, c! h+ k. w* m4 o) ?" ?
13 //
! |5 `6 D0 `1 ^. A* R14 // Dependencies: 0 t3 e: N0 ?+ Y* ]$ d; h( `+ Q
15 //5 R& s7 }2 i: i
16 // Revision: 6 K! J/ z2 Q0 M Z. w* \) v; V
17 // Revision 0.01 - File Created
3 \3 r7 R7 H4 t& I18 // Additional Comments: : y8 b1 g- J8 m/ i
19 //
4 E8 [% S1 V' f2 ^& X# ]5 q20 //////////////////////////////////////////////////////////////////////////////////3 D. g4 l- y% x! k. S( |
21 module win3by3_gen(
" m- w: y1 f* r& |! ^9 t22 CLK, % d2 K( _8 t, _$ H2 G: a
23 RSTn,) K$ \6 m$ _8 t5 r# y! H
24 center_pix_sig,
7 I8 W. W/ H1 H* G5 E- J7 G g25 cols, // the column numbers of the input image
) x7 o( z$ y' X+ n26 rows,
3 I3 K0 | _) }27 rom_data_win, //input-from U1; 6 h6 V- i" G8 u9 x" ~. Q x0 a! V
28 column_addr_sig, //input-from U3; //output [9 : 0] addra; 0 I* X+ Y, X8 t7 p8 Z
29 row_addr_sig, //input-from U3; //output [9 : 0] addra;
1 j- ]* e9 c2 J4 T6 r1 O! c30 rom_addr_sig, //output-to U1;
+ S7 g3 B, i# z9 X9 ?7 N" \31 data_out0, //output-to U4;
( H% `0 ?( j7 C8 U. j32 data_out1,: I- m6 Q, ~$ f/ ^5 `& h! V
33 data_out2,
2 J$ O: u5 c r4 U5 z' C34 data_out3,
/ ~6 H' s# a8 U35 data_out4,
8 L( h. K0 Y6 {, ]/ n' ^1 M$ G* C36 data_out5," M. H- C( f1 G: M
37 data_out6,0 x J1 w/ l: [
38 data_out7,) N, A' m+ D# {* `6 T8 N; q+ l* c
39 data_out8,& w. N _6 e2 u
40 win_data_done_sig //output-to U4/U3;complete the win data;$ ]+ A4 f0 B' Y; m- j
41 );0 G8 {/ s& o6 ~6 Z4 B
42 5 g' b9 Y3 j# i/ U; z4 K5 H
43 input CLK; 6 h' L8 {5 a; s$ |+ @; Q9 ?4 y2 k
44 input RSTn;% [$ m4 ? O/ f E" r* f
45 input [7:0] rom_data_win;! L3 H' Z8 c* {) @' K
46 input [9:0] cols;
+ @/ ?* t: ^8 l5 M P% \: o6 R47 input [9:0] rows;
6 E: r$ d) m% p48 input center_pix_sig; // # r2 n4 d6 j4 K* x3 ?6 \6 G
49 input [9:0] column_addr_sig;
6 u% O0 x2 Q! S3 V( @50 input [9:0] row_addr_sig;
) _& C2 S" h( n" L4 O0 J9 J' |51
) c2 I/ @0 b! ^* U4 `, L52 output [7:0] data_out0; //output-to U4;
. W K5 A) d. k1 T# R8 F53 output [7:0] data_out1;! B0 n( i; W" Z7 D( H5 A6 @
54 output [7:0] data_out2;
: \1 }2 w D9 L+ V' |55 output [7:0] data_out3;
; q4 n1 L; l1 h* a. Q* T5 G* \56 output [7:0] data_out4;/ u0 v" i. [2 F2 N
57 output [7:0] data_out5;
9 E3 B5 m( \) B3 y6 C, m1 V' k$ X58 output [7:0] data_out6;
) l' y* |: c6 n2 C# Y, q6 E59 output [7:0] data_out7;
! h' |# x, e4 f/ f3 ~2 f5 H60 output [7:0] data_out8;
. W: E; C0 [4 [# U9 [' o( @# M61 output [17:0] rom_addr_sig;4 J4 Y. C5 H2 E5 B: H+ R* X
62 output win_data_done_sig;
6 E, Z+ u5 x7 c q. Y. ?63 7 y. A$ x0 Z- z
64 /******************************************************************************************************************************/ ; ?$ x$ _2 {- _
65
3 Y9 |1 o' Z, t6 c66 reg [9:0] m;
^' W% R `" J) x( [! _+ p- Q67 ; n6 ~, b) l6 B: e# x
68 always @ ( posedge CLK or negedge RSTn )% C: y q# _6 G8 K2 g9 Z
69 if ( !RSTn )% P/ `$ ^* u* c$ x( w5 N" o
70 m <= 10'd1;
7 _. `5 a! y# Q1 R71 else if ( center_pix_sig )9 _9 V3 P7 Y0 t. t# N$ r7 S! ^9 k
72 m <= row_addr_sig[9:0]; : z9 P: L) u" T4 \6 y
73 2 J% W: l p/ }. \/ b! _
74 /******************************************************************************************************************************/
1 b: |. ~3 N- M* u) I4 x: e75 # Z# f1 Z, j, d
76 reg [9:0] n;
5 |( N1 T/ c- Q' y/ e4 H Q7 _$ N77 - w0 \: R8 ^ V
78 always @ ( posedge CLK or negedge RSTn )4 k) @ B# w" ]. m: g: J0 ]
79 if ( !RSTn )
% G; C% b9 m8 ?5 C80 n <= 10'd1;
# E* s% x& U# o5 F. L o9 o81 else if ( center_pix_sig )# Y3 t; Z# q) ~- W1 [
82 n <= column_addr_sig[9:0];
* r( [! {* f; M3 {: I83
7 F/ y1 O; V6 M4 B$ |3 r84 /*****************************************************************************************************************************/ $ ?. R. P# B2 ~+ M- Q& d: N
85 ( Y5 R( `: R$ p6 E9 g
86 reg [3:0] i; ' ~9 R; S1 h" t( N. q( }
87 reg isWinDone;
9 D) R9 X2 q2 X88 reg [17:0] rom_addr;
/ C9 T3 N; o o0 d y' o& O89 reg [7:0] a11;% i5 T+ O3 t+ K& v8 t3 \4 c# G
90 reg [7:0] a12;
# F8 J$ T5 b' z- ?6 e6 X: X91 reg [7:0] a13;
# i# A, _5 L7 k0 W/ ]7 F1 ~92 reg [7:0] a21;
; k' q3 [% A0 f5 K5 n" C* w* R4 Q( t93 reg [7:0] a22;2 U; H" ?+ q% W
94 reg [7:0] a23;6 S' [+ s! x3 x- z% ^
95 reg [7:0] a31;
* x; w" s! t; A! ^96 reg [7:0] a32;
4 Y% w& y$ S2 _# G3 L; }97 reg [7:0] a33;
. g9 p; a! v. B$ A* V" t! g98
; F; v9 a7 e% R' P, e99 /*****************************************************************************************************************************/
: @ C+ r: w# i. X' c* u100
- B+ F, @# i+ \6 c101 reg get_9point_vld;; G V+ I! C+ t- M) a" h
102
8 c; p* ?5 P4 k- F4 b; w( x1 ?' W103 always @ ( posedge CLK or negedge RSTn )* I' n" M' g2 E0 S; q0 S' x7 J8 \% e
104 if (!RSTn)1 S4 z- J% a2 s) ^8 X% U( f3 G
105 get_9point_vld <= 1'b0;
, l( R9 S' s; |9 `106 else if ( center_pix_sig ) 8 x# _* h: s/ S
107 get_9point_vld <= 1'b1;4 I2 I& N7 N# R8 s* b% ^" X
108 else if ( i==4'd10 )
$ p* y8 ~3 I( P/ m5 S* k3 b7 |109 get_9point_vld <= 1'b0;! M$ C2 b1 J) Y3 W1 ]/ x7 x1 j
110 7 `* @# ?) m- O7 t5 l5 z* {
111
h: C3 Z! l, s112 always @ ( posedge CLK or negedge RSTn )
7 {' L' J/ m1 R+ Q$ L# s5 ~- j113 if ( !RSTn )$ } a0 y }8 u+ J
114 isWinDone <= 1'b0;6 Y( C3 T% |/ V3 |) D' M0 X8 X
115 else if ( i==4'd10 )
) o1 f* G0 l" L) `116 isWinDone <= 1'b1;% O. M3 H$ {& J$ Q: {7 |, w
117 else - ~ K3 Q# M0 N3 m
118 isWinDone <= 1'b0;/ J. V- J! F* V; l0 q7 @2 {9 T& ~
119
, G9 d! O, H& X. _" V) K2 |120
+ h; {2 a, `1 j% I& v121
( X% P, y J7 \* `* b, g0 v+ n122 always @ ( posedge CLK or negedge RSTn ): x* C5 H* }; W& O: W1 d
123 if ( !RSTn )% _. K+ v: V6 P5 D7 t$ b
124 i <= 4'd0;( P9 u, \' |) }2 R5 F/ y* O1 O* }2 U
125 else if (i == 4'd10)
% `0 T9 s$ a5 X; Z3 `- P126 i <= 4'd0;5 W. x0 G% ]3 d8 c0 X; H
127 else if ( get_9point_vld )
& E* M4 h. o+ F% t: v. y9 _- L128 i <= i + 1'b1; C# i, c1 S f0 }/ r- D
129
- w. h8 C8 H, T5 M& z130
' [. u( b' X/ K5 Q131 3 T$ Q3 O2 g2 _ ~8 }, ^# w/ ^
132 # L- N0 @ V5 s# ^3 r
133 always @ ( posedge CLK or negedge RSTn )
0 |- Y5 `+ b* r& |; h- g( P134 if (!RSTn) . y5 {6 K( L7 i& L! j) I- H
135 rom_addr <= 0;
5 G0 j! ?: @4 d' `136 else if ( get_9point_vld)5 p% C/ U! T- p/ C. m. ?
137 case (i)+ V d; R8 r& A3 j) W" E# X
138 4'd0:7 | h. \+ S' D2 r
139 if(!(m==1 || n==1)) rom_addr <= (m-2)*cols + (n-1) -1;
- B4 y( H4 B# y0 H% ]140 6 }3 C7 l9 s: q5 x0 D* @
141 4'd1:
% }( M ?' J7 ]142 if(!(m==1 )) rom_addr <= (m-2)*cols + n -1; 7 l. X O. |7 l7 \" p
143
: m7 U$ Q- b. {/ X' P144 4'd2:5 K& j8 B( w/ |. ~, k
145 if(!(m==1 || n==cols)) rom_addr <= (m-2)*cols + (n+1) -1; ; i4 D3 m% i$ Q$ O; D
146
" C6 m: {9 n/ [9 k147 4'd3:/ L$ K) d: w( J
148 if(!(n==1)) rom_addr <= (m-1)*cols + (n-1) -1;
, A' J: ^6 i6 y! ?8 L. n+ {6 `149 - I, G( G m$ T' @3 A
150 4'd4:# U! y0 T) R3 B, q- e
151 rom_addr <= (m-1)*cols + n -1; $ ~1 \7 G$ `$ ?
152 $ I9 K% i y6 F. M
153 4'd5:" W: H8 x- s) C* R, e) L
154 if(!(n==cols)) rom_addr <= (m-1)*cols + (n+1) -1;
7 o) Q6 N3 X& L2 U6 M" @' @* L% b155
( V1 Y$ H$ q- m1 k2 W% L/ q156 4'd6:5 [3 u( M( j: d! R7 U3 K
157 if(!(m==cols || n==1)) rom_addr <= m*cols + (n-1) -1; , n# ~, V9 I* I& s$ x; W4 B3 U- M
158 8 l5 _# W9 a: E( A% W
159 4'd7:
9 a1 \0 L7 ]6 P$ h) r3 N160 if(!(m==cols)) rom_addr <= m*cols + n -1;
# R) R6 N1 X/ O161
/ ^( n* {6 A. v# j9 a6 g: [162 4'd8:
( j( n3 X6 S4 o5 d1 j$ v* H163 if(!(m==cols || n==cols)) rom_addr <= m*cols + (n+1) -1; / E! p- |4 I# S7 }8 I% z# h1 y
164
g* d: a1 ^! |6 n165 default:;& s* A5 s; |- z) U( v1 |# L
166 5 i. C: O5 }1 M
167 endcase
, M& W1 h) J# {6 ^8 ]7 u168
0 r, |- o& }6 V169 always @ ( posedge CLK or negedge RSTn )
3 L$ A) }) a- ~5 v170 if (!RSTn)
0 S U. V a p5 ~171 begin& }# A, J/ j2 S4 H
172 a11 <= 0;
, l; Q. \9 O' N+ x173 a12 <= 0;
% w A$ o( f; E" ^174 a13 <= 0; 0 @& a( z4 H5 i
175 a21 <= 0;
8 N- k/ m/ s+ k/ h176 a22 <= 0;
! y/ s: f, r( w8 z. C% W2 C177 a23 <= 0; ! ?$ b) f% o, c# F
178 a31 <= 0; 5 a, O. E; Y, c/ z( y
179 a32 <= 0;) {0 U+ e# K B3 J6 L8 }
180 a33 <= 0;$ k2 y+ F2 ?' M% q2 x
181 end
+ |7 p( i( n# V! f; u182 else if ( get_9point_vld )& O& a$ Y7 F) M9 o* c) c/ r
183 " f& R2 b! w) }' D1 q
184 case (i)0 v& Y$ d" _7 V+ C: s
185 ! n( Z3 Q8 T% ?, C8 H( m
186 4'd2:2 i# i% v" |% _2 A$ |/ R
187 if ( m==1 || n==1 ) 9 U5 v2 q) s8 X* W2 c
188 a11 <= 0; 9 z8 o, C* K: M* Z& |4 [+ J6 v% f) O3 T1 Y
189 else - t) S. |; ~4 h, x6 `; n v* e
190 a11 <= rom_data_win;
W e9 x0 F: t6 a191 ( g3 g5 N m( H: E( C" s% o
192 4'd3:
1 c, v. `+ M3 \: o* A" j$ m3 B193 if ( m==1 ) a12 <= 0;
* x1 S( K3 M4 q, E/ H* S1 Q194 else a12 <= rom_data_win; - x4 t1 r) M, q: I" b
195 4 p* C D1 J3 p
196 4'd4:, q0 j$ C& ]; x% j4 `
197 if ( m==1 || n==cols ) a13 <= 0;
4 J8 J/ a7 X u198 else a13 <= rom_data_win;
. y% q$ {2 f Q. {199 : b8 W, s- A: d a
200 4'd5:# G' n+ }, }% h, e# R9 B
201 if ( n==1 ) a21 <= 0;
9 w) I ]% N% W! ^; q2 [202 else a21 <= rom_data_win; ! j2 _6 S( C1 }; {( L4 \
203
" f I# a: o0 G, y' ^9 Z/ a204 4'd6:
! V+ ]( r2 H: E1 m, d8 |! Z205 a22 <= rom_data_win;
* W. [. I4 G6 p/ H9 I; ^- t206
% j) p1 H2 i& ?207 4'd7:3 {# ^# I; b% U) o: a3 n
208 if ( n==cols ) a23 <= 0;
0 I: U+ L. K" E# z/ r& A; D+ y6 a1 D209 else a23 <= rom_data_win;
% R4 U$ N8 h# ?3 ?+ F9 K210 7 z7 i. x7 z, F* K
211 4'd8:
$ ]) R/ G6 E$ |! k3 f/ v212 if ( m==cols || n==1 ) a31 <= 0;
% s x- ^0 q& `2 }) s5 f213 else a31 <= rom_data_win;
. ^9 a+ k p, P; I+ N1 W214
/ R5 ]: R8 @1 Z3 X7 P/ ]' W215 4'd9:
' g+ c0 M A! N8 B216 if ( m==cols ) a32 <= 0;, o$ ?! Q! V/ B
217 else a32 <= rom_data_win;
% P* e6 B# y! j# |* B218 , }) }% d& ~$ A7 D
219 4'd10:
2 o8 T. B4 I$ n) s) i" w; a220 if ( m==cols || n==cols ) a33 <= 0; ) b8 h% }" r5 o/ C9 y5 v
221 else a33 <= rom_data_win;
" D$ x- f1 X* | ?222
5 p( b ]( A5 y0 I# x8 v223 default:;; I3 T, h7 {; `( q! _: {+ e
224
) z( d7 D( a& T225 endcase8 }: D& y1 k3 F: l, {' ?
226 0 @: F3 L3 A0 D: [ H9 S, U
227 /**********************************************************************************************/, N" L! M/ Y, g$ w e
228
6 H$ l, c8 w/ D' g229 assign win_data_done_sig = isWinDone;
5 Q+ G7 G9 ]+ j' m" ?% N1 u230 assign rom_addr_sig = rom_addr;. i* k+ [5 G) Z! N0 O
231
) Y- i, D0 D; V# T3 [232 assign data_out0 = a11;" q# _) r+ E" h4 z7 D& L
233 assign data_out1 = a12;
( h9 t3 ]7 {8 T% ]234 assign data_out2 = a13;
" f! T& B8 \& Y5 d. ^. [235 assign data_out3 = a21;
* f: t" ]/ Y5 R1 ~236 assign data_out4 = a22;
% K* s# {# f1 Q. g1 |4 r237 assign data_out5 = a23;
4 B l5 h2 T0 }% b1 }* d) I238 assign data_out6 = a31;* m5 Y/ F. b& P5 f
239 assign data_out7 = a32;
O/ N; d$ _4 k5 S* g240 assign data_out8 = a33;9 ]# T6 ^8 \2 Y0 `0 h. w. p) b3 p
241 5 R- f9 y# }% @, M
242 /**********************************************************************************************/ - ^2 I! s+ K- n( ]( y T1 I
243 * o8 l9 t( ?3 D: x% |6 u
244 endmodule
- h1 D9 F7 ?$ B- K7 j: o# {7 S0 v- Z g) T u) ~
) \: ^- O2 I. o# y1 @* v8 i( v3)计数器控制模块,主要用于获得中心像素点的地址信息。( d" \+ ~: ]+ T4 e
. u) D% o, h' X Z C3 ?8 n
(1)系统模块开始信号之后开始获取第一个中心像素点,注意初始化信号值和系统开始的信号值的区别;
+ r& V* _* F* ~" R. h$ h; c; Z+ W/ n( h
(2)该时刻得到的的数据将在下一个时刻产生结果,该时刻的数据并没有改变;
7 H' D% m0 d) M
$ ?, |& q$ U' t% `: I(3)注意中心像素点的行、列位置信息的计算;
+ U! h* h) _3 O# L( z6 u9 t
* e7 _ |# R. f. A: H' E% p9 R`timescale 1ns / 1ps
! ^( z( U3 o4 V0 f//////////////////////////////////////////////////////////////////////////////////
+ h* J! r9 q- L& Z2 L B- l// Company:
! e$ ~8 I8 `" x" A5 C// Engineer:
" t$ A2 I; ]( H7 P: N& G' ~//
2 _9 l; z( _2 S" r; x( f2 b, J// Create Date: # ]( U: |4 |+ p: [- a. k
// Design Name:
2 |* }5 b, z. D" H, R$ j& [5 b// Module Name: counter_ctrl
0 ?' p3 ?8 J; T9 j// Project Name: 9 N3 t2 j" [& W' h) ~& v
// Target Devices:
6 G, D! j' V2 x// Tool versions: ' e4 e. f+ d# } H: j. N. v% x
// Description:
' g8 w8 H* Y- n- R# f//
( l) j) @# D8 s: y( d) _// Dependencies:
" k& G x% l5 H3 K2 @//, b. w: j" u' l/ L' X
// Revision:
$ K+ {0 N5 Z, C# G1 R s// Revision 0.01 - File Created
k8 ^# c. g$ Q// Additional Comments: ( ~( a; r f! A2 g/ H, a- L. o5 m
//
! G' Q9 A5 P! q, f# K" Q. B s" D8 n//////////////////////////////////////////////////////////////////////////////////9 _9 h" |) i$ [ v: D+ ~! x+ c
module counter_ctrl(0 |/ Y# M1 Q8 s6 a# p
CLK,/ g. q5 ^* Y; n) [% u s
RSTn,1 p* Q- w0 V, W
start_sig, //input-from top
9 o5 p2 a# b4 z2 w( s4 F, G nxt_pix_sig, //input-from --start next center point pixel
' P( r. k3 H2 d' ?, C- n7 g, K* Y0 F cols,
* K' }/ Y$ V5 e$ ^4 M/ f- H column_addr_sig, //output
- E5 \" z+ U( C0 x# E; a4 ~9 R row_addr_sig, //output-to . |" j- @8 Z6 s6 h ?
pix_done_sig //output-to
& u. D0 V# l6 \* B );
_. W2 @. ]: D! M- o8 ^* S6 |# y5 t6 C% ?. x
input CLK;
# k1 M$ F2 ]9 r- I8 y) m input RSTn;" _" ?' C: e4 {# s, w
input start_sig;
% P, E! B9 @! E input nxt_pix_sig;
* G2 g* e- n1 Y% e! i' g input [9:0] cols;
5 q; ]# @, h" G4 i8 ]2 @, ~ D6 |7 S) L8 z, o- H: M
output pix_done_sig;
1 m4 D; {" u x4 H( ]! v3 a3 I output [9:0] column_addr_sig; 3 J: E) v0 \% M1 `9 }
output [9:0] row_addr_sig;
+ D- q$ K) F! O$ b( |7 W- H, ~3 o* h
/***********************************************************************************************/
V' A1 s5 Q* I* @% P" C! p' M c+ o) d6 D- @
reg isCtrlDone;1 w) k+ u8 w3 c! S
//reg isWinStart;
% D- k+ [& z8 E reg [17:0] imk; //The k-th pixel of the image* T0 D5 H' A2 m) L
reg [9:0] row_addr; // The row of the centeral pixel3 A& Q$ W5 P- U+ ^2 D- p
reg [9:0] column_addr; // The column of the centeral pixel7 N4 B5 Z. f' |. i7 H* n
6 K; U, L1 C+ g; y$ T+ R" z5 v J$ W1 @
reg start_sig_d;: a6 a. I3 T& W2 ]2 j, Y1 \
7 K/ E! C) T7 _: t0 C h
wire start_sig_rising_vld;
1 v a; f# p+ ^' g" m0 k" i8 c2 A/ G) x; {2 Y, z$ V! c5 x
always @ (posedge CLK or negedge RSTn) //Asynchronous reset
- Z Q ^) ^. h6 e# T1 U if (!RSTn)! A; F* @8 F9 v# {. t h
start_sig_d <= 0;
( L6 C9 u- ~8 G. l else
" i, N g, [* w8 T start_sig_d <= start_sig;3 ~6 ~0 ?- j8 X3 ^, K8 U4 e
. Q7 x$ B1 {5 L7 ?" y+ J
assign start_sig_rising_vld = start_sig & (~start_sig_d);$ |4 H* ?5 F2 \, ~3 [: {6 Q5 R# k) N
8 q+ f( t$ a0 c; h always @ (posedge CLK or negedge RSTn) //Asynchronous reset6 ~& d; A3 @. k* v" z
if (!RSTn)
; |4 G, G3 U1 \( J! W; D1 i begin 3 B/ R6 m6 r; |0 y+ M
imk <= 18'b0; % N; \2 @# _! m" M: O+ p% L( k
column_addr <= 10'b0; ! O) I' b, u& ~/ k- x" w$ p
row_addr <= 10'b0;, i3 d+ m4 o% }4 h+ ~
isCtrlDone <= 1'b0;
* e& ?& M8 k+ s K2 }' b" m; m8 l end5 @1 u/ j1 r3 v6 b. p+ T( D+ S
else if (start_sig_rising_vld)6 R* ]! r. d7 t. a: b
begin # K+ K0 ~& U/ E1 [3 d
imk <= 18'b1;
$ B6 N# K3 A3 Y! H, Q# ~ column_addr <= 10'b1; 9 i' p3 _! p/ V! ^1 _
row_addr <= 10'b1;. X6 D" ~+ _ S" A8 d' m
isCtrlDone <= 1'b1; - R; z& v3 i8 D3 n. ^5 C, ?* D H! T
end
: @% `; E7 H+ H" R else if ( nxt_pix_sig )6 U/ U9 F" e2 p0 T0 r- F
begin
" u8 w) D& s1 x ~4 O imk <= imk + 1'b1;
$ Q x$ g) k+ {/ E5 C row_addr <= imk / cols + 1;
" R$ n! t* u/ x column_addr <= imk % cols + 1;
8 {9 a: i3 `+ p) q isCtrlDone <= 1'b1; 2 k1 e7 U R; \& z9 U' i
end
" p* Z1 i( h" l! \# e3 I) [ else isCtrlDone <= 1'b0; 9 C; v* Z3 w* {( f
& d' e( p; _2 X) G" ~
/*****************************************************************************************/
* R* U- ~0 v: R! y( k
+ A+ N- p8 W- X+ Q1 z& C assign row_addr_sig = row_addr;
; L0 w% @/ a2 R! G4 B assign column_addr_sig = column_addr;
% K, s% n6 ~5 W# P assign pix_done_sig = isCtrlDone;/ O5 h2 u _+ f/ H$ S7 K, {' Z
5 t/ y' W. }# G: w8 ?
/*****************************************************************************************/
- z% Q8 j3 P" [6 sendmodule
$ E0 @* [/ h* l1 b- L- x0 U. J
! ^ b+ J; R+ I' D: e4) 3*3中值滤波模块4 l# u7 T( |9 E
E L. N6 @$ n) t) T5 `* S' N* |功能:得到某一中心像素点的3*3滑窗区域的灰度值的中值,作为中心像素点的值;
% b0 E/ T/ |5 v
: Z& t5 k( c: t- g中值滤波原理,网上有很多,大家可以查看一下。
+ D7 ]6 x; W0 k9 w$ z7 b- I3 _$ n2 b+ T- q
本项目采用的是快速中值滤波的方法。0 l# i; M0 Q3 ^1 w! m& m
/ u9 g+ h3 U( H9 F(1)若是3*3窗口生成模块完成之后就计算下一个中心像素点,需要将该中心像素点的窗口元素锁存起来,以防计算过程中将这些元素掩盖,不能正确进行中值滤波的计算;: A5 e" y% W5 ]- u, T
r6 q& u; b8 R' h* J) R$ o' ]
always @ ( posedge CLK or negedge RSTn )& U1 O g1 x9 ?( G; i% p3 A& d
if (!RSTn)) t' j2 ~5 w8 b& A
begin
3 S' {6 u. Y# s2 s8 b2 } a11 <= 0;
7 I9 J# o2 r C( ~6 x& M7 R/ ^" _ a12 <= 0;
1 j$ C9 w$ k. s$ b# Q5 s a13 <= 0;
5 K! T1 L* T+ @5 d- d$ m* o. O a21 <= 0;
/ U& k, H+ \8 v0 C a22 <= 0;
: Y8 _! `$ a9 h' R4 T- u a23 <= 0;6 A% G- \& U. D+ f; k
a31 <= 0;
, |" f; {: o+ _& c a32 <= 0;
, v, g% r; E0 p# ? a33 <= 0;' ^$ x5 m6 _! p0 y# M" g
end, j3 S% P6 N0 [+ R
else if (win_data_sig)
5 k. t9 w( i1 F9 n begin5 j1 U( s" F% u; N* K& k7 ^) A
a11 <= data_in0;
5 C% e0 `, c3 Z0 _, E a12 <= data_in1;
8 d+ F2 x2 E; _0 v) R) ?' `, k a13 <= data_in2;. j- C6 j1 L7 m' ]. b+ J) N
a21 <= data_in3;
% E: m8 j% i# Y+ m' P6 c, t8 F a22 <= data_in4;
. Z" D" x! Y5 o) B; Z a23 <= data_in5;
: E1 O+ G" T) S+ I& D a31 <= data_in6;
5 A: `! q8 n$ J" O: A a32 <= data_in7;
$ a5 z0 S/ G; F# O) ~9 m0 I- D5 d a33 <= data_in8;
8 A1 B; S) m# V; [* T' m end
$ W4 P- N' R+ q. W0 K) O5 i/ M G. h3 B5 R7 V# l/ ~" C
! M& }8 H+ u* M2 `" S8 P
(2)需要在时序的有效区域内进行计算,怎么设计信号的有效性;, e& z& m& ?- \* g" S
% ]; B$ W. e6 @
always @ ( posedge CLK or negedge RSTn )3 Q- z" t' e9 |/ d' ~7 J
if (!RSTn)
9 @9 l9 P- J# G' |! G+ _2 d( H cal_vld <= 1'b0;
: R* t! R9 p, K' L5 P* \% P else if( win_data_sig ): ]& t2 L$ h" |( C( C
cal_vld <= 1'b1;
1 C6 D6 V W) A- { else if( i==3'd3 )
) Y2 D" i! y7 M- Q2 P$ T cal_vld <= 0; / h- B0 @9 M6 X1 F) b8 s# x8 S
% U$ ]& R) ^$ s( q3 ?* [' |
2 h& \; Q- `6 Q(3)仿顺序操作可以分开进行;每一个时刻只进行一个操作,这样可能更明了(代码中没有这样做);/ O! p. T# F( U5 u
8 d/ R$ U% S5 [
always @ ( posedge CLK or negedge RSTn )
, J9 N5 F) C) l3 z9 P7 t. E! A if (!RSTn)
0 m5 G. q2 I3 ?, @% A- T9 e i <= 3'd0;( M& z: o* z( w; y4 D9 u6 l f
else if( cal_vld & ( i!=3 ) )
' h) G' \8 P3 { i <= i + 1;! H! j l$ [! o5 }; d' |) y2 J
else
# N8 a: q4 Q2 D# A i <= 0;
, ?4 S. w$ f6 n/ x* r7 s& k! ]2 Z$ @% @5 ^! O0 E
(4)verilog编程调用函数的方法,指出输入信号,函数内可以使用其他定义声明的信号,最后的输出信号作为调用函数的结果(突然想起来,如果输出信号有多个元素呢,又该怎么办呢?大家可以想想);7 A8 \( _- _: T6 W8 g' f
/ t% l; h! s7 c' F9 jfunction [7:0] max;//if the data is signed number, please add the char signed behind key function;
: |' ]7 J1 C4 a6 m input [7:0] a, b, c;
1 R5 Q% n2 s+ \( q+ y begin
) }. R7 U4 j' z8 ? ^/ @ max = (((a >= b) ? a : b) >= c ) ? ((a >= b) ? a : b) : c;
" {1 J! g ^. A) F end* r# X: u' x5 `6 S0 c6 y& w
endfunction
+ m, F. b( X) o
' U5 [: x1 N$ k* X: {该模块的代码:2 `3 Y0 Y3 \( _: G/ V! \" V+ F
`timescale 1ns / 1ps$ i5 @0 A: g/ N, Y( [
//////////////////////////////////////////////////////////////////////////////////
9 ?# s7 C4 i: _$ Y// Company: 8 R) k/ H. {! \% `/ u2 f4 s- J% H9 A
// Engineer:
, v, V5 H2 ?6 R) e/ ~- o ]//
9 F! A. z- x& D% a& d// Create Date: 2 q5 z6 h Y" T: Q+ C* I
// Design Name:
7 W! ]9 E; C3 y// Module Name: medfilter3by3
4 P5 t6 a; e' w) I7 }8 l) V0 l$ @// Project Name:
' B8 R" z+ J! i- M8 q4 W$ ~" u/ N0 ?9 m// Target Devices:
8 x. v' V/ _ m" ?* N1 ~! G// Tool versions: ( a$ D2 r/ ]( n3 N+ k" t
// Description: 9 k1 ^3 z7 i/ c
//
4 f0 O- ^# J$ ?$ B7 T( w* x* Q// Dependencies: ( u" J+ s+ U2 K+ g
//
! s8 `- d- p) w( p5 Z// Revision:
6 f7 t# b0 I0 C+ P8 R/ i// Revision 0.01 - File Created
7 k6 p/ j; Z) y( t4 \7 f( G% i+ r// Additional Comments: ) p0 K k& x$ ]. _& Y
//
# |" {. U5 m4 Q0 N//////////////////////////////////////////////////////////////////////////////////
7 L6 v2 J0 \% Hmodule medfilter3by3(: N3 {7 M: ^$ D D
CLK,
8 R9 Y/ M2 A+ t$ j7 f" K. f RSTn,
& ?5 O5 P$ U' Z win_data_sig, //input-from module of win3by3_gen; 8 v' H2 D: ^" w/ }3 ~
medfilt_done_sig, //output-to top;$ u8 \" ~5 R' I j! E7 b6 }
data_in0, //input-from module of win3by3_gen;" {1 K z8 j2 ~. W& V4 l
data_in1,
( x/ v7 X9 r. b* V& [' }' W3 p data_in2,% K9 E6 L0 x- x0 {+ Q( `5 ^# \
data_in3,
3 T/ J: q1 B1 U- N. p data_in4,* r2 p U4 S# |/ i
data_in5,
' a% B" ^; S+ x2 F data_in6,- g# ?. v& s6 G5 f
data_in7,4 t4 p G( `0 k- u ~1 p0 s8 E
data_in8,3 _# X0 P& p% X2 r+ l3 Q
medfilt_data_out //output-to top; ' K- P) }, r/ A8 m) l! L
);
/ @+ @% V0 n1 d- W5 B; C7 [0 [- E* G! }& [9 c
input CLK;- U" \3 p2 W4 d0 @4 p! \, |0 l
input RSTn;
6 V4 R3 o6 @/ O! v input win_data_sig;
9 W8 o' c! S! g1 u& d input [7:0] data_in0; //output-to ;
5 j7 e0 B1 U6 S5 i5 v0 ^. B input [7:0] data_in1;
( O0 e5 X. e& @& b/ x1 S input [7:0] data_in2;$ J( M* X) V% H0 x" j8 Y4 R7 h$ D
input [7:0] data_in3;
. K. b' T6 w Q: k input [7:0] data_in4;4 Q: n$ k- q% U/ N0 I, A" ]8 N9 J
input [7:0] data_in5;% V" g( r. W1 F ]2 m( _
input [7:0] data_in6;$ W4 }% L6 M5 e4 z
input [7:0] data_in7;
8 Q3 U( t* _& ?4 e input [7:0] data_in8;9 U9 u' @+ `% N5 b8 u2 |7 {
) Y( f( z* ?, e output medfilt_done_sig;
2 s/ ]3 S* Z! {& ^ output [7:0] medfilt_data_out;
# l6 H* x# d/ Z$ o" X* x, X" W! O' y4 K9 e6 U; q1 K% h
/******************************************************************************/ + o" D8 P5 O8 i4 e2 O M0 g3 `3 V0 G
reg [7:0] a11;
4 j" S. y+ }) Y7 F, H( p reg [7:0] a12;
7 C8 q( g# g9 Y reg [7:0] a13; X4 J+ I% v0 o+ F% @
reg [7:0] a21;' _8 G9 a4 q; H! Y, L; c. p5 V* `
reg [7:0] a22;# v u$ q. @0 P+ p
reg [7:0] a23;
- v; S8 b* ^+ B6 R+ C reg [7:0] a31;0 p* E7 `2 K% q& I: N
reg [7:0] a32;) f. d, C1 w9 Q& @+ V$ ?1 g- ~" o
reg [7:0] a33;: T3 n5 x4 A$ \% U/ V, W
* o: }& C2 t" Y: L. p reg [7:0] b11;9 J, X2 u7 ]5 x
reg [7:0] b12;8 n& a9 L S1 W/ I0 U0 C8 v) D
reg [7:0] b13;' w( H6 g- I4 |4 I+ O
reg [7:0] b21;! o( ~! C2 e, Q5 X
reg [7:0] b22;" n, [! p, Y$ G! ^/ f; R/ C9 M' f
reg [7:0] b23;
2 O* p' J: y) \ reg [7:0] b31;; _9 ?8 ]* M$ M T f
reg [7:0] b32;' b" p7 n/ C7 U: o" ~8 z
reg [7:0] b33;& W! p! S. x3 x$ s0 Z% g7 t/ I
9 b8 i' M& N/ T! H) S reg [7:0] c11;
( c1 [! A' j N9 w reg [7:0] c12;8 T" a5 w8 P" O% w% w0 D
reg [7:0] c13;. Z. y6 c# W j
reg [7:0] c21;
+ C3 j0 I. B- X reg [7:0] c22;' a3 a1 |8 _' h6 j4 ]+ R* n
reg [7:0] c23;2 A9 U$ X% z. C8 U$ G1 ^
reg [7:0] c31;) O: i. [- W0 {% Y
reg [7:0] c32;
8 L; m x( [0 e/ O reg [7:0] c33;' v) w3 G9 h" x2 @5 \
9 A3 I; f4 w2 t& T9 j* d reg [2:0] i;
) @' |! o5 i" J9 D reg [7:0] medfilt_data;% F# n* q4 \/ h
reg filt_done;
$ ?$ F" v/ v2 l2 v$ {. y2 g+ D2 N4 X0 M( ?3 z
reg cal_vld;
+ c$ m" I# z% u. V6 z- F/ ^* F) u1 I+ E( N
( J8 z. ^: g/ ]0 n' J; l2 }) Balways @ ( posedge CLK or negedge RSTn )
3 E5 _/ |8 B% n if (!RSTn)
4 ]& d+ E8 ^$ N" {( D5 g begin( p$ `* b* J. K& _5 J
a11 <= 0;
' D7 ^, P5 f" r/ G! D( j& m- I a12 <= 0;
& v n3 C3 ]0 U6 S3 l a13 <= 0;
- f! J+ D+ Y, g* r a21 <= 0;8 y. ^1 P& i5 P1 h
a22 <= 0;4 |2 o$ H! H1 o) X4 f
a23 <= 0;- `5 e2 v1 {0 y! @; Z0 r
a31 <= 0; U: Z9 X0 u$ Z4 o( O
a32 <= 0;
f) {& v( k% _; z" N1 n8 W a33 <= 0;# K4 a8 L/ }4 I" x/ I$ ~# ~
end
% L0 a% }& q; V1 o7 ~4 B X else if (win_data_sig)$ P& E' @" M# l' ~( K/ o& I
begin
% X% K& g+ ?" ?# H, f a11 <= data_in0;# o( c& O: |9 R, x" x6 s. [
a12 <= data_in1;
, T9 n' `# {$ [1 o3 [, ^ a13 <= data_in2;
# t+ Y8 H' o# }/ j a21 <= data_in3;( ` K3 \4 o$ U# ~2 h/ K
a22 <= data_in4;) B+ d7 l! R6 c' S3 R
a23 <= data_in5;
- a: }$ e4 {! S a31 <= data_in6;/ ]! N7 _+ D- \/ K/ }/ e4 x, L
a32 <= data_in7;$ q) ~' G: v, k& @) T
a33 <= data_in8;
9 v, z/ Q5 L# ?" R9 \) J3 u end r$ P0 a8 X' x' ?: T
# V" k/ B3 ^: D1 W- _
always @ ( posedge CLK or negedge RSTn )
0 E/ R# y" q+ ` M W if (!RSTn)7 d+ r+ O8 D( A% [' e( m
i <= 3'd0;
* w- f( Y, r' \* l# G else if( cal_vld & ( i!=3 ) )4 Y4 m! G0 n g) U8 Q1 r
i <= i + 1;5 Y, O$ ^2 m* \
else
5 V8 O( b+ n( T, Q i <= 0;
& [; r; `$ r. u* h& ]
3 n$ C1 a/ E# B7 R! |- M- r: J* v" r6 d always @ ( posedge CLK or negedge RSTn )
! E, c' N/ A) X' L9 A if (!RSTn)
0 Y3 X% [6 R) d+ ? cal_vld <= 1'b0;
5 y) i7 u, g, r else if( win_data_sig )0 x, Z% v1 i2 f* y
cal_vld <= 1'b1;
3 ^0 g" Z7 u$ B. \+ ^ else if( i==3'd3 )
8 k F* i* v4 @8 O cal_vld <= 0; 5 j: Y u; \9 l4 D
4 {- k y; O8 T* E8 [2 R- P
2 T# S$ P, o! @- h+ `6 n always @ ( posedge CLK or negedge RSTn )
w3 X( ], q! |5 P( a6 c0 ] if (!RSTn)
^( m+ E8 @: y r begin: T+ n) K; U- @$ _
filt_done <= 1'b0;8 A- P' `$ l: W2 I+ s4 y
b11 <= 0;
% E/ A- s6 m8 ?. ~4 z6 I b12 <= 0;' L! _9 v4 M9 C7 C
b13 <= 0;
_- c4 H! W" [' D b21 <= 0;- S2 S9 V% G, r. E5 t
b22 <= 0;
+ e+ C; R% S* |5 ~7 e, e b23 <= 0;: O$ ^7 e I9 Z9 X3 S6 T0 f. A0 b
b31 <= 0;' b7 ]; j# D, v$ O
b32 <= 0;
" X( A% i) j+ h1 Y b33 <= 0;1 K8 F! a$ J5 A7 a7 k
c11 <= 0;- I) S' a0 h3 L% Z5 R2 O
c12 <= 0;* T7 _* f7 [' t
c13 <= 0;
( }! Q, e1 c2 T( X) C c21 <= 0;
- a8 L' L3 ^3 J+ L- T! L2 O7 u( i, n c22 <= 0;
+ Y7 i" r( \8 Q4 q$ l3 ` f c23 <= 0;
6 J G0 A' C1 K$ a7 r, U c31 <= 0;
* n7 \3 ]" F2 v/ A, G3 B. ?- D9 b# D c32 <= 0;+ q% p2 ^3 o2 \1 b$ z. o) S
c33 <= 0;' n( d2 u5 ^7 I( l# U& `5 Q
medfilt_data <= 0;
* `3 R$ h0 n5 a5 B0 |9 N end, B. c' D. J( t b: n- N
else if( cal_vld )
1 g0 R7 l8 n) ~ I: O, x; [ case(i)3 l7 ?/ ]8 O( J# Q$ O N% o5 Q
3'd0:/ H: H! T* w+ _6 [
begin
, }4 `, C0 U6 { b11 <= max(a11, a21, a31); ; s* ?) ]5 v7 I, L% R
b12 <= max(a12, a22, a32);
; j _9 f6 k! h2 t* | b13 <= max(a13, a23, a33);
! u2 V) C2 Y- f& Y b21 <= med(a11, a21, a31);
( r' |2 w5 }4 g A) q b22 <= med(a12, a22, a32);
5 h; p2 H) s# \3 }' m, q4 h. E* W b23 <= med(a13, a23, a33);
0 X4 o0 c& f- X& [% x b31 <= min(a11, a21, a31); 9 L# g0 U; C z: D
b32 <= min(a12, a22, a32); 6 C# E2 e7 x; Y0 }4 V) C
b33 <= min(a13, a23, a33);0 T' L! U+ H6 n: G" U; \# H: F% Z! S7 J/ `
end
3 D7 Y/ v# ^ G7 M
" b* I4 ]4 { r 3'd1:
( Y; @) {# H% m2 U8 H begin
+ ]' w9 F( v& y& L& u c31 <= max(b31, b32, b33);
1 A1 b' B! T( d# ^' R, }* j c22 <= med(b21, b22, b23);
; ^. ]/ X9 ^9 x$ K7 i2 G c13 <= min(b11, b12, b13); , G! U# ?* Z' r5 ]9 X4 \
end; k0 D3 i' E/ N! k
8 ?& X2 n ?, f& Q
3'd2:4 R" B/ r% B% `9 F1 k
begin% k% P4 h. s2 H5 V" S; M$ y5 |
medfilt_data <= med(c13, c22, c31);
3 E8 r2 I0 O7 ]' |& A' z/ t1 h filt_done<=1'b1;/ d. O1 {: n% v& j) t
end O3 {# o! }5 F* U
1 q1 _2 k9 t4 k# Y
3'd3:
5 a2 ~3 H! \5 h- f, Q( H9 m3 C filt_done <= 1'b0;
* w, ]2 a5 q' k$ ?1 t+ w. j* t9 R6 f e) B7 H
default:;
, n8 H z. _' G# P C3 v$ W' h5 K! _, r6 C: @+ b; z/ Q
endcase8 l; I) }3 g" j* y
$ ?' u; o' M, ~
/************************************************************************************/ ) ^( H2 F3 {0 z; Y m* A+ P1 V4 Y
6 X' q( m6 y! z# g" c* d+ L
function [7:0] max;//if the data is signed number, please add the char signed behind key function; " r% ~" |% n1 `/ _- X
input [7:0] a, b, c;
( w7 _8 l+ `+ z$ s( s) D3 s begin% g- ~2 A9 e7 L& L8 J5 E8 b
max = (((a >= b) ? a : b) >= c ) ? ((a >= b) ? a : b) : c;" {2 i0 s; B4 u! q7 K
end4 K- w3 ?6 B! t8 W& y
endfunction
4 R( W) K( W" W0 {
& J7 b0 `9 S8 X! Efunction [7:0] med;
3 ^: K& a b4 e& [" ^ input [7:0] a, b, c;; I3 |- n, S! |/ r, ^& h8 a) l
begin
$ X9 U( H! N2 R med = a < b ? (b < c ? b : a < c ? c : a) : (b > c ? b : a > c ? c : a);1 a8 ~$ l2 d7 H& O! J
end
) l6 p8 A; l' S* r0 d( y8 z9 xendfunction
4 m4 I! z; @1 m5 ^5 x9 i2 J$ C p. |+ F! M) G* `6 i
function [7:0] min;
' s: {! w1 M3 j* v2 X0 z0 k input [7:0] a, b, c;
d/ K0 s; r6 |+ r e1 Z. d begin. \* m# W; K% _+ @5 D
min= (((a <= b) ? a : b) <= c ) ? ((a <= b) ? a : b) : c;
3 \" W6 l8 p& { end6 u7 |" Q0 `0 A' s
endfunction/ w" \ @ [& Z; b) e( ?: d
! h- z2 L. d1 e) d6 ]4 F+ C$ j
/************************************************************************************/ - l- A. m: a- ~% w- E8 c1 ~
! h8 [# v/ k- ~( P3 t# }. a
assign medfilt_data_out = medfilt_data;
! ~( e% n/ v1 D7 s' @1 }; b assign medfilt_done_sig = filt_done;
+ V6 }. O1 j! R/ V. ~" s9 @ m: e" H: H
/**********************************************************************************/
2 K- X0 h% Y2 A" {/ [, y3 f2 N5 {: ]' L7 L
endmodule
6 b9 u: Z \6 G
1 s! N$ g: z. N7 Q7 @4 u5)顶层模块,用于将低层的各个功能/控制模块衔接起来,得到结果;5 c: E) w1 a/ {4 O0 ^
) `/ r4 `3 b9 O" R7 f" E' e9 L注意输入输出信号,以及不同模块之间是如何进行连线的。
* \4 @$ b l) J" l) s7 C$ }! t5 d+ X- M$ z# x8 c& l3 k
信号的名称尽量有其特别的意义,不要重复使用同一个信号名称,容易造成混乱;" J& r7 K# w& O. ?$ I$ k
/ {" M+ Z+ B, j% _6 h# M区别wire和reg类型数据的使用情况;
6 C7 T0 d* k) O% p) l
- c$ U9 E/ ?) Z$ C6 n3 V`timescale 1ns / 1ps
* h+ I3 M: t, z! r% \" ~ h//////////////////////////////////////////////////////////////////////////////////& x5 A% S5 j- a( g. O' Q
// Company:
. A9 u* i7 R) N Q* n. C// Engineer: ' ~& m* Z5 d5 Z/ r$ e- m6 o
// 7 m% N7 _( \' S
// Create Date: ' d+ L4 c3 A+ S4 Z- _! k
// Design Name: 0 \8 g+ W! g5 z/ L2 Q+ q6 q5 e0 c1 G3 ?
// Module Name: medfilter2 ; M" X) M# Y7 R; X7 i8 t
// Project Name: + T5 b( _" g2 O) n8 I
// Target Devices:
& M% g4 r* j6 [+ o6 n' D' z// Tool versions: 1 u+ g; \2 E, d
// Description:
3 ~0 t; B* }! ]8 T0 H* I$ W//, p! N) v' {# W- G8 g# M9 O
// Dependencies: # P, I7 y# f% C, a0 ]9 V
//; r: k B. y8 M8 R& r Q2 y
// Revision: # w, p" a9 Q1 W4 a" |
// Revision 0.01 - File Created; F* {. F$ ]9 F$ G! F2 t
// Additional Comments:
2 L7 H n6 T( d$ V1 I$ T1 V4 p- W% ^2 c+ `//
; F7 K y6 y; s# F" Y: \//////////////////////////////////////////////////////////////////////////////////
8 Z7 i! z8 E: x. G/ c% P& g" V; [- p6 n- y& [3 f+ V! w
module medfilter2 : a \* D- o4 R, m
(3 r) V. B( K! f8 X. Z
CLK, V+ k, g: ], ]) Z. q8 B4 j7 E
RSTn,) w5 i5 T- b% v1 s# a* J0 L, |5 `
Start_sig,
7 U# `6 d% g! m9 k! z Done_sig,3 J) Y) \) o$ ]3 X) Z- e+ @
Data_out
2 ^* ]! B. D6 W, l);
- D* B$ B7 S4 \9 M& g; p6 E7 x& B$ l0 ?5 J8 X; X( |2 p
input CLK;: }4 J/ u) V! f5 k0 T. A
input RSTn;
0 ?" ^4 f, M$ k# d; \ input Start_sig;
/ T' r! C3 }6 O) I! t$ @ output Done_sig;: G! t! q7 }7 u. A9 H9 D3 p
output [7:0] Data_out;
1 _9 A2 f% r% A m5 m- C& u% k" W9 [. x* U; C M* h6 F+ P# m
/********************************************************************/
6 Q! a# q0 D: T$ l$ w8 a! u6 P# v# J
wire [17:0] rom_addr; //
& f0 X0 ]0 X! q. F# j wire [7:0] rom_data; //
. Y# m$ q5 x; k$ f+ h! W
. z3 o' {3 P8 _ rom_512by512 rom_512by512_inst! q2 N* U# w1 n" J
(
# R O3 J/ \- z$ N c; W .clka(CLK), //input clka;
; g) S! c) ^1 ^0 T) ^9 m .addra(rom_addr), //input-from;
% N* l; A! ~0 g' K8 I6 H, C% K .douta(rom_data) //output-to ;
% Y! G! D& d# y% {! i );9 C6 N0 b5 E4 U2 h
8 L& I0 B% \4 r/ X8 n" x) ~3 C
/******************************************************************************/
' ^9 q) D% s% V4 F% I5 d7 }; v6 Q% d
//wire [7:0] win_data[8:0];
/ i( t$ S; y9 P wire [7:0] data_out0; //output-to ;
8 C1 m" W' P, O; h: U. [$ X/ v wire [7:0] data_out1;9 B3 v2 m' U2 D8 @! H8 M7 ]
wire [7:0] data_out2;
& P5 p1 q6 w& w# ~: V7 | wire [7:0] data_out3;% a' Q$ n" Q F9 b
wire [7:0] data_out4;# p+ d/ F" p* D. b) q- i. D1 J& Z
wire [7:0] data_out5;
2 e; p* R8 O! F0 `9 k wire [7:0] data_out6;! Y, |2 j5 ^% c: C; c
wire [7:0] data_out7;! y3 V& q$ v+ W6 U* ^
wire [7:0] data_out8;3 d. s: n! _$ {! n$ z- r3 l6 D
wire win_done_sig;% ? F6 Q& G: a, k
# C/ q) |& F% O3 Y0 ?1 Zwire [9:0] column_addr_sig;
( d. H" P" [' d# K6 vwire [9:0] row_addr_sig;9 V* P$ ^* Z8 Z- Q9 t( q3 c! a+ j
$ g _) I7 q! \9 J7 w$ Z# N
win3by3_gen win3by3_gen_inst (
) c6 M7 K. T, S; U .CLK(CLK), 7 b7 z4 L& O* S' K5 R
.RSTn(RSTn),4 |5 F& o; ]9 E+ b0 f
.center_pix_sig(win_start_sig), //input-from ; 6 m- b# U9 A9 O: g+ x& p3 u
.cols(10'd512), // the column numbers of the input image
% @. ?8 u' I. O" h .rows(10'd512), // the row numbers of the input image
) M2 ?/ k G3 r& H, G .rom_data_win(rom_data), //input-from ;
6 A1 q8 R2 j4 D3 _. d i! @ .column_addr_sig(column_addr_sig), //input-from ; //output [9 : 0] addra; ( F: U* H( J, ~# O3 o
.row_addr_sig(row_addr_sig), //input-from ; //output [9 : 0] addra;
7 l8 I8 z% v) C/ h2 q' u .rom_addr_sig(rom_addr), //output-to ;
6 }2 K$ J1 ^% f! p2 g* L6 v .data_out0(data_out0), //output-to ;
. E& n3 ^& V1 {3 \- ]- Z. R( Z( G .data_out1(data_out1),
6 v D* H7 h5 @& K .data_out2(data_out2),1 p8 [8 N3 ^5 {$ ?
.data_out3(data_out3),! `0 P b3 w8 Y) F
.data_out4(data_out4),4 i7 T! m( X# S% x
.data_out5(data_out5),
! } `* P9 Y2 d. m( D# t .data_out6(data_out6),
. A. C, S; ?6 m; q/ T0 E .data_out7(data_out7),
6 t% \; l9 n: L; @ .data_out8(data_out8),# k# z; {' Q# G4 m% a! ]
.win_data_done_sig(win_done_sig) //output-to U4/U3; 8 w8 D& u9 R1 `$ B: `
);
; c6 W' E* \. X/ ^' r8 U9 F# _$ X
" }# Q& h# Y' I /******************************************************************************/ # }6 U( f5 f% [, j3 [4 ?* D% t
& G( t8 w2 F T& {2 a7 u
counter_ctrl counter_ctrl_inst(- I" ^" C# _* p5 l
.CLK(CLK),& [) [+ Y! a" _5 H8 F7 G
.RSTn(RSTn),% s& R) k- ?! i5 R: ?* g: z
.start_sig(Start_sig), //input-from top
; f6 f* b" p2 n$ a6 v5 K2 p0 e .nxt_pix_sig(win_done_sig), //input-from 8 h4 G# S: l# y
.cols(10'd512), 9 E5 V6 K j4 y1 \5 R
.column_addr_sig(column_addr_sig), //output-to
/ c& K2 c: V) f) ~ .row_addr_sig(row_addr_sig), //output-to
+ D$ ^1 [# r, P2 t9 J: `3 L .pix_done_sig(win_start_sig) //output-to 4 t1 w6 ?4 V O4 d
);
* B2 G% W% t E$ P: R5 k
& m* a# q5 a" {6 {! F/*****************************************************************************/5 [# i. y, B, s! y
w* W6 Y8 A3 R# Y# D9 Wwire medfilt_done_sig;
2 |/ @2 v o0 d n' B$ Fwire [7:0] medfilt_data_wire;) ? @0 ]' L! ?' D# z
# I, X' O9 V$ t+ q& tmedfilter3by3 medfilter3by3_inst
6 J3 t6 ]3 K) \* t8 S4 @ }. m0 l(* ?5 Y% T" v. H% R* h# [
.CLK(CLK),
9 G1 f! ~5 {; q+ r .RSTn(RSTn),
/ ?. M# A4 }. W .win_data_sig(win_done_sig), //input-from; ! y! i# \4 B6 b6 U3 K
.medfilt_done_sig(medfilt_done_sig), //output-to;' g, d! A0 L1 ~2 b
.data_in0(data_out0), //input-from ;
$ i; b0 m: T3 X5 J5 J .data_in1(data_out1),# ~8 [, E3 H+ ~+ v) U. Q
.data_in2(data_out2),' l R; Y; i! _
.data_in3(data_out3),' d4 T; y- O& V* e; t
.data_in4(data_out4),
+ S* p, ^4 _% U .data_in5(data_out5),
, {/ j; v5 }. Y$ } .data_in6(data_out6),2 P/ N$ y, J0 N+ R/ ~3 p$ y ~
.data_in7(data_out7),
- `. h' J+ ?8 z( W0 K .data_in8(data_out8),) H7 |$ J; F1 T+ E) \
.medfilt_data_out(medfilt_data_wire) //output-to top; 3 P1 S* [- I1 F' q8 @
); , X X$ R0 Q _; \
5 M5 |1 M0 t2 g+ F r6 E# J9 J; O8 K/*********************************************************************/
9 j4 X, y- F( S: Y9 z2 i7 z4 Awire Done_sig;
4 \- d- @5 u2 [1 _6 H. V6 ~wire [7:0] Data_out;
- w- d4 m3 P' Dassign Done_sig = medfilt_done_sig;
- T+ G: d# G7 N* u9 Z2 f/ W5 Nassign Data_out = medfilt_data_wire;% N, [1 ], H N1 U; D
1 K9 p7 O, q; E* E5 {/**********************************************************************/
+ c9 o# D' T; {- E0 ~3 [endmodule
0 N5 M0 y6 @; a7 Q# p9 W2 X- m$ p' i6 j
6)测试模块
0 C1 f4 }) O1 J; i; w8 E% i" [: \0 m2 L
如何将数据写入文件,需要定义文件的名称和类型;
9 F9 e2 h. n$ z6 [) F+ p2 k( u1 v& z1 C0 i Z2 v% K- z, C7 J
integer fouti;
4 u/ Y2 j( A( G& n
6 l2 t* W) l/ e8 B. D需要在初始化部分打开文件:
6 t* V" s! A1 a; j7 ?) U$ f, g" u
1 U3 Q: c3 t2 d: w1 t$ O6 ?fouti = $fopen("medfilter2_re.txt");9 F$ G n7 s3 X2 ]& F) q* s4 q
, i' V4 i- Q/ i0 G! m3 ^4 D代码如下:( M5 c& ^7 Q2 G+ b. q, b8 A
! d7 z6 Z/ c- U6 i5 I' s1 U# r`timescale 1ns / 1ps. m/ F! B: r) m
( |0 A7 j! n, t9 F
////////////////////////////////////////////////////////////////////////////////
! J7 c+ H F }+ c// Company:
% ^( {2 Z" D: f7 s* X// Engineer:
9 _$ o; [" G$ }! k, K//
, B+ b" ~' N" F& t! e// Create Date: $ _. F( K6 } d/ ~2 K8 R5 c( Y, b
// Design Name: medfilter2
@; L5 |3 P% y% [/ F. f+ }// Module Name: E:/stereo_match_pro/stereo_match_FPGA0518/medfilter_tb.v
, E! f. t- \6 z' d// Project Name: stereo_match_FPGA0518, S V) J: h8 b% i [
// Target Device:
2 I, ]- ~8 H; S ^' q+ d// Tool versions: . `4 R7 c6 ]$ @2 i+ {( P& m
// Description: 1 \- J, U; E( x+ e( C" X8 @
//" [2 ~/ c+ E# e9 J1 q
// Verilog Test Fixture created by ISE for module: medfilter2% S6 j% ~3 @! |0 _
//5 e# H& p, e) ]) |
// Dependencies:
9 j8 E2 |6 g3 y/ u' v// - B1 @; |* {3 y; |! s
// Revision:! p+ ] b' `4 c- e6 m. I6 X
// Revision 0.01 - File Created* i2 N- @/ e0 S2 b- `
// Additional Comments:
4 X; _( @( c6 E// . V5 C: Q% T5 z$ B# c
////////////////////////////////////////////////////////////////////////////////
3 F. s; k3 q$ K2 D8 E. V5 \+ D k8 ~. K" p% ^
module medfilter_tb;
2 }) s5 W1 {5 h4 G7 r3 F K
9 ]2 i& {( x- w5 o: P0 o# h* u // Inputs
" D/ M( G. H9 P5 A( E# z reg CLK;
& N' [6 u1 ]; Y/ I* z. }( ?5 f0 s5 J reg RSTn;
, f3 s3 s# v: r# ^1 J3 V0 c% u9 @6 g reg Start_sig;
5 k, @5 b! |( V4 J/ N- u reg [18:0] pix_cnt; //512*512=262144=100,0000,0000,0000,0000( G" L1 \8 {. d- }* y1 f7 U
# C8 b" }: ?$ v: H8 g
0 r1 F$ c! ?0 \5 F% b5 n
// Outputs1 m1 N. Y! u, S8 G! X. H4 u
wire Done_sig;
5 g* r' i B. O' A% Q3 M wire [7:0] Data_out;
! q' s$ y, m* j4 g' G- A integer fouti;
* R6 r" V, k0 Q0 V+ y [
* A3 @) Q: o2 l# e) Q) ~- Y8 O) q% j' @/ `6 ^4 c; h
// Instantiate the Unit Under Test (UUT)2 e0 X; u( X" @) D! `8 p$ X
medfilter2 uut (
6 `" g) c0 C! D8 J% k5 h5 u .CLK(CLK),
1 R" E$ E7 L. F6 ~7 d( p5 _ .RSTn(RSTn), * z$ s9 E1 O/ O
.Start_sig(Start_sig),
2 b% O/ x; U" ]) p+ }0 S. x( G .Done_sig(Done_sig), 9 J! u: R# ^* x1 j& T! g& d
.Data_out(Data_out)
/ Q3 j3 F. h; Y5 u/ D5 Y: v: _; V );
) V- `7 r5 w3 m o( h) P* I3 W
* }$ q$ E- e% v! Y- s' h //assign Data_out = 0;
& S9 F% h5 Y) C. S9 c9 S0 w //assign Done_sig = 0;
' s% N. \5 W" ]* n; Z8 |
* w1 \' _" |4 x! _6 f initial begin% S; h; I9 ?' q, h% s) ~
// Initialize Inputs
! U9 t+ O* z2 V" t9 d CLK = 0;
( ]) u# n# y) d/ B- L RSTn = 1;
( k; N( N# a. N% r z; @ Start_sig = 0;
2 h" N6 T0 F/ Q; e1 i4 F
' H7 T% F2 ?; b$ `! F9 e8 ?5 V fouti = $fopen("medfilter2_re.txt");
" {( n7 \$ g+ V) x, q
. C# b. L0 t/ x/ {0 i // Wait 100 ns for global reset to finish, |" v# X) m' O" m; T" b; x& l
#100; // To reset the system
; K H+ H% h) E // Add stimulus here
# O/ x9 n1 E- w) Y8 } M3 P5 a RSTn = 0;
4 x7 Q1 Z, M) L9 V0 v9 }. @ w Start_sig = 1;
Q( A o% M. W& |: c7 ]" F pix_cnt = 0;* b9 W4 s* m( _" X
6 w! ?$ S, h4 w& w) |8 z* o #100; // To start the system; p7 F9 i7 p$ r L' @* {
// Add stimulus here
' R; S# |+ n- U6 W RSTn = 1;
, `3 q0 s9 N; p: A pix_cnt = 1;
, z: T0 l3 }: M9 ?; a. u, D1 l$ C' _. e l
end8 s& D- ^4 y3 D; _+ `+ u- }7 o
' ^& i: u7 E7 K; X; O, q, A always #10 CLK = ~CLK;
/ m( I6 e# z% g% f7 H0 E" Q3 [: b
always@(posedge CLK)
7 C+ @) d3 c" E( r begin$ n2 e( R8 f! w, o, I& q
if(Done_sig)
E$ [2 G n! i0 p$ U9 A pix_cnt <= pix_cnt + 1;9 J" `* z( v. M' S* r
end2 ]( Q, r! m) \
3 j4 a/ G u+ _9 J always@(posedge CLK)/ F: W7 s& M9 m9 c' n3 I% Y3 E
begin* V2 x# v+ m" J' r7 ^9 O7 ?5 Q
if(pix_cnt == 19'd262145)2 d8 {1 {, ^% M$ `+ q5 P# y
begin - }, U( @5 {) x$ w) U0 @+ H
Start_sig <= 0; 5 |- M2 v* v* v7 k& ~; }* {
$display("Image Medfilter Completed!\n");
$ y2 v+ j- }: ?* J1 H3 I $display(</span><span style="color: #800000;">"</span><span style="color: #800000;">The all time is %d \n</span><span style="color: #800000;">"</span>,$time);
; U4 D5 B. `/ Q4 `' K! o $stop; D" R" N: o% F) \) x8 g
end% p4 b2 N ]6 J
end
. {5 P* p( d. T7 V5 Y/ q# [( J7 t) q- Q; f z- g6 P7 Z
+ a5 A( o# a) t/ q& @6 U+ G; f$ b3 n) _" W; T+ {7 U4 @. ~
always@(posedge CLK)1 i( a2 |3 l% z/ a
begin% u, S5 i: O, a! e- Y
if(Done_sig), o- Z. V- j+ e# c7 B( ]
begin
9 n/ l0 V! ^. {! f H! g $fwrite(fouti, "%d", Data_out, "\n");
( s* q: `: r0 z/ @ $display("%d",pix_cnt);+ ?. ~. L0 t1 O2 H' Z
end
; t! q, {! q0 u9 R7 V end
+ b/ R" T# S8 H3 }2 b7 o* |* V. D$ b) I/ b
endmodule
/ f5 H7 u7 a6 f: f; j0 b m" A% V3 Z& F4 w7 ]8 c
整体的代码就是这样的。
$ u# P$ p2 _ K2 J9 F0 R7 c
& V# q7 f7 M- _# n2 g3.对各个模块进行语法检查、波形仿真、时序设计、调试验证;
- i' B* k Q; \+ ?2 {2 F
( ~- V9 D: C9 \, t9 D. y本人觉得原理清楚之后按部就班的编写代码还好,只是刚接触波形仿真和调试的时候是真心不顺心,还好有同事帮忙调试;在调试的过程中其实会学习到很多东西,很多经验,以及很简单的但你之前就是不知道的知识,这就是一个实践的过程,有时候你根本不知道错误在哪里,这怎么会是错误的呢,为什么不可以这样写,我觉得这样写才是正确的,这些就是在调试过程中本人的真实心情写照呀。可是,没有那么多为什么,verilog就是这样编程的,只是你不知道而已!这才是最伤人的,因为你不知道!0 ]- j1 e; r5 c( c3 H, R
; x7 O Z P( {5 c+ a E: y+ x, b 仿真调试的过程中遇到的问题以及解决方法有空专门写一篇,调试的过程中最好是一个一个模块的测试,特别是关键信号的数值,最好搞懂整体模块和各个模块的时序设计过程,推荐使用TimeDesigner进行波形的设计;另外还需要有关联的两个甚至多个不同模块信号的交叉仿真验证。" [+ L% i ]; ]: c6 |# Q# N2 g
t) f8 n3 f% p4.与matlab的中值滤波结果进行比较
" `' J* s* u( g9 q5 r
) R, q3 E% e r7 a S' x使用matlab编程基于自带的中值滤波函数得到处理之后的图像与数据,并将verilog得到的滤波数据转换为图像,将二者进行比较。$ [/ D. s, w* E
6 I/ f7 G3 J9 b/ j/ o( o! C7 s7 Z使用matlab自带的中值滤波函数medfilt2生成原图像的灰度图像的滤波数据;
; c8 t6 n& n0 P
" ?) l7 A& Y, u8 `4 u4 ]% mcode to median filter for one jpg image, and create a image data file$ Y" \4 K0 W' W2 Z8 }* T7 O T
src = imread('lena.jpg');
) F8 }& F* ]+ f, C" _' B9 e' k( O' sgray = rgb2gray(src);( q- S6 |; e( ^6 Y( }; [
9 D# H8 D% {) A7 ]8 w1 amedfilt2im = medfilt2( gray );
1 s, R6 f7 _, L[m, n] = size( medfilt2im ); % m行 n列
0 t9 e: f: v( |( c9 m; F( i' ]2 V+ C3 Q- P {2 `3 a
N = m*n; %%数据的长度,即存储器深度。
# C, S) {. Q4 Oword_len = 8; %%每个单元的占据的位数,需自己设定
# b& }( A/ \: Q3 Ylena_gray = reshape(gray', 1, N);% 1行N列
0 |4 |5 V/ n0 m7 `1 s+ mlena_medfilt = reshape(medfilt2im', 1, N);% 1行N列* T$ i: P" H6 k9 J% Q) j: v& V# W
$ v8 Q& H! w) L
fid_gray=fopen('lena_gray.txt', 'wt'); %打开文件
& }2 S, }* s3 {, w( ffid_medfilt=fopen('lena_medfilt.txt', 'wt'); %打开文件
- x3 m% b' k2 g6 J3 |% fprintf(fid, 'MEMORY_INITIALIZATION_RADIX=16;\n');8 f" g* m7 @0 E7 {. W0 \4 z
% fprintf(fid, 'MEMORY_INITIALIZATION_VECTOR=\n');
4 X9 Y0 C: T8 K# l* h5 n) u) M8 g* h8 z% b, ]* M* @
5 a. n1 j0 g" A2 d V+ yfor i = 1 : N-1! N- X6 }. x" P& h$ a9 H: `
fprintf(fid_gray, '%d,\n', lena_gray(i));%使用%x表示十六进制数
7 B" e. m6 X0 C! rend' s a, P6 m5 ^
fprintf(fid_gray, '%d;\n', data(N)); %%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
% Q& l: }/ ]/ ffclose(fid_gray); %%关闭文件- P5 h. j: C* h4 C! ^. U
?8 C5 |& D( z
for i = 1 : N-1) @) i( W9 K5 { ]
fprintf(fid_medfilt, '%d,\n', lena_medfilt(i));%使用%x表示十六进制数4 \# F( U. G4 B, }
end# p2 p1 c/ ]( N
fprintf(fid_medfilt, '%d;\n', lena_medfilt(N)); %%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
5 q: i# A. t& u! y6 g: ^7 mfclose(fid_medfilt); %%关闭文件0 J( o& L" ^9 @5 m3 H3 s
+ ]( y; B* ?; D/ v7 c# D3 d+ D将medfilt2函数和verilog产生的滤波数据转换为图像,并与matlab直接产生的滤波图像进行对比,代码如下:4 u/ q+ l! V2 y: j2 d
r# m2 r% s9 m0 _1 ]( }
% code to create image data from txt file. y! ]0 j. C5 p' U A/ ]" `- g5 m
clc;
& p4 R f0 |8 C& w' L% Z( tclear all;* s+ A' F! @- E9 w
close all;8 t" m7 ?9 r) B4 i$ t
I_rgb = imread('lena.jpg');
x1 A$ O1 s& ?subplot(2, 3, 1), imshow(I_rgb), title('lena-rgb')
4 i, V: U& i6 T4 B$ t, `0 I3 V1 _( l3 T) y' O( Q9 \/ W$ s
I_gray = rgb2gray(I_rgb); Z E" L- h8 ~' p7 O7 t
subplot(2, 3, 2), imshow(I_gray), title('lena-gray')
7 v' n, t% x9 Z8 ?6 f
2 \0 s6 }% C8 G T imedfilt_m_load = load('.\lena_medfilt.txt');: ~/ N# {3 d- L/ G9 c, N# }1 T
%medfilt_m_load = load('.\lena.coe'); G X6 C% i- y2 P; {' z6 _
medfilt_v_load = load('.\medfilter2_reV1.txt'); % verilog 产生的中值滤波之后数据
}& q- ?8 h" m) P- l! T D8 y
% B& l% v7 E9 q. g' O' t4 hmedfilt2im = medfilt2( I_gray );5 R, P. ~8 {; F$ o
subplot(2, 3, 3), imshow(medfilt2im), title('lena-medfilt2')( H: \# l- E1 N6 e" g
9 }9 B* Z: }3 d0 [ e" k' _
m = 512;
3 K1 D8 w+ m5 C' _n = 512;5 y Q4 S0 D. `4 r$ A
medfilt_m = reshape(medfilt_m_load, m, n);) G/ I* D8 A4 Z/ k
medfilt_v = reshape(medfilt_v_load, m, n);
+ x6 p. O) B' s, J3 bmedfilt_m = uint8(medfilt_m');; d% V) n: Q8 T: D
medfilt_v = uint8(medfilt_v');
) ^/ P Q0 S' s' T- P* i( n% R ^5 Z8 V# ^: U+ r9 K
aa = medfilt2im - medfilt_m;: |" d4 m6 V0 |) j @
bb = medfilt2im - medfilt_v;: f/ p% @: B* N; J# H" Y
cc = medfilt_m - medfilt_v;) B6 I1 E4 B& Y; q7 c: m% N
4 a( k3 u$ S8 [5 O9 M: t
subplot(2, 3, 5), imshow(medfilt_m), title('medfilt-matlab');
7 f& E9 N, I: qsubplot(2, 3, 6), imshow(medfilt_v), title('medfilt-verilog');
' q! A/ h# c% Y: e; r2 U; X! V v5 t9 |6 E) P) T, u- I9 f) |
显示的结果如下图所示:
4 o- i8 D, G% J/ [" y5 H& Q# k3 N
, P, K# }4 A0 h. _6 a' I2 d: ?9 k+ z5 T1 x8 ?" ?( X
结果:两种滤波产生的图像数据完全一致,不过感觉函数直接产生的图像颜色更深一些,不知道为什么。( _! G9 v/ g: L
4 T- L( X7 ]$ f$ ]. |这里需要了解一下medfilt2这个函数的原理。结果数据表明,默认情况下该函数对图像边界采用的是补0的方法进行处理的。6 c; X# T" f7 N- b3 U2 [7 Q! D$ q' j
' L& h" l( L- f2 ?2 c
结论
! l& ?- T, t0 X5 L* L- N9 F) o
- l1 H8 h" q2 u7 V$ }$ k$ V中值滤波终于告一段落了!简单的问题还是需要深入进去研究的,实践的过程中你才会发现自己之前了解的东西是多么的浅薄,对已知的知识掌握的是多么的流于表面!
- Y% q, u$ C8 h; H) e- n
8 R- z, m) h. Y0 U0 g0 _) R T7 e2 q( c最后结果的数据还是很让人开心的!1 h' d E, c9 |/ M9 f9 t
|
|