' m8 L5 D9 Z6 m5 o8 V/ P$ z7 \$ v7 p; R$ M% s, f; S
电视图像实时目标捕获单元(以下简称待测单元)具有对电视图像中的目标图像进行实时捕获的功能。本例将用TEXllO和MATLAB辅助Test-Bench对待测单元进行仿真测试。 3 {5 a5 E1 t7 H- w' u: t 5 W! n2 z6 }! G- p8 P/ R ) _+ s- {+ [* i4 Q" H" k: e3 n& D
3.2 需要产生的测试信号及波形 3 c3 \4 s; a. S* ~2 M$ m& [3 f / n& L& O I x* ` 5 H2 a0 Y& P1 p7 n: Q
9 l- P3 s7 a5 U' }. \7 N& h: M
待测单元输入信号的时序如图2所示。其中,clk、vsy、hsy和ccd分别代表像素时钟、数字化后的场同步、行同步和二值图像信号。: a; P; w# l; m, T4 g
' w4 c- D% ]9 P/ }
( Y: [, p+ F) R. g1 z* @
' F( Q9 W6 J, r c4 [, u4 |+ F
^) y* F5 B- f1 u4 P3 q . h& g+ B7 V4 G: G3 F M 用户设计的测试激励信号即测试激励文件中输入信号的激励数据,应符合图2所示时序的要求。 4 y4 W- L# X2 n6 c' q4 ]* z# m4 D8 k. n
; y3 g- E' L' v# I
1 F% j- V) O: P0 c' K- X
3.3 测试信号的产生6 j& J1 A( m& o# k- s+ S
) W i% P6 q+ _6 S2 F0 [ c
2 S2 G3 P. z+ O! e; C/ j9 I, P. {9 p8 h: y f
在MATLAB的开发环境中.通过编程可以生成测试激励文件。. P0 u; m P8 ^) T! w! U
0 n+ l; g1 j) C8 C% ?
; L; ?- n& T1 P; [- W" _
2 z7 z D, F$ r/ E; r# n/ u 以下是生成测试激励程序的核心代码: ' n. _( {7 W; l+ P4 @- \/ k0 A/ q7 ~' a: D0 b' w8 E
image=imread(‘pic.bmp’);%读取图像文件, _& t# W$ Y+ @& h ], x1 ?, |2 i
1 v* d* C! |; b$ s8 p& o
[YN,XN]=size(image); %得到图像大小/ t2 U( q1 i8 {6 Y
8 o; b+ x" v1 }
FZ=20; %晶体振荡器频率(MHz) ) i7 a- m" {, ^* J. G# D2 f& `6 H1 {0 b: I0 P3 m7 Z# v
%定义常数 %对应于图2所示的时序, v5 z w2 A* r0 O
' G; H& A7 h I" [ POSTIME=52.2; %行正程时间(μ8) 6 l% P( a) Q; a+ g, W& B) w0 T, x D3 U( y) A' j
NEGTIME=11.8; %行逆程时间(μs)4 j3 R# `& G# R) F4 a8 s
" C' |( e9 }, m/ t$ [( G" m/ Y
HORTIME=64;%行正逆程总时间, I( D# W# i7 E. ^5 D/ y( O: s6 I
: o* M# h S4 V! y& e2 K8 B- j
VSYTIME=1615; %场信号时间(μB) ; \4 J8 D* U1 h; z3 l % f* w: K( t% M- k4 a7 u PPDOT=POSTIME*FZ/XN; %行正程时间*晶体振 % n3 H. M; d5 F' g! L. K' t+ u5 Z* |+ G
荡器频率,图像X方向分辨率. X- m+ O7 e' S* p
R* E4 R. x+ m( o% _8 H9 L5 [$ c 1 0 1 1—clk=l ccd=0 hsy=l vsy=13 U$ x7 b+ R# E
6 F# `* S! y: |% m n/ {, Y9 I
… # K6 k4 j' N& r5 [ 4 A2 ?: Q5 r) V& m6 I ( d1 N# x3 i G0 D 3 `% Q$ k4 h$ F# k$ i 0 0 0 1——clk=O ccd=0 hsy=0 vsy=1 0 G+ R/ w* K$ X# o% v8 e; o c ; a( S) d9 s% [8 L( c! ~! {& b … 2 Y' o0 ]$ V1 }% v* [; ^" O1 g5 f/ U1 Q) W0 H
4 j8 {1 x+ |2 h4 Q
; ]! i3 F) c1 }
进行仿真时。TestBeneh应用TEXTIO通过逐行读取测试激励文件得到待测单元输入信号的激励。 l; m, }" _: z9 ~5 l( z) }# K, K% a, b: R
M% ^: P. u' E. ~2 j& L% A
4 M) `1 X8 P, h5 j5 `
3.4 编写TestBench( C9 W! p9 @" Y) I% N
( T; @2 X4 d+ j, b- W1 u% o ; } l4 u5 @0 F$ x. N1 _9 M; q) S. D; V$ l! E+ |
TestBench调用TEXTIO读取测试激励文件得到激励,然后将这些激励分别驱动到待测单元的输入端口。同时,TestBench读取待测单元的输出结果,调用TEXTIO将仿真输出结果写入文件名称为Re-sult.out的仿真结果输出文件。1 ?0 L- g& u# R: N0 v
2 ^+ u: E! w8 `9 y5 d* s2 ` / @6 K) N( ]7 }1 G' u
# l$ C; {% \6 }6 c
以下是TestBeneh的核心代码: 1 x, J4 N* z# x5 w- t) R Y/ _. D2 Y# G7 I0 A
testprocess:process 6 x$ G d( C3 ^" ~! U" q; ?( v1 w 8 ~0 N3 i# {9 d0 }4 }# n file vector_file:text open read_mode is“TestVectors. ( i7 c& A' ?6 M& j/ U8 U) w7 A! k3 P; N l7 y* ?+ ]
inp”:一指定测试激励文件 ' ~. T# |' ]0 C" m' Q8 J6 }; ~ * J X6 C& q3 M' Z file output_file:text open write_mode is“Reset.out”: $ ^. _9 I& e; b, }$ k. h8 h0 q- s! f4 \( C J# \1 r9 s* I
一指定仿真结果输出文件( c" S6 d, N8 w: d& _( c
8 u; o1 m6 }6 x+ u' j
variable invecs,outvecs:line;6 l" Q% U: @$ Q! F: p
, @4 g+ X# q; h0 `' N
variable good:boolean;8 _# k/ `9 v' K1 ?8 Y" _
- w4 {* O# x2 p& Q& z9 ]: o% h
variable eh:eharacter; 0 @# d# }* C" X0 `) |# e, [, m' \9 D- w" m/ r9 {4 q
……- }* q- ]: e( [9 H1 n$ |3 U
* S# v0 j% z8 R
1 { {9 r- b* B: j. {/ t
9 e; h2 N$ M% L( z2 [- v$ ] while not endfile(veetor_file)loop - J0 ~7 d' H* T & Q! H( L% X/ C9 N0 D readline(veetor_file.invecs);一读出测试激励文件一行内容.得到激励 " o8 o8 P- o: l. f$ p. I 2 \1 _0 k9 G; v" o! [* e read(invees,vclk,good); 一一读取一个值给信号vclk6 z. ]" T* e* U4 N D4 Y
, `7 Q$ ?" m7 j/ q6 S( P5 G! U. a
read(invees,ch); 一一读取空格. q( c; v; M8 Q; d
6 v+ B; t N- ]- _! H; H3 l" n( ]
…… ' ?0 }2 n$ j' @+ b6 P, W' d& |$ ]6 c u+ t
( ]" [4 P; D, Z( r; n* L0 u, Z. L. f& @0 K8 R' O
read(invees,wBy,good); 一读取一个值给信号vvsy9 \1 c; J+ Z! H: O% d$ a
2 `- E: E2 |5 P. R i v3 v! b$ v
read(invecs,ch); 一读取空格' m- ^% @6 U- C3 A) o
C- I" |* ?4 O4 W# m4 `+ b! k
…… _+ V0 x4 \3 b" u. _0 | j: j8 h
) n" i X! X0 ]% i# r 1 e: f' W! v% M: C$ @
) [* C# C6 r d clk<=vclk;一驱动待测单元的输入信号clk. g8 ^8 C' ]. Z; q
- Q: y6 I b- J) o! o8 v1 `! h. r ccd<=vced;一驱动待测单元的输入信号ccd " w8 @6 B" f" m% z4 }0 g7 s; V4 |2 M& `3 b8 x! ]! j' j, c0 c
hsy<=vhsy;一驱动待测单元的输入信号hsy % c5 j4 O' I# f . @2 ^( s4 y' `. r% w; u D8 Z vsy<=wsy;一驱动待测单元的输入信号vsy& G, G) k7 i9 M, X, T0 V
% l* P& q. x( z
……# R) R% P6 X2 @
5 b, e( K) b+ x2 H" G2 o; q 8 T* d- E% k1 {' U. K( E
3 ], ?/ e' R6 p: c, A/ ~6 A) {' O
caseiis ( g( {, y/ E/ _! b' g3 n) g# w# {4 q" C
when 0=>out_string:=“frame_Yup0:”:一将目标0左上角Y坐标写入仿真结果 ]0 E# F# i3 k: i$ U2 E1 `1 K
! Y7 @) ?3 q4 D8 n( U
when 1=>out_string=“frame_Ydn0:”:一将目标0右下角Y坐标写入仿真结果 ( {9 p7 V S( x1 r0 J$ ^ ( a& h% R: Z! i& C when 14=>out_strlng:=“frame_Xli3:”:一将目标3左上角X坐标写入仿真结果 z' k3 H3 j9 r W1 @5 x0 _ 1 v2 }$ c! g7 b% q when 15=>out_string:=“frame_Xrt3:”:一将目标3右下角X坐标写入仿真结果# | i4 h( t& O6 `# }
k$ `) G* I# V' q- { when other8=>null; ^. [. L2 \7 R& L/ q; l+ N
0 Y: |6 l" y5 F+ n9 a: E6 @! h end case; ; C' \$ Y# f5 T( x9 q" Q, f& R$ F @% g( ]9 k) R# B3 v& D$ S write(outvees,string’(out_string));$ \8 U5 w( H" {3 o: q. ]* F) Q
$ q% b& D" h2 o* P( W
……+ R* u8 w& p, c! S F# |8 W, m' Z5 t
, c& O6 _: o5 ~( `1 v; \+ W. ^) I
* R! c/ _ z( T8 W! w$ X - J; ~, R( z0 {/ B7 j( E% i7 ?1 v 3.5 Modelsim中显示的测试波形及测试结果8 h4 O- ~7 s G B5 e7 G+ L& s
3 Z2 H& M3 L* Q9 S' z/ z" Q% T0 N
f, Y% g* P6 u) O3 A/ m " q$ t. g& M# r, J- W 在Modelsim提供的HDL仿真环境中,运行TestBeneh进行仿真测试,得到测试向量波形(如图3所示)、仿真波形(如图4所示)和仿真输出结果文件ResuIt.out。对仿真输出结果进行分析表明,仿真输出的目标位置与输入电视图像中的目标位置完全一致。 ( X* I' ~4 M7 U3 w! W ; V; q$ e* r" m' q3 f) L- Q+ y # _3 U1 r! c. P9 o" v5 F3 ?4 b+ M$ Y5 q2 x5 z% s- F
& I0 Q( ~" Z3 _9 i# J
& V: ^/ L. G' G1 m 9 P# w: |; \9 G- q% H) \- N. ?7 Z, L% {
5 i, Z: G) C7 x4 h% g/ S9 Z
. H! A+ s% F0 Z$ r
本例的结果分析是通过人工对比进行的。还可以将仿真预期输出结果保存在测试激励文件或其他文件中.TestBench调用TEXTIO读取仿真预期输出结果.并和仿真实际输出结果进行对比,然后自动判断结果是否正确。在某些场合下,例如对VHDL编写的处理器进行仿真调试时,用户可以将包括指令类型、源地址、目标地址在内的指令保存成文本文件。TestBench调用TEXTIO读取这些指令。同时.TestBeneh调用TEXTIO将结果及中间变量保存成文本文件,以便设计者事后分析和查找问题的原因。/ h ]3 ^' k* W$ t
& l( t" l) m: ]4 B/ J/ m/ U! H V8 b