0 引言 IIR數字濾波器在很多領(lǐng)域中都有著(zhù)廣闊的應用。與FIR數字濾波器相比,IIR數字濾波器可以用較低的階數獲得較高的選擇性,而且所用存儲單元少,經(jīng)濟效率高。一個(gè)N階IIR數字濾波器的系統函數為: 其線(xiàn)性常系數差分方程為: 用FPGA實(shí)現濾波的基本思想就是基于式(2)來(lái)實(shí)現的。如果知道了系統的輸入序列(濾波器的輸入),那么,只要根據所給的濾波器的指標,然后通過(guò)MATLAB仿真出系數矢量b和a,再采用遞推算法求解差分方程,就能求出輸出序列(濾波器的輸出)。 1 濾波器的MATLAB設計 由于本文采用巴特沃斯濾波器,故需要在工具箱中調用的兩個(gè)函數buttord和butter的調用格式為: 其中N為濾波器階數;wp和ws分別為通帶截止頻率矢量和阻帶截止頻率矢量,單位為π,一般需要模擬頻率指標對采樣頻率的一半作歸一化;Rp和As分別為通帶最大衰減和阻帶最小衰減,單位dB;wc為3 dB邊緣頻率矢量;b和a即為方程(2)中的系數矢量。 獲得系數6和a之后,調用函數freqz(b,a,k,Fs)即可按照下式計算k點(diǎn)的復頻率響應矢量H: 然后便可繪出K點(diǎn)的幅頻和相頻特性曲線(xiàn),以用于檢查計算出的系數是否滿(mǎn)足所需要的濾波器指標。 2 編寫(xiě)VHDL語(yǔ)言代碼注意事項 乘加運算過(guò)程中的數據是有符號的二進(jìn)制補碼,通常在Xilinx ISE集成開(kāi)發(fā)環(huán)境下建立的VHDL源文件頭部都會(huì )有“use IEEE.STD_LOG-IC_UNSIGNED_ALL;”,如將其改為“use IEEE.STD_LOGIC_SIGNED.ALL;”即應該包含有符號數運算程序包,這樣就能保證代碼中的所有std_log-ic_vector型數據按照有符號二進(jìn)制補碼的規則進(jìn)行運算。 由于FPGA內部不能表示浮點(diǎn)數,因此只能用有限精度方法來(lái)實(shí)現數據的運算,即用數據(包括方程(2)的輸入輸出和系數)的整數部分(截去小數部分)作近似運算,且需要std_log-ic_vector數據類(lèi)型來(lái)表示數據整數部分的二進(jìn)制補碼形式,但這樣會(huì )產(chǎn)生截斷誤差。為了減小截斷誤差,應該將數據擴大適當的倍數(通常是2L倍,L為正整數),以使小數部分可以忽略不計。擴大的倍數越大,截斷誤差就越小,得到的數據就越精確,但是,用來(lái)表示數據整數部分的std_logic_vector型數據長(cháng)度會(huì )越大,這樣就會(huì )占用越多的FPGA內部資源,因此,適當的選擇數據擴大倍數是個(gè)關(guān)鍵。此外,各種數據轉換為std_logic_vector型數據的長(cháng)度選取至少應足以表示二進(jìn)制補碼(包括符號位)。若FPGA內部資源充足,可以通過(guò)增加std_logic_vector型數據長(cháng)度來(lái)減小截斷誤差,提高運算精度。 通常由MATLAB仿真得到的系數b都遠小于1,因此要適當選擇正整數L。運算時(shí)可給系數b和a(a的第一個(gè)系數除外)同乘以2L,之后取整得到B=round(b*2L)和A=round(a*2L) 當前時(shí)刻輸入的x(n)有時(shí)可能太小,為減小截斷誤差,應該選擇適當的整數M,以給x(n)乘以2M,即給表示當前時(shí)刻輸入的std_logic_vec-tor變量后補上M個(gè)‘0’。這樣,得到的當前時(shí)刻輸出y (n)就是擴大了2L+M倍的數據,應該除以2L+M才是當前時(shí)刻的真實(shí)輸出。而VHDL語(yǔ)言不支持除法運算,故應采用截去末尾(L+M)位的方法來(lái)近似除法運算,這種做法相當于原始輸出y除以2L+M之后截去小數部分。 在用示波器觀(guān)測時(shí),濾波器的輸出波形可能帶有許多大幅度尖銳毛刺,從而嚴重影響了濾波器的性能。毛刺是由于組合電路的競爭而使電路輸出發(fā)生瞬時(shí)錯誤的現象,通常消除毛刺的方法是在具體的電路中加個(gè)鎖存器。本文采取另一優(yōu)化方法,即在源代碼中通過(guò)符號“<=”把輸出信號賦給一個(gè)中間信號,再把中間信號作為輸出,這相當于將信號作一個(gè)延時(shí)再輸出。這種方法不需要知道具體的電路結構,也元需編寫(xiě)其它代碼模塊,因此優(yōu)化更為簡(jiǎn)便快捷,而且優(yōu)化效果非常好。 3 濾波器MATLAB設計的FPGA實(shí)現 下面以一個(gè)簡(jiǎn)單的低通濾波器設計實(shí)例來(lái)說(shuō)明從MATLAB設計到FPGA實(shí)現的整個(gè)過(guò)程。該低通濾波器的系統采樣頻率為40 MHz,通帶截止頻率為1 MHz,阻帶截止頻率為5 MHz,通帶內最大衰減為3 dB,阻帶內最小衰減為40 dB,而對相位不作要求。 而其硬件平臺上的主要器件有Xilinx公司的Spartan2E系列30萬(wàn)門(mén)FPGA芯片XC2S300E及PROM器件XC18V04,模數轉換芯片則采用AD公司的AD9218,數模轉換芯片選用AD公司的AD9765,另外,還有40 MHz晶振等。其系統框圖如圖1所示。 3.1 MATLAB設計 MATLAB設計的具體代碼如下: 這樣,在運行之后,便可得到: 圖2是由系數B和A繪出的幅頻特性曲線(xiàn)。 下面是遞推算法的MATLAB描述: 若以輸入分別為0.5 MHz、3 MHz、6 MHz的正弦波來(lái)測試濾波器輸出,則可得出如圖3所示的仿真結果?梢(jiàn),該系數B和A可以滿(mǎn)足低通濾波器的技術(shù)指標。 3.2 VHDL代碼頂層模塊 圖4是該MATLAB設計的頂層模塊“top_lev-el”的示意圖。圖中,Gclk為FPGA全局時(shí)鐘輸入(來(lái)自40MHz晶振),AD9218clk和AD9765clk是由Gclk直通送往AD9218和AD9765的驅動(dòng)時(shí)鐘;AD9218data_out(9:0)是來(lái)自AD9218的10位濾波器輸入信號,設計時(shí)可與核心模塊“l(fā)pf”的輸人data_in(9:0)相連;AD9765data_in(9:0)是送往AD9765的10位濾波器輸出信號,可與核心模塊“l(fā)pf”的輸出data_out(9:0)相連。 圖5給出了頂層模塊的FPGA資源占用情況,由圖5可見(jiàn),該系統的資源占用率非常少。 3.3 VHDL代碼核心模塊 圖6所示為用于信號處理的核心模塊“l(fā)pf”。 在核心模塊VHDL代碼編寫(xiě)時(shí)應當注意語(yǔ)句“use IEEE.STD_LOGIC_SIGNED.ALL;”,并使用有符號數運算程序包。另外,在將設計好的整數系數B和A轉換為二進(jìn)制補碼時(shí),為方便起見(jiàn),可使用程序包STD_LOGlC_SIGNED.vhd中的類(lèi)型轉換運算符CONV_STD_LOGIC_VECTOR()來(lái)接收整數和轉換后的長(cháng)度等兩個(gè)參數,然后返回STD_LOGIC_VECTOR型。 本系統的代碼結構體architecture采用行為描述方式,它類(lèi)似于高級語(yǔ)言,其優(yōu)點(diǎn)在于只需描述清楚輸入與輸出的行為,而無(wú)需花費更多的時(shí)間和精力關(guān)注設計功能的門(mén)級實(shí)現,因為這些完全可以由EDA工具綜合生成,因而可大大縮短開(kāi)發(fā)設計的時(shí)間。 核心模塊“l(fā)pf”的VHDL語(yǔ)言源代碼如下: librarv IEEE; 在Modelsim上對本核心模塊進(jìn)行仿真及代碼優(yōu)化時(shí),其測試激勵仍然可以分別選用0.5 MHz、3 MHz和6 MHz的正弦波。產(chǎn)生的方法有兩種:一是采用ISE中集成的測試激勵生成器HDL Bencher新建Test bench waveform型文件,并從中輸入一周期正弦數據;二是將正弦數據 存為文本文件,然后以TEXTIO方式讀取。限于篇幅,具體操作這里不作介紹。 這種行為仿真(Simulate Behavioral Model)的波形與圖3相同,可見(jiàn),本模塊源代碼在功能上完全正確。但時(shí)序仿真(布局布線(xiàn)后仿真SimulatePost-Place&Route VHDL Model)的濾波器輸出波形中的大幅度尖銳毛刺嚴重影響了濾波器的性能。消除毛刺的具體做法是將進(jìn)程中的最后一條信號賦值語(yǔ)句改為: 經(jīng)過(guò)上述賦值語(yǔ)句的修改,再經(jīng)優(yōu)化之后進(jìn)行時(shí)序仿真以及后面的硬件驗證,就會(huì )發(fā)現,濾波器輸出中的毛刺全部被消除,波形平滑,可見(jiàn)優(yōu)化效果非常好。 3.4 硬件平臺的驗證 將該設計方案在硬件平臺上進(jìn)行驗證時(shí),先給硬件平臺加電,再將程序通過(guò)JTAG線(xiàn)下載到PROM中,然后給AD9218數據輸入端加正弦波信號,示波器CH1和CH2探針?lè )謩e搭在A(yíng)D9218數據輸入端和AD9765數據輸出端。這樣。當信號在0.7 MHz頻率以下變化時(shí),兩個(gè)通道的正弦波形相同,只有相位上有一點(diǎn)差別;當信號從0.7~1MHz頻率范圍變化時(shí)。通道CH2波形幅度有微弱減;當信號從1~5 MHz頻率范圍變化時(shí),通道CH2波形迅速衰減為一條水平線(xiàn)。當CH1端分別加0.5 MHz、3 MHz和6 MHz的正弦波時(shí),兩通道顯示的波形相同。 4 一般IIR數字濾波器的快捷實(shí)現 現在總結一下一般IIR數字濾波器的設計及實(shí)現方案。 (1) 仿真系數 根據所定技術(shù)指標通過(guò)MATLAB計算出原始系數矢量b和a,然后選擇適當的擴大倍數,并將系數擴大后取整得到B和A,再根據B和A仿真差分方程遞推算法(注意函數floor()用來(lái)仿真VHDL代碼中std_logic_vector型數據截去末尾幾位,以仿真除法運算)以及頻域和時(shí)域波形最終確定系數B和A (當前時(shí)刻輸出所對應的系數A(1)=1)。 (2) 寫(xiě)VHDL代碼 除了當前時(shí)刻所輸出的所對應系數A(1)外,還應當將所有系數都轉換為std_logic_vector型常量,同時(shí),還要使初始化程序中所有時(shí)刻的輸入輸出變量都為0,然后再在進(jìn)程process中寫(xiě)遞推算法代碼。 (3) Modelsim仿真 用行為級仿真可檢查所寫(xiě)代碼在功能上是否正確,時(shí)序仿真則用于觀(guān)察布局布線(xiàn)后濾波器的輸出波形。 (4) 驗證 將程序下載到硬件平臺上作最終驗證時(shí),濾波器的輸出不一定都有毛刺,但若輸出有毛刺,則應將代碼中最后的數據輸出信號賦值給一中間信號再輸出。 5 結束語(yǔ) 本文以低通濾波器為例,描述了IIR數字濾波器從MATLAB設計到FPGA實(shí)現的整個(gè)過(guò)程,討論了設計中遇到的一些關(guān)鍵性問(wèn)題,并在MAT-LAB及modelsim上作了不同層次的仿真,同時(shí)在硬件平臺上最終驗證了濾波器設計的技術(shù)指標。 基于行為描述方式的遞推算法雖然不是最節省FPGA內部資源的算法,但其優(yōu)點(diǎn)是算法簡(jiǎn)單清晰,代碼簡(jiǎn)短,可大大節省濾波器設計時(shí)間,如果熟練的話(huà),通常十幾分鐘就可以完成一個(gè)滿(mǎn)足性能指標的濾波器的設計;此外本設計還有一個(gè)特點(diǎn),就是該算法僅在一個(gè)時(shí)鐘周期內就可以做完一次對輸人數據的濾波處理,并得到一個(gè)輸出。所以,這種濾波算法對那些高頻高采樣率的輸入信號非常有效。 目前,用這一方法設計的帶通濾波器已經(jīng)在LuolanC遠程無(wú)線(xiàn)導航接收機的前端數字信號處理單元中用于濾除帶外噪聲,其設計的低通濾波器也在其它一些導航系統中用于信號解調。 |