1 數(shù)字信號(hào)處理FPGA設(shè)計(jì)實(shí)現(xiàn)和驗(yàn)證中存在的問(wèn)題和解決方法
用FPGA來(lái)實(shí)現(xiàn)信號(hào)處理的算法有可能碰到以下一種或幾種情況:
a. 實(shí)現(xiàn)復(fù)雜的數(shù)字處理功能,例如實(shí)現(xiàn)DFT、數(shù)字濾波等通信信號(hào)處理算法;
b. 模塊多且功能驗(yàn)證十分繁瑣;
c. 數(shù)字系統(tǒng)尚包含某些不確定因素,例如環(huán)路參數(shù)等;
d. 數(shù)字系統(tǒng)包含范圍較大的反饋環(huán)節(jié)。
實(shí)際設(shè)計(jì)中碰到的困難主要是以前的設(shè)計(jì)流程中系統(tǒng)方案和原理性仿真與硬件設(shè)計(jì)仿真脫節(jié),尤其是在高速數(shù)字信號(hào)處理FPGA設(shè)計(jì)實(shí)現(xiàn)中沒(méi)有很好的算法仿真驗(yàn)證手段。
聯(lián)合設(shè)計(jì)與仿真的方法針對(duì)數(shù)字信號(hào)處理FPGA設(shè)計(jì)實(shí)現(xiàn)中碰到的問(wèn)題和困難,提出了有效可行的解決方法,大大提高了數(shù)字信號(hào)處理算法FPGA設(shè)計(jì)實(shí)現(xiàn)的效率,有較高的推廣應(yīng)用價(jià)值。聯(lián)合設(shè)計(jì)與仿真的方法主要包括以下3個(gè)方面。
a. 分別創(chuàng)建數(shù)字系統(tǒng)的MATLAB仿真的數(shù)據(jù)源產(chǎn)生程序和實(shí)現(xiàn)特定功能的系統(tǒng)算法程序以及VHDL設(shè)計(jì)仿真程序模型;根據(jù)硬件性能對(duì)MATLAB 中的數(shù)據(jù)源進(jìn)行量化,由浮點(diǎn)數(shù)轉(zhuǎn)化成定點(diǎn)數(shù)據(jù)源,把系統(tǒng)仿真(浮點(diǎn))中的某些功能模塊改造成定點(diǎn)模型的MATLAB 模型,比如用定點(diǎn)的Simu-link模塊來(lái)建立定點(diǎn)模型。
b. 對(duì)VHDL源程序需要仿真的部分分層次建立VHDL Testbench文件,把原文件關(guān)聯(lián)進(jìn)去;在Testbench文件中運(yùn)用VHDL語(yǔ)言的TextIO程序包實(shí)現(xiàn)對(duì)輸入輸出數(shù)據(jù)的讀寫,再結(jié)合ModelSim仿真軟件實(shí)現(xiàn)對(duì)數(shù)字系統(tǒng)的仿真;仿真后輸出的測(cè)試數(shù)據(jù)可以在VHDL Testbench文件指定的輸出文本文件中找到,它的數(shù)據(jù)存儲(chǔ)格式是按列向量存儲(chǔ)的,可以直接被MATLAB讀取,做有關(guān)數(shù)學(xué)運(yùn)算或者數(shù)字信號(hào)處理運(yùn)算如FFT等的運(yùn)算并繪圖顯示。
c. 特殊功能模塊的仿真與驗(yàn)證,如對(duì)一些存儲(chǔ)器的初始化和仿真以及一些雙向總線的仿真都是由特定的測(cè)試方法來(lái)完成的的。
2 VHDL Testbench的概念和高效的Testbench文件編寫
2.1 FPGA測(cè)試與驗(yàn)證的基本概念及方法
(1)測(cè)試基準(zhǔn)
一旦設(shè)計(jì)者描述了一個(gè)設(shè)計(jì),必須對(duì)其進(jìn)行驗(yàn)證,以檢查是否符合設(shè)計(jì)規(guī)范。最常見(jiàn)的驗(yàn)證方法是在模擬時(shí)施加輸入激勵(lì)信號(hào),然后“讀”該設(shè)計(jì)的輸出信號(hào)。ModelSim等波形仿真軟件可以完成這個(gè)“讀”的功能,但是輸入激勵(lì)信號(hào)需要用模擬器來(lái)完成。使用模擬器輸入激勵(lì)語(yǔ)言的一個(gè)主要缺點(diǎn)是它隨著模擬器的不同而不同。
驗(yàn)證的另一個(gè)方法是用VHDL編寫一個(gè)測(cè)試模型發(fā)生器和要檢查的輸出,稱為測(cè)試基準(zhǔn)( Test-bench) ,它既提供輸入信號(hào),又測(cè)試設(shè)計(jì)的輸出信號(hào)。由于測(cè)試基準(zhǔn)也可能產(chǎn)生錯(cuò)誤,所以它必須也能被測(cè)試。建議既要有VHDL測(cè)試基準(zhǔn),又要用環(huán)境模型來(lái)驗(yàn)證元件,稱為系統(tǒng)模擬。VHDL測(cè)試基準(zhǔn)的建立可以用VHDL語(yǔ)言標(biāo)準(zhǔn)程序包中的TextIO來(lái)實(shí)現(xiàn),具體的TextIO在下一節(jié)介紹。
系統(tǒng)模擬的優(yōu)點(diǎn)是元件的激勵(lì)由系統(tǒng)仿真的數(shù)據(jù)源產(chǎn)生,近似于表示實(shí)際的模型產(chǎn)生。系統(tǒng)模擬的時(shí)間由輸入的需要模擬的數(shù)據(jù)量來(lái)決定。在通信信號(hào)處理的仿真中,往往需要很大的數(shù)據(jù)量來(lái)驗(yàn)證設(shè)計(jì)的正確性,所以系統(tǒng)模擬的一個(gè)缺點(diǎn)就是所需時(shí)間過(guò)長(zhǎng)。VHDL測(cè)試基準(zhǔn)的優(yōu)點(diǎn)是其速度與平臺(tái)無(wú)關(guān),所以在某些情況下,例如前面提到的用FPGA進(jìn)行信號(hào)處理的幾種情況,可以對(duì)這些情況全部或者部分地建立一個(gè)測(cè)試環(huán)境。圖1示出一個(gè)測(cè)試基準(zhǔn)邏輯結(jié)構(gòu)。設(shè)計(jì)模型接收輸入激勵(lì)(輸入信號(hào),第一部分) ,并給出對(duì)測(cè)試基準(zhǔn)的響應(yīng)(輸出信號(hào),第二部分) 。
(2)VHDL中的TextIO
TextIO例程是在VHDL標(biāo)準(zhǔn)中建立的,用它可以讀/寫文件,這些例程的用法如下:
Read ( ?)
Readline ( ?)
Write ( ?)
Writeline ( ?)
為了能使用這些例程,在設(shè)計(jì)程序中應(yīng)引用VHDL 的標(biāo)準(zhǔn)程序包,即在VHDL代碼的開頭應(yīng)當(dāng)包含下面的行:
use std. TextIO. all;
這些標(biāo)準(zhǔn)程序包是在進(jìn)程中對(duì)行變量或列變量進(jìn)行操作,然后在程序中給這些變量進(jìn)行賦值或引用。
TextIO的一個(gè)很重要的應(yīng)用就是在集成電路設(shè)計(jì)或FPGA設(shè)計(jì)中的測(cè)試基準(zhǔn)中的應(yīng)用,測(cè)試基準(zhǔn)是測(cè)試方法學(xué)中一個(gè)很重要的測(cè)試和驗(yàn)證工具,它提供了設(shè)計(jì)模型和外部數(shù)據(jù)的輸入輸出接口。具體來(lái)說(shuō):模型的輸入信號(hào)可以放在外部文件中,輸出信號(hào)的期望值可以放在另一個(gè)文件中,而且這個(gè)文件是以行向量方式存取,所以可以被MATLAB的系統(tǒng)級(jí)仿真軟件讀取。
在測(cè)試基準(zhǔn)中使用TextIO的方法非常靈活,也相當(dāng)簡(jiǎn)單。調(diào)用TextIO的缺點(diǎn)是,與普通的VHDL代碼相比,其模擬速度往往較快。
有必要指出, TextIO的調(diào)用不能被綜合,只能用于模擬。
2.2 高效的Testbench文件編寫
(1)VHDL Testbench文件實(shí)現(xiàn)的功能
VHDL Testbench已經(jīng)成為驗(yàn)證FPGA或ASIC頂層設(shè)計(jì)最典型的方法。在VHDL Testbench文件中主要完成以下任務(wù):
·例化被測(cè)試的設(shè)計(jì)單元(DUT) ;
·在Testbench文件中對(duì)測(cè)試模塊引入測(cè)試向量;
·輸出結(jié)果可以在ModelSim仿真軟件的波形窗口顯示或者作為測(cè)試結(jié)果向量保存在文本文件中;
·也可以在ModelSim仿真軟件中比較測(cè)試輸出結(jié)果和系統(tǒng)仿真期望結(jié)果,驗(yàn)證設(shè)計(jì)的正確性。
(2)VHDL Testbench文件結(jié)構(gòu)
VHDL Testbench文件結(jié)構(gòu)主要包括4部分:實(shí)體和結(jié)構(gòu)體聲明、信號(hào)聲明、例化頂層設(shè)計(jì)模塊、測(cè)試進(jìn)程程序。
2.3 自檢功能Testbench的程序編寫
自檢功能Testbench的實(shí)現(xiàn)是先通過(guò)MATLAB 等系統(tǒng)仿真軟件產(chǎn)生一系列期望輸出的測(cè)試向量,存放在期望輸出的向量文件中,然后在VHDL Testbench文件中編寫程序,讓程序在運(yùn)行時(shí)對(duì)預(yù)設(shè)的不同運(yùn)行時(shí)間間隔的實(shí)際輸出和期望輸出進(jìn)行比較;如果實(shí)際輸出結(jié)果和期望輸出結(jié)果匹配,那么這個(gè)仿真結(jié)果就是正確的;如果實(shí)際輸出結(jié)果和期望輸出結(jié)果不匹配, Testbench就會(huì)在預(yù)設(shè)的時(shí)刻產(chǎn)生差異或者錯(cuò)誤報(bào)告。這種功能的VHDL Testbench程序是利用VHDL語(yǔ)言的TextIO程序包來(lái)實(shí)現(xiàn)的。
自檢功能Testbench對(duì)同步電路的設(shè)計(jì)來(lái)說(shuō)是很簡(jiǎn)單的,因?yàn)橥诫娐穼?shí)際輸出結(jié)果和期望輸出結(jié)果的比較可以在同一個(gè)時(shí)鐘沿或者滯后幾個(gè)時(shí)鐘周期進(jìn)行。比較方式取決于具體的設(shè)計(jì),比如存儲(chǔ)器I/O的Testbench,必須在每次有新數(shù)從某個(gè)地址讀出或者給某個(gè)地址寫入新數(shù)的時(shí)候檢查其結(jié)果;同樣,如果某個(gè)設(shè)計(jì)使用了很多的組合邏輯,那么期望輸出結(jié)果就要考慮組合邏輯的延時(shí)。
自檢功能Testbench是通過(guò)在特定時(shí)間對(duì)實(shí)際輸出和期望輸出進(jìn)行比較而自動(dòng)對(duì)仿真結(jié)果檢查錯(cuò)誤,這種仿真方式特別適合中、小規(guī)模設(shè)計(jì)使用。當(dāng)數(shù)據(jù)量很大時(shí)仿真會(huì)很慢,尤其當(dāng)數(shù)據(jù)量以指數(shù)增加時(shí),編寫Testbench會(huì)很費(fèi)時(shí)和困難,這時(shí)可通過(guò)TextIO把實(shí)際輸出數(shù)據(jù)導(dǎo)出,聯(lián)合MATLAB等系統(tǒng)仿真程序?qū)PGA設(shè)計(jì)進(jìn)行驗(yàn)證。后面的應(yīng)用舉例就是使用這種方法來(lái)綜合驗(yàn)證FPGA設(shè)計(jì)的正確性。
在VHDL Testbench文件中,仿真輸入向量數(shù)據(jù)和期望輸出向量數(shù)據(jù)都各自存放在向量數(shù)據(jù)文本文件中,VHDL語(yǔ)言的TextIO程序包被用作從向量文件中讀入數(shù)據(jù)和顯示錯(cuò)誤信息。
3 應(yīng)用實(shí)例
在某課題數(shù)字解調(diào)部分位定時(shí)誤差估計(jì)算法設(shè)計(jì)實(shí)現(xiàn)中使用了VHDL Testbench聯(lián)合MATLAB系統(tǒng)仿真軟件,并對(duì)在FPGA中實(shí)現(xiàn)的位定時(shí)算法進(jìn)行了驗(yàn)證,證明該方法切實(shí)可行。
數(shù)字解調(diào)位定時(shí)估計(jì)算法框圖如圖2所示,其中虛線框內(nèi)部分是要在FPGA中實(shí)現(xiàn)和驗(yàn)證的算法。按照FPGA聯(lián)合設(shè)計(jì)仿真的方法步驟,首先利用MATLAB創(chuàng)建了該算法的浮點(diǎn)仿真模型,并且驗(yàn)證無(wú)誤。在此基礎(chǔ)上,按照以下步驟進(jìn)行系統(tǒng)的設(shè)計(jì)與調(diào)試。
第一步,根據(jù)MATLAB浮點(diǎn)仿真模型中的數(shù)據(jù)源產(chǎn)生模塊,編寫可以產(chǎn)生定點(diǎn)數(shù)據(jù)(如8比特或16比特量化的有符號(hào)數(shù))的定點(diǎn)數(shù)據(jù)源產(chǎn)生模塊;編寫實(shí)現(xiàn)算法的各模塊的MATLAB定點(diǎn)代碼;運(yùn)行程序,產(chǎn)生設(shè)計(jì)模塊輸入數(shù)據(jù)向量和期望輸出數(shù)據(jù)向量,并分別存儲(chǔ)在不同文件中。
第二步,根據(jù)位定時(shí)估計(jì)算法,用VHDL語(yǔ)言編程在FPGA中實(shí)現(xiàn)該算法,并根據(jù)第二節(jié)中講到的VHDL Testbench的寫法編寫對(duì)應(yīng)的測(cè)試基準(zhǔn)文件,其中包括VHDL語(yǔ)言的TextIO數(shù)據(jù)包和在程序中編寫讀入和寫出的程序代碼。
第三步,把定點(diǎn)數(shù)據(jù)源產(chǎn)生模塊產(chǎn)生的定點(diǎn)數(shù)據(jù)源分別輸入MATLAB程序和FPGA程序,如圖3所示。產(chǎn)生的輸出文件分別作為期望輸出向量文件和實(shí)際輸出向量文件。
第四步,分別對(duì)實(shí)際輸出向量文件中的輸出和對(duì)應(yīng)期望輸出向量文件中的數(shù)據(jù)進(jìn)行分析驗(yàn)證,如果不正確,則重新產(chǎn)生輸入數(shù)據(jù)進(jìn)行聯(lián)合仿真;當(dāng)程序較大時(shí),反復(fù)進(jìn)行幾次聯(lián)合仿真,直到該模塊功能和時(shí)序仿真都正確為止。
需要指出,在此仿真階段,輸入數(shù)據(jù)量化要盡可能模擬硬件實(shí)際輸入數(shù)據(jù)。圖4為MATLAB定點(diǎn)數(shù)據(jù)源模塊A /B產(chǎn)生的一路輸入信號(hào),圖5為期望輸出向量文件模塊D和實(shí)際輸出向量文件模塊E在MATLAB中繪制的圖形。
從圖中可以看出, FPGA測(cè)試的輸出和MATLAB定點(diǎn)仿真很相似,證明了FPGA設(shè)計(jì)的正確性。
4 結(jié)束語(yǔ)
在電子產(chǎn)品設(shè)計(jì)領(lǐng)域已經(jīng)涌現(xiàn)出大量先進(jìn)的設(shè)計(jì)技術(shù)與設(shè)計(jì)方法學(xué),并且成功地應(yīng)用在設(shè)計(jì)實(shí)踐中。這些先進(jìn)的器件技術(shù)、設(shè)計(jì)技術(shù)逐步應(yīng)用在現(xiàn)代信號(hào)處理電路的研發(fā)中。隨著集成電路工藝水平的提高,現(xiàn)場(chǎng)可編程器件FPGA的規(guī)模和速度快速增長(zhǎng),這給FPGA的設(shè)計(jì)實(shí)現(xiàn)和仿真驗(yàn)證帶來(lái)很大困難。尤其是在信號(hào)處理算法的FPGA實(shí)現(xiàn)中,很難把系統(tǒng)仿真和設(shè)計(jì)實(shí)現(xiàn)仿真有機(jī)結(jié)合起來(lái);而采用Xilinx ISE結(jié)合MATLAB對(duì)數(shù)字系統(tǒng)進(jìn)行聯(lián)合設(shè)計(jì)與仿真的方法是解決這一問(wèn)題的有效途徑。
評(píng)論