 |
用FPGA實現數位訊號處理(DSP)功能(上)
鈦思科技股份有限公司
企劃部專員 黃忻 譯
|
不論就尺寸或處理速度來說,今日的FPGA (Field Programmable Gate Arrays)都已經達到很高的水準-不僅可以處理個別的數學運算工作,還能夠適用於完整DSP演算法的執行。同時,業界領導廠商也已經推出支援利用FPGA進行數位演算法開發的專業工具。於是一個全新的有趣平台在數位訊號處理世界中誕生。 |
| |
今日的FPGA
今日的FPGA最多可包含1000萬個邏輯匣(logical gates)。雖然這個數目聽起來頗為驚人,但事實上我們並無法因此得知太多資訊。這是因為這些邏輯匣分別位於不同的功能單位(functional
units)中,所以使用者可以利用來進行設計的,其實是邏輯單元(logic cell),而非個別的邏輯匣。這樣的邏輯單元通常包含至少一個正反器(flip-flop)以及其他可配置的邏輯單位。此外,有的FPGA亦包含隨機存取記憶體模塊(RAM
blocks)、乘法器(multipliers)或完整的處理器內核(processor core)等。
Xilinx公司的Virtex II Pro XC2VP125即屬於上述等級的FPGA,並且內建四個整合PowerPC內核(integrated
PowerPC cores)以及556個個別18x18-bit乘法器。這個晶片並提供超過1000個可配置的I/O接腳。當然,這項運用最尖端技術開發出來的產品價格也不便宜。
目前市面上有各式各樣的小型及中型元件可以供一般使用者作選擇,但這反而使得要挑選一個最適合的元件變得更為困難。
通常在一個專案開始進行時,還沒有辦法確定FPGA的詳細需求。然而現在這已經不再是問題了。許多設計可以先利用軟體方式進行實現,在設計的最後階段再加入特定晶片規格所需的資料。這樣的做法可以清楚了解個別元件的被利用狀況,在必要時可以很容易地改用其他的FPGA進行設計。
|
| |
以FPGA實現訊號處理應用
由於在尺寸及內含元件方面的進步,今日的FPGA提供使用者極為廣泛的可能性以進行各種數位訊號處理應用。使用FPGA進行設計及實現與傳統的解決方案-採用數位訊號處理器(DSP)-的差異在於:若要以DSP進行設計,則使用者必須以組合語言(Assembler)或是C語言(C)進行編碼;而FPGA的演算法必須以硬體描述語言(VHDL)來描述。DSP在執行程式時主要是依時間順序進行處理;而利用FPGA時使用者必須將完整的演算法在硬體層級進行設計。
採用FPGA進行設計時,通常只需將執行特定任務的部份及相對應的最佳化算數單位實現在FPGA上(與DSP不同),因此FPGA的解決方案往往特別符合成本效益且較有效率。在高階產品部分,藉由將四個DSP單元整合在同一個FPGA中,僅需使用一塊極小的區域就可以發揮巨大的算數能力。 |
| |
實例應用
下面我們以一個簡單的例子來說明以FPGA為基礎進行DSP設計的流程。在一個示範計劃的架構下,一個三頻的音頻等化器(three-band
audio equalizer)被規劃於在FPGA上實現。實際的聲音訊號經由編解碼器(codec)進入FPGA,通過其中的數位等化器進行處理。然後再送回codec並轉成類比訊號。
為了能清楚說明,我們在這個等化器演算法中利用半頻濾波器進行設計。其中,一個數位高通(high-pass, HP)濾波器及一個數位低通(low-pass,
LP)濾波器分別將這個離散時間輸入訊號切成兩個次頻(sub-band)。接著,再把兩個次頻加總以產生輸入訊號。
|
| |
>
% Buttworth low-pass filter with cut-off frequency w1:
> [G_LP_num, G_LP_den] = butter(2, w1);
>
> % Complement-res high-pass filter:
> G_HP_num = G_LP_den - G_LP_num;
> G_HP_den = G_LP_den;
圖一為整個等化器以及兩個半頻濾波器的示意圖。 |
| |
|
|
|
圖一:三頻數位等化器。
|
| |
| 三頻的訊號分別乘上一個係數(K_Low,
K_Mid及K_High)。輸出訊號y[.]為三個加權次頻訊號的總和。如果三個係數都等於1,則輸出訊號y[.]會等於輸入訊號x[.]。若三個係數中其中任一個係數大於1,則對應的訊號會被放大。反之,則對應訊號會被縮小(衰減)。 |
| |
開發流程
我們使用MATLAB及Simulink開發、模擬並測試這個等化器設計。為了驗證設計,我們將聲音訊號(如:WAV格式檔案)送入模擬環境,通過演算法的處理後,再將訊號播放出來。再這個階段演算法並非即時執行,然而運算速度已經夠快了,所以足以讓我們進行簡單的最佳化動作。
接下來開始進入真正的FPGA設計階段,我們必須確認即使在計算精準至位元時,所設計的演算法仍然符合規格要求。在這一個階段,Xilinx提供一個Simulink模塊組(blockset)以協助使用者。相關模塊中的屬性,包括數字表示(number
representations)、字元寬度(word width)、溢值(overflow)及整數化(rounding)行為等都是可調整的,並可計算精準至位元。
這邊需要特別注意的是,當我們把兩個定點數字相加時,有可能多出一個新的位元。同樣的道理,在進行乘法運算時有可能導致產生幾乎兩倍資料長度的結果。這表示在演算法進行中,字元寬度很容易有不斷增加的傾向。舉例來說,若在計算完成後,其結果必須以16-bit的形式表示,則在計算過程中數字必定要經過適當的方式以進行截短(truncated)或整數化,這些就必須仰賴工程師的設計敏銳度及直覺等。Xilinx的模塊組由於具有高度彈性,所以極為適合這部分工作的進行。
另外需要提出說明的一點是,原則上也可以使用Simulink及Xilinx提供之模塊發展演算法。然而在實務上Xilinx模塊的模擬時間往往比在MATLAB中所需的時間來得長,這是由於Xilinx模塊需計算精確至位元的特性。
在這個步驟的最後階段,我們以一個Simulink模型表示這個數位等化器設計。由於具描述精準至位元的特性,這個模型的行為與之後將在FPGA上執行的模型完全相同。 |
| |
|
|
|
|
| |