新聞中心

EEPW首頁 > EDA/PCB > 設(shè)計(jì)應(yīng)用 > 基于FPGA的高效FIR濾波器設(shè)計(jì)與實(shí)現(xiàn)

基于FPGA的高效FIR濾波器設(shè)計(jì)與實(shí)現(xiàn)

作者: 時(shí)間:2011-03-24 來源:網(wǎng)絡(luò) 收藏

  3 基于

  用設(shè)計(jì)濾波器的關(guān)鍵在于如何處理占用大量資源的乘法單元。分布式算法(DA) 的提出可將乘法運(yùn)算轉(zhuǎn)換為移位相加運(yùn)算, 從而節(jié)約硬件資源。若令Hk為濾波器系數(shù), xk (n) 為n時(shí)刻的采樣輸入, y (n) 為n時(shí)刻的系統(tǒng)響應(yīng), 那么, 式(1) 就可以等效于下式:



  把數(shù)據(jù)的源數(shù)據(jù)格式規(guī)定為2的補(bǔ)碼形式,則有:



  式中, xkb (n) 為二進(jìn)制數(shù), 可取值為0或1;xk0 (n) 為符號(hào)位, 為1表示數(shù)據(jù)為負(fù), 為0表示數(shù)據(jù)為正。因此, 將(4) 式代入(3) 式可得:



  式(5) 的形式被稱為分布式算法??梢钥闯?, 方括號(hào)內(nèi)表示輸入變量的一個(gè)數(shù)據(jù)位和所有濾波器抽頭系數(shù)H0~HN的每一位進(jìn)行“與” 運(yùn)算并求和。而指數(shù)部分則說明了求和結(jié)果的位權(quán),整數(shù)乘以2b就是左移b位, 對(duì)此可以通過硬件連線來實(shí)現(xiàn), 而不占用邏輯資源。這樣就可以通過建立查找表來實(shí)現(xiàn)方括號(hào)中的運(yùn)算。查找表可用所有輸入變量的同一位進(jìn)行尋址, 這便是基于查找表的分布式算法(LUT-DA)。

  LUT-DA算法的查找表大小為B·2N bits, 其中B為輸入數(shù)據(jù)的位寬, N為濾波器階數(shù)。隨著濾波器階數(shù)的增加, 查找表大小是2的指數(shù)增長;當(dāng)B為16, N為128時(shí), 查找表的大小已經(jīng)不可想象。故將查找表分割成多個(gè)子表, 可以有效解決這個(gè)問題, 這也衍生了比較有效的串行LUT-DA算法和并行LUT-DA算法, 但兩者都有不足的地方。對(duì)于串行結(jié)構(gòu), 要完成一次輸出, 需要大于B的多個(gè)時(shí)鐘周期; 而對(duì)于并行結(jié)構(gòu), 雖然可以一個(gè)時(shí)鐘周期完成一次輸出, 但需要復(fù)制B個(gè)完全相同的LUT表, 而這會(huì)增加硬件資源的開銷。

  為了兼顧速度和面積, 本文設(shè)計(jì)了一種基于DA算法原理的CSD-DA算法。首先, 將系數(shù)式(3) 中的固定系數(shù)Hk按2的冪展開后可得:



  然后交換移位和累加順序, 則可得到下式:



  式中, Hkb是值為0或者1的權(quán)重系數(shù); Sk為1表示Hk為正, 為-1則表示Hk為負(fù); s′kb的值可取0、-1或者1。經(jīng)過(4) 式的展開, 乘法運(yùn)算將被全部轉(zhuǎn)換為移位相加運(yùn)算, 其中權(quán)重為0的部分可以剔除而不進(jìn)行計(jì)算。為了更進(jìn)一步減少Hkb陣列中的非零項(xiàng), 可將Hk編碼為CSD碼, 即從二進(jìn)制編碼最低的有效位開始, 用10···01來取代所有大于或等于2的1序列, 1表示該位為-1。由于CSD表示其中任何相鄰的兩位中, 必包含一個(gè)0,故1的數(shù)量最多不會(huì)超過N/2。平均來說, CSD表示其中大約有1/3的位為非零值, 這比補(bǔ)碼表示少大約1/3的非零位。假設(shè)h= (15) 10= (01111) 2,y=hx=x (23+22+21+20), 而如果將(15) 10編碼為(10001) csd, 那么, Y=x· (24-20)。采用二進(jìn)制編碼方式, 將用到3個(gè)加法器, 而用CSD編碼, 則只用了一個(gè)減法器, 可見, CSD編碼可以從本質(zhì)上減少硬件資源開銷。經(jīng)過CSD編碼優(yōu)化后, s′kb非零值的個(gè)數(shù)會(huì)遠(yuǎn)小于Hkb的非零值個(gè)數(shù)。

  對(duì)于線性相位系數(shù)對(duì)稱的濾波器, 為了減少乘法單元, 可選擇圖3所示的結(jié)構(gòu)。由于所有的乘法運(yùn)算都可轉(zhuǎn)化為大量的加法和減法運(yùn)算, 故將導(dǎo)致關(guān)鍵路徑過長, 系統(tǒng)運(yùn)行速度較低。而加入流水線寄存器, 則可減少關(guān)鍵路徑長度, 從而提高系統(tǒng)的最大工作頻率。在b為定值時(shí), s′kb的非零值個(gè)數(shù)存在不確定性, 故在進(jìn)行流水線設(shè)計(jì)的時(shí)候, 可根據(jù)s′kb進(jìn)行靈活的分割, 路徑越長, 加入的流水線寄存器越多。為了防止中間結(jié)果的溢出, 寄存器的位寬要有冗余設(shè)計(jì), 對(duì)于有符號(hào)的數(shù), 其位寬取值為M+log2N-1, M為上級(jí)累加器位寬, N為濾波器階數(shù)。流水線CSD-DA算法局部結(jié)構(gòu)

圖3 流水線CSD-DA算法局部結(jié)構(gòu)

  從圖3的流水優(yōu)化CSD-DA算法結(jié)構(gòu)可見, 所有乘法都會(huì)轉(zhuǎn)換為移位加法, 移位運(yùn)算可用硬件連線實(shí)現(xiàn), 整個(gè)結(jié)構(gòu)經(jīng)過了合理的流水線分割。



關(guān)鍵詞: FPGA FIR 濾波器設(shè)計(jì)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉