應用TEXTl0和MATLAB進行復雜數(shù)字系統(tǒng)仿真
關(guān) 鍵 詞:TEXTIO;MATLAB;TestBench;仿真;測試激勵
中圖分類號:TN707 文獻標識碼:A 文章編號:。1006―6977(2006)01―0004―04
1 引言
在對復雜數(shù)字系統(tǒng)進行仿真測試時,設計者常常面對測試向量數(shù)量龐大而難以實現(xiàn)的問題。以數(shù)字圖像處理系統(tǒng)的仿真測試為例,如果采用完備性測試方法.那么所需測試向量的數(shù)量將非常巨大,甚至無法實現(xiàn):而采用測試向量波形圖或者用HDL語言描述等常用方法.不僅仿真測試工作的效率低下,而且工作量巨大。在數(shù)字圖像處理系統(tǒng)中,一幀320x240的數(shù)字圖像所產(chǎn)生的測試向量數(shù)量達到320x240x2=153 600個。無論采用完備性測試方法還是向量波形圖或者.HDL語言描述的方法,由于測試向量的數(shù)量極其巨大,采用這些方法都難以進行仿真測試。
針對這個難題,筆者提出一種進行仿真測試的新方法.該方法應用TEXTI0和:MATLAB來輔助仿真測試過程.使測試向量數(shù)量巨大、難以處理的難題得到很好的解決。以電視視頻系統(tǒng)中實時多目標捕獲單元的仿真測試為例.對這種新方法進行全面的討論。
2 基于TEXTIO的VlII)L仿真
2.1 TEXTIO的功能
TEXXTl0是VHDL標準庫STD中的程序包(Package),它提供了VHDL與磁盤文件直接訪問的橋梁。TEXTIO定義了3種類型:LINE類型、TEXT類型及SIDE類型。TEXTI0在程序包中定義了一些訪問文件的過程(Procedure)。
TEXTIO提供的基本過程有:
(1)procedure READLNE(文件變量,行變量),用于從指定文件讀取一行數(shù)據(jù)到行變量中;
(2)procedure WRITELNE(文件變量,行變量),用于向指定文件寫入行變量所包含的數(shù)據(jù);
(3)procedure READ(行變量,數(shù)據(jù)類型),用于從行變量中讀取相應數(shù)據(jù)類型的數(shù)據(jù).根據(jù)參數(shù)的數(shù)據(jù)類型及參數(shù)個數(shù)的不同.有多種重載方式,TEX-TIO提供了bit、bit、bit_vector、BOOLEAN、character、in-teger、real、string、time數(shù)據(jù)類型的重載;
(4)mcedure WRITE(行變量,數(shù)據(jù)變量,寫入方式,位寬),該過程將數(shù)據(jù)寫入行變量。其中,寫入方式表示寫在行變量的左邊還是右邊,其值只能為left或right,位寬表示寫入數(shù)據(jù)時占的位寬。例如write(Oufljne,OutData,left,2/表示將變量OutData寫入LINE 變量OutLine的左邊,占2個字節(jié)。
2.2 仿真測試方案
使用TEXTO和MNTLAB輔助TestBench進行復雜數(shù)字系統(tǒng)仿真的方案框圖如圖1所示。
2.3 仿真測試步驟
2.3.1 使用MATLAB生成測試激勵文件
MATLAB是矩陣實驗室(Matrix Laboratory)的縮寫,是1984年MathWorks公司推出的軟件。經(jīng)過20多年的發(fā)展,MATLAB已成為通用科技計算、圖視交互系統(tǒng)和程序語言,廣泛應用于研究和解決各種具體工程問題。
在復雜數(shù)字系統(tǒng)仿真中,用戶可以利用MAT-LAB的強大處理功能生成測試激勵文件。測試激勵文件的數(shù)據(jù)格式由設計者自行定義。測試激勵文件應包含輸入信號的測試激勵數(shù)據(jù).也可以包含輸出信號的期望輸出數(shù)據(jù).這些內(nèi)容常常以.ASCII碼表示。
2.3.2 編寫TestBench
TestBench是測試平臺程序。TEXTI0的使用是通過TestBench來進行的,TestBench利用TEXTIO讀取測試激勵文件或?qū)懭敕抡娼Y(jié)果輸出。進行復雜數(shù)字系統(tǒng)仿真時,用戶根據(jù)測試的目的和要求設計TestBench。
2.3.3 在Modelsim中進行仿真
Modelsim是Model Technology(Mentor Graphics的子公司)的HDL(Hardware Description Language)仿真軟件??梢詫崿F(xiàn)VHDL、Verilog及VHDL一Ver-ilog混合設計的仿真。Modelsim為’TestBench提供一種良好的HDL仿真環(huán)境。
2.3.4 結(jié)果分析
仿真結(jié)束后,仿真結(jié)果是否符合要求,用戶可以通過二種方法來判斷。一種是應用軟件自動判斷。即通過TestBench或其他軟件(如MATLAB)對仿真輸出結(jié)果和期望輸出結(jié)果進行對比,從而得到分析結(jié)果:另外一種是人工判斷.即設計者自行對仿真輸出結(jié)果和期望輸出結(jié)果進行對比,從而得到分析結(jié)果。
3 仿真測試實例
3.1 電視圖像實時目標捕獲單元功能
電視圖像實時目標捕獲單元(以下簡稱待測單元)具有對電視圖像中的目標圖像進行實時捕獲的功能。本例將用TEXllO和MATLAB輔助Test-Bench對待測單元進行仿真測試。
3.2 需要產(chǎn)生的測試信號及波形
待測單元輸入信號的時序如圖2所示。其中,clk、vsy、hsy和ccd分別代表像素時鐘、數(shù)字化后的場同步、行同步和二值圖像信號。
用戶設計的測試激勵信號即測試激勵文件中輸入信號的激勵數(shù)據(jù),應符合圖2所示時序的要求。
3.3 測試信號的產(chǎn)生
在MATLAB的開發(fā)環(huán)境中.通過編程可以生成測試激勵文件。
以下是生成測試激勵程序的核心代碼:
image=imread(‘pic.bmp’); %讀取圖像文件
[YN,XN]=size(image); %得到圖像大小
FZ=20; %晶體振蕩器頻率(MHz)
%定義常數(shù) %對應于圖2所示的時序
POSTIME=52.2; %行正程時間(μ8)
NEGTIME=11.8; %行逆程時間(μs)
HORTIME=64; %行正逆程總時間
VSYTIME=1615; %場信號時間(μB)
PPDOT=POSTIME*FZ/XN; %行正程時間*晶體振
蕩器頻率,圖像X方向分辨率
……
fid=fopen(‘TestVectors.inp’,‘W’) ;%指定測試激勵文件的文件名稱
for j=1:1:YN;
yy_j;xx=0;
for i=l:1:HORTIME*FZ;
%產(chǎn)生行同步激勵
if(i(HFNTIME+HDLTIME)*FZ)(i>(HFNTIME+HDLTIME+HSYTIME)*FZ)
hsy=l;
else
hsy=0;
end;
%產(chǎn)生像素時鐘激勵
if clk==1
clk=0;
else
clk=l;
end;
%產(chǎn)生CCD激勵
if i>NEGTIME*FZ
xx=round((i-NEGTIME*FZ)/PPDOT+0.45):
ccd=round(image(yy,xx));
else
ccd=0;
end;
%將激勵寫入測試激勵文件
fprintf md.‘%d%d%d%d%d%d、Il’,clk,ccd,hsy,vsy);
end;
end;
產(chǎn)生的測試激勵文件名稱為TestVectors.inp,激勵內(nèi)容以ASCII碼表示,信號之間用空格隔開,且一行代表一次激勵。下面是測試激勵文件中的一段內(nèi)容,激勵包含clk,ccd,hsy,vsy 4個信號:
0 0 1 1―clk=0 eed=0 hsy=l vsy=l
1 0 1 1―clk=l ccd=0 hsy=l vsy=1
…
0 0 0 1――clk=O ccd=0 hsy=0 vsy=1
…
進行仿真時。TestBeneh應用TEXTIO通過逐行讀取測試激勵文件得到待測單元輸入信號的激勵。
3.4 編寫TestBench
TestBench調(diào)用TEXTIO讀取測試激勵文件得到激勵,然后將這些激勵分別驅(qū)動到待測單元的輸入端口。同時,TestBench讀取待測單元的輸出結(jié)果,調(diào)用TEXTIO將仿真輸出結(jié)果寫入文件名稱為Re-sult.out的仿真結(jié)果輸出文件。
以下是TestBeneh的核心代碼:
testprocess:process
file vector_file:text open read_mode is“TestVectors.
inp”:一指定測試激勵文件
file output_file:text open write_mode is“Reset.out”:
一指定仿真結(jié)果輸出文件
variable invecs,outvecs:line;
variable good:boolean;
variable eh:eharacter;
……
while not endfile(veetor_file)loop
readline(veetor_file.invecs);一讀出測試激勵文件一行內(nèi)容.得到激勵
read(invees,vclk,good); 一一讀取一個值給信號vclk
read(invees,ch); 一一讀取空格
……
read(invees,wBy,good); 一讀取一個值給信號vvsy
read(invecs,ch); 一讀取空格
……
clk=vclk;一驅(qū)動待測單元的輸入信號clk
ccd=vced;一驅(qū)動待測單元的輸入信號ccd
hsy=vhsy;一驅(qū)動待測單元的輸入信號hsy
vsy=wsy;一驅(qū)動待測單元的輸入信號vsy
……
caseiis
when 0=>out_string:=“frame_Yup0:”:一將目標0左上角Y坐標寫入仿真結(jié)果
when 1=>out_string=“frame_Ydn0:”:一將目標0右下角Y坐標寫入仿真結(jié)果
when 14=>out_strlng:=“frame_Xli3:”:一將目標3左上角X坐標寫入仿真結(jié)果
when 15=>out_string:=“frame_Xrt3:”:一將目標3右下角X坐標寫入仿真結(jié)果
when other8=>null;
end case;
write(outvees,string’(out_string));
……
3.5 Modelsim中顯示的測試波形及測試結(jié)果
在Modelsim提供的HDL仿真環(huán)境中,運行TestBeneh進行仿真測試,得到測試向量波形(如圖3所示)、仿真波形(如圖4所示)和仿真輸出結(jié)果文件ResuIt.out。對仿真輸出結(jié)果進行分析表明,仿真輸出的目標位置與輸入電視圖像中的目標位置完全一致。
本例的結(jié)果分析是通過人工對比進行的。還可以將仿真預期輸出結(jié)果保存在測試激勵文件或其他文件中.TestBench調(diào)用TEXTIO讀取仿真預期輸出結(jié)果.并和仿真實際輸出結(jié)果進行對比,然后自動判斷結(jié)果是否正確。在某些場合下,例如對VHDL編寫的處理器進行仿真調(diào)試時,用戶可以將包括指令類型、源地址、目標地址在內(nèi)的指令保存成文本文件。TestBench調(diào)用TEXTIO讀取這些指令。同時.TestBeneh調(diào)用TEXTIO將結(jié)果及中間變量保存成文本文件,以便設計者事后分析和查找問題的原因。
4 結(jié)束語
TEXTIO程序包使VHDL的仿真功能得到拓展。MATLAB是研究和解決工程問題的有力工具。在基于FPGA的復雜數(shù)字系統(tǒng)的仿真測試中,靈活應用TEXTIO和MATLAB等工具包能很好地解決仿真測試中面臨的測試向量龐大和難以處理的問題。
評論