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