付 正, 鄭維智, 江遠(yuǎn)志
(北京工商大學(xué) 機(jī)械工程學(xué)院, 北京 100048)
現(xiàn)場可編程邏輯器件FPGA是可編程邏輯器件中一個重要的分支. FPGA使用了可編程領(lǐng)域中最常用的硬件描述語言VHDL,以及Max-plus Ⅱ作為仿真軟件. FPGA在網(wǎng)絡(luò)、數(shù)據(jù)處理、儀器、軍事、工業(yè)控制、通信和航空航天等眾多領(lǐng)域都得到了廣泛應(yīng)用,隨著功耗和成本的進(jìn)一步降低,F(xiàn)PGA還將進(jìn)入更多的應(yīng)用領(lǐng)域[1-2].
本文在一個有限脈沖響應(yīng)數(shù)字濾波器(finite impulse response,即FIR)的可編程邏輯器件實現(xiàn)的基礎(chǔ)上做了一定的優(yōu)化和改進(jìn),詳細(xì)地闡明了濾波器涉及的流程和原理.
所謂并行FIR濾波器指的是數(shù)據(jù)是并行輸入的,對這些數(shù)據(jù)的處理也是并行的,這樣能夠達(dá)到在一個時鐘內(nèi)對一個輸入數(shù)據(jù)進(jìn)行處理的目的.
數(shù)字濾波器通常都是用來改變時域或頻域中信號的屬性的. 其中最為常見的數(shù)字濾波器是線性時不變(linear time-invariant,LTI)濾波器. 輸入信號經(jīng)過LTI濾波器時經(jīng)過了一個稱為線性卷積的過程. 用公式可以表示為y=f*x,其中f指的是濾波器的脈沖響應(yīng)函數(shù),x表示的是輸入信號,而y則表示卷積輸出. 線性卷積過程的定義如下:
(1)
線性時不變數(shù)字濾波器分為無限脈沖響應(yīng)濾波器(infinite impulse response,即IIR)和有限脈沖響應(yīng)濾波器FIR兩大類. 顧名思義,F(xiàn)IR濾波器是由有限個采樣值組成的,只需進(jìn)行有限次卷積,而IIR濾波器則要執(zhí)行無限數(shù)量次卷積.
有限脈沖響應(yīng)濾波器可由式(2)的差分方程表示
(2)
式(2)中,bl系數(shù)和系統(tǒng)的脈沖響應(yīng)是直接相關(guān)的,bl=h(l). 因此式(2)可改為
(3)
對式(3)進(jìn)行Z變換,得到式(4)輸入輸出關(guān)系
(4)
在實際應(yīng)用中,式(4)由幾個不同形式的部件組成:延時器,乘法器,加法器.
帶有常系數(shù)的FIR濾波器是一種LTI數(shù)字濾波器. L階或者長度為L的FIR輸出對應(yīng)于輸入時間序列x(n)的關(guān)系由一種有限卷積形式給出,具體的形式如下:
(5)
其中從f(0)≠0一直到f(L-1)≠0均是濾波器的L階系數(shù),同時也對應(yīng)于FIR的脈沖響應(yīng). 對于LTI系統(tǒng)可以更方便地將上式表示成為z域內(nèi)的形式:
Y(z)=F(z)X(z).
(6)
其中F(z)是FIR的傳遞函數(shù),其z域內(nèi)的形式:
(7)
傳統(tǒng)的線性FIR濾波器的實現(xiàn)結(jié)構(gòu)如圖1.
圖1 傳統(tǒng)的線性FIR濾波器的實現(xiàn)結(jié)構(gòu)Fig.1 Traditional linear FIR filter implementation structure
對于改進(jìn)型的結(jié)構(gòu)主要在于并行矢量乘法器模塊,由于它占用這個系統(tǒng)的大量資源,其設(shè)計決定了整個系統(tǒng)設(shè)計是否優(yōu)良. 并行矢量乘法器模塊的設(shè)計方法有許多種,見圖1,輸入數(shù)據(jù)與沖擊響應(yīng)相乘是通過乘法器完成的,然后利用加法器把它們相加起來. 這樣設(shè)計存在比較大的缺陷,主要是乘法器的實現(xiàn)非常困難,會占用很多資源,系統(tǒng)冗余很大,因此需要的時鐘延遲也比較長. 本文采用了查找表的方法來設(shè)計并行矢量加法器(見圖2).
數(shù)字濾波器需要處理的是離散信號,因此必須先將輸入的模擬信號通過模數(shù)轉(zhuǎn)換成離散信號.
圖2 并行FIR濾波器的模塊劃分Fig.2 Parallel FIR filter module division
A/D模塊的采樣數(shù)據(jù)首先送到并行時延模塊中,在每個時鐘周期內(nèi)都將下一組數(shù)據(jù)向下移動一位,由于器件中的邏輯單元均帶有同步使能的可編程觸發(fā)器,因此將移位寄存器組中的每個移位寄存器都設(shè)計成一組并聯(lián)的D觸發(fā)器,D觸發(fā)器個數(shù)為輸入數(shù)據(jù)的有效位數(shù). 因為所有D觸發(fā)器共用一個時鐘脈沖,所以每個時種均可以輸出一組數(shù)據(jù),從而使每個移位寄存器實現(xiàn)了一個時鐘延遲,完成需要的功能.
抽頭系數(shù)模塊是人工將抽頭系數(shù)的所有可能的組合都固化在FPGA的ROM中. 通過加法器模塊的作用輸出數(shù)據(jù)相應(yīng)位的組合,然后根據(jù)查找表輸出相應(yīng)的值.
移位相加模塊是通過對顯示查找表(look-up-table,簡稱LUT)輸出的值進(jìn)行移位相加來實現(xiàn)乘法功能的,在經(jīng)過了移位相加運算后,通過寄存器輸出y(n)的值.
為了使設(shè)計的實際效果更加直觀,舉例說明16階線性FIR低通濾波器的具體實現(xiàn)過程.
假設(shè)輸入為:x=sin(40πt)+0.2cos(400πt),如圖3,其中xb=0.2cos(400πt)是疊加在x=sin(40πt)的干擾信號. 疊加之后的輸入信號波形如圖4,設(shè)計指標(biāo)為:ωp=0.1π,xs=0.15π,fs=1 000 Hz.
濾波器的頻率響應(yīng)波形如圖5.
圖3 源信號與干擾信號的波形Fig.3 Source signal and interference signal waveform
圖4 疊加后輸出波形Fig.4 Superposed output waveform
圖5 濾波器的頻率響應(yīng)波形Fig.5 Filter frequency response waveform
輸入信號的抽樣和量化用于并行方式中的模數(shù)(A/D)轉(zhuǎn)換,其目的就是通過對連續(xù)信號進(jìn)行抽樣并量化成二進(jìn)制補(bǔ)碼的形式將之變?yōu)閿?shù)字信號,即x(n). EP1K30系列FPGA只支持定點運算,以此來實現(xiàn)更高的速度和更低廉的成本,因此必須對采樣信號進(jìn)行相應(yīng)的轉(zhuǎn)換,通常采樣信號的數(shù)值比較小,需要先將之放大,之后把放大后的信號轉(zhuǎn)換成7位二進(jìn)制補(bǔ)碼的形式. 值得注意的是,這個轉(zhuǎn)換過程是通Mat1ab仿真來實現(xiàn)的[3].
預(yù)相加模塊是由并行時延模塊和加法器組模塊組成的. 其目的主要實現(xiàn)在每個時鐘周期將輸入的采樣數(shù)據(jù)x(n)進(jìn)行延時,同時將對稱的那些抽頭系數(shù)中的x(n)預(yù)相加,最后將結(jié)果輸出到抽頭系數(shù)模塊中. 在該模塊中,x-in(6:0)是采樣輸入信號,clk代表系統(tǒng)時鐘,sum0,suml,sum2,sum3是八階濾波器預(yù)相加的結(jié)果并行輸出信號.
具體程序如下:
Library ieee;
Use ieee.std-logic-1164.all;
Use ieee.std-logic-arith.all;
Use ieee.std-logic-unsigned.all;
Entity preadd is
Port(x-in : in std-logic-vector(6 downto 0);
Clk : in std-logic;
Sum0,sum1,sum2,sum3: out std-logic-vetor(7 downto 0);
End preadd;
Architecture Behavioral of Preadd is
Signal x0,x1,x2,x3,x4,x5,x6,x7:std-logie-vector(6 downto 0):=“0000000”;
Signal x0-temp,x1-temp,x2-temp,x3-temp,x4-temp,x5-temp,
X6-tem,x7-temp:std-logic-vector(7 downto 0);
Component reg
Port (d: in std-logic-vector (6 downto 0);
cIk: in std-logic:
q: out std-logic-vector(6 downto 0)
);
End component:
Begin
P1: reg port map(x-in,clk,x0);
P2: reg port map(x0,clk,x1);
p3: reg port map(xl,clk,x2);
p4: reg port map(x2,clk,x3);
p5: reg port map(x3,clk,x4);
p6: reg port map(x4,clk,x5);
p7: reg port map(x5,clk,x6);
p8: reg port map(x6,clk,x7);
xo-temp<=x0(6)&x0;
xl-temp<=x1(6)&x1;
x2-temp<=x2(6)&x2;
x3-temp<=x3(6)&x3;
x4-temp<=x4(6)&x4;
x5-temp<=x5(6)&x5;
x6-temp<=x6(6)&x6;
x7-temp<=x7(6)&x7;:
sum0<=x0-temp+x7-temp;
sum1<=x1-temp+x6-temp;
sum2<=x2-temp+x5-temp;
sum3<=x3-temp+x4-temp;
end behavioral
將濾波器的截止頻率設(shè)置為50 Hz,ωp=0.1π,借助于Matlab仿真軟件通過調(diào)用相應(yīng)的窗函數(shù),通過截止頻率和設(shè)計濾波器的階數(shù)兩個參數(shù)調(diào)用firl函數(shù),求出濾波器的脈沖響應(yīng)系數(shù)h(n).對應(yīng)于不同的窗函數(shù),所求得的h(n)見表1,通常用8位字長來表示h(n).
此模塊又包括抽頭系數(shù)和移位相加兩個子模塊. 作為FIR濾波器優(yōu)化的主要方面,采用基于查找表結(jié)構(gòu)的模數(shù)轉(zhuǎn)換改進(jìn)結(jié)構(gòu)來替代傳統(tǒng)的硬件乘法器. 由于使用的是四輸入的LUT,因此為了節(jié)省硬件資源,將16階濾波器變?yōu)閮蓚€級聯(lián)的八階FIR數(shù)字濾波器,這樣有利于擴(kuò)展成更高階的濾波器. 由于h(n)具有對稱結(jié)構(gòu),對于八階線性FIR濾波器可以采用四輸入的形式,將h(n)有可能出現(xiàn)的各種組合預(yù)先存在查找表中,參見表2.
表1 采用漢明窗得到的h(n)Tab.1 Obtained by Hamming window h(n)
表2 16階FIR濾波器的LUT表(8位)Tab.2 16FIR filter LUT order form (8)
為了使設(shè)計更具有普遍性,在設(shè)計中所有的數(shù)據(jù)使用的都是二進(jìn)制補(bǔ)碼的形式,由于中間的計算過程可能會出現(xiàn)數(shù)據(jù)溢出,從而導(dǎo)致計算結(jié)果產(chǎn)生無法估量的錯誤. 因此在兩個數(shù)據(jù)相加的時候采用增加符號擴(kuò)展位的方法來防止數(shù)據(jù)溢出,實踐證明這種方法十分有效. 具體做法:將要相加的兩個數(shù)的最高位的符號位均向前擴(kuò)展一位,這么做就保證了中間計算結(jié)果的正確性. LUT的輸出位寬是9位,而其中最高位為符號擴(kuò)展位. 因為輸入數(shù)據(jù)位寬是8位,因此在并行結(jié)構(gòu)中,sb(n)[b=0,1…7]分別對應(yīng)了8個查找表,而前7位對應(yīng)的查找表完全相同;對于最高位(符號位)對應(yīng)的查找表,為了全部用加法器以提高運算速度,輸入到該查找表的數(shù)據(jù)是表3的補(bǔ)碼形式. 另一個級聯(lián)的8階濾波器設(shè)計方法與上述內(nèi)容完全相同,唯一不同的是寫入ROM中的數(shù)值為h(4),h(5),h(6),h(7)的所有組合形式,得到的實驗結(jié)果如圖6. 本設(shè)計中LUT是由抽頭系數(shù)模塊來實現(xiàn)的,其實現(xiàn)方式通過EP1K系列器件中的Core generator和VHDL語言將以上數(shù)據(jù)固化在ROM中,這樣做使模塊的可移植性更好. 另外并行移位相加模塊是將sum0,sum1,sum2,sum3中相同的有效位來組成地址信號,之后通過LUT輸出值table-out[0:8]得到相對應(yīng)的部分積,最后通過移位寄存器和加法器將上面得到的部分積相加,從而得到了最終的乘積y(n). 其模塊符號如圖7.
表3 16階FIR濾波器的LUT表(9位)Tab.3 FIR order filter LUT table (9)
圖6 經(jīng)過濾波后的輸出波形Fig.6 After filtered output waveform
圖7 四乘8位乘累加模塊符號Fig.7 4×8-bit multiply accumulate module symbols
在FPGA中通過流水線技術(shù)進(jìn)行并行可重復(fù)配置高精度的FIR濾波器設(shè)計,方便地改變?yōu)V波器的系數(shù)和階數(shù). 采用這種FIR濾波器的設(shè)計方法可以充分發(fā)揮FPGA的優(yōu)勢.
FIR濾波器中的流水線技術(shù)不僅可以擴(kuò)展信號頻帶和濾除多余的噪聲,還可以通過改變信號的特定頻譜分量來得到預(yù)期的結(jié)果. 數(shù)字濾波器在無線通信等領(lǐng)域中有著廣泛的應(yīng)用. 在數(shù)字信號處理中,傳統(tǒng)濾波器是通過高速乘法累加器來實現(xiàn)的,這種方法的缺陷在于,在下一個采樣周期到來前濾波器只能進(jìn)行有限操作,因此帶寬受到了限制. 通過使用并行流水線結(jié)構(gòu)的FIR濾波器,可以使即便64階、128階甚至更高階的濾波器與16階濾波器的速度一樣快,其特點是在算法的每一個階段存取數(shù)據(jù). FPGA結(jié)構(gòu)使得在以采樣速率處理數(shù)字信號的過程中,常數(shù)乘法器成為理想的載體,從而提高了整個系統(tǒng)的速度和效率. 值得注意的是,由于設(shè)計要求存在差異,在整個設(shè)計過程中,各個環(huán)節(jié)也會有所不同,這就需要根據(jù)不同的要求對數(shù)據(jù)進(jìn)行不同的處理,如截斷、擴(kuò)展等,最終才能設(shè)計出既滿足設(shè)計需要,又節(jié)省FPGA資源的電路.
本文設(shè)計并實現(xiàn)的FIR濾波器可以作為數(shù)字信號處理系統(tǒng)中的某一部件使用,在濾波器中,輸入數(shù)據(jù)和輸出數(shù)據(jù)都采用的是并行方式,并且都是通過二進(jìn)制的補(bǔ)碼形式來表示. 當(dāng)需要實現(xiàn)更高階數(shù)濾波器的時候,可以通過以多個濾波器模塊級聯(lián)的方式組成濾波器,其公式如(8):
(8)
依據(jù)式(8),級聯(lián)形式如圖8.
圖8 級聯(lián)Fig.8 Cascade
設(shè)計的FIR濾波器采用了兩個8階的線性有限長濾波器通過級聯(lián)的方式組成一個16階FIR濾波器. 在硬件資源足夠的條件下,原則上可以通過級聯(lián)的方式來實現(xiàn)任意高階的FIR濾波器. 但是通
常由于硬件FPGA資源的限制以及設(shè)計的實際需要,實現(xiàn)太高階的濾波器往往是不現(xiàn)實的.
在并行時不變有限長濾波器的設(shè)計過程中,通過大量使用查找表和流水線技術(shù),使得濾波器的數(shù)據(jù)處理能力得到明顯加強(qiáng),濾波器的性能有較大的提高. 由于每隔一個時鐘就可以輸出一個數(shù)據(jù),濾波器可以在很高的時鐘下運行,但是較高的運算速度是以耗費FPGA的硬件資源為代價的.