- 基于FPGA的數字信號處理
- 高亞軍編著
- 2088字
- 2019-01-09 14:46:00
第3章 數字信號處理中的基本運算
以數字方式進行信號處理,歸根結底可分解為一些基本的數學運算,如加法運算、乘法運算、累加運算、比較運算及開方運算等。其中,加法運算和乘法運算是數字信號處理中的兩大主要運算。既然是數學運算,就涉及一個根本問題:數字的表示方法。而數字又可分為定點數和浮點數,這使問題進一步分解為定點數的表示和浮點數的表示。就FPGA而言,其勝任定點運算的能力更為顯著。鑒于此,本章只討論定點數所涉及的相關內容。
眾所周知,計算機以二進制方式表示數字,所以深入理解二進制原碼、反碼和補碼等基本概念是進行邏輯設計的關鍵環節。本章將二進制運算貫穿其中,重點闡述基本運算涉及的相關問題及相應的電路設計。
3.1 定點數的表示
3.1.1 二進制數的原碼與補碼
二進制計數是數字電路的本質。數字電路中的高、低電平即表征了1和0。為了能夠正確地使用二進制計數,就必須清楚二進制表示數字的方法和特點。這里首先給出以下結論。
N位二進制數所能表示的無符號整數范圍是[0,2N-1],所能表示的有符號整數范圍是[-2N-1,2N-1 -1]。
需要強調的是,N位二進制數是無法表示有符號整數2N-1的。在表示無符號整數時,采用的是二進制原碼;而表示有符號整數時,則采用二進制補碼,此時,最高位為符號位,0表示正數,1表示負數。因此,在用二進制數表示無符號整數時,可虛擬出一個符號位作為最高位,此符號位始終為0,從而達到二進制原碼與補碼的統一。
表3.1舉例給出了4位二進制原碼與無符號整數的對應關系[1],也給出了將二進制原碼轉換為無符號整數的方法。例如,12=1 ×8+1 ×4。
表3.1 4位二進制原碼與無符號整數的對應關系

進一步,將4位二進制原碼從最高有效位(Most Significant Bit,MSB)到最低有效位(Least Significant Bit,LSB)依次展開縱向排列,如圖3.1所示,圖中DEC表示十進制數。可以發現,最低位波形變化速率是次低位的2倍,次低位波形變化速率是次高位的2倍,次高位波形變化速率又是最高位的2倍。這為設計等占空比的2的整數次冪的分頻器提供了依據,也為測試模數轉換器(Analog Digital Converter,ADC)芯片提供了方法。同時,也啟迪設計師從不同角度去看待事物,正如宋代著名詩人蘇軾那極富哲理的詩句“橫看成嶺側成峰,遠近高低各不同”。

圖3.1 展開的4位二進制原碼縱向排列
在設計計數器時常用無符號整數,而在數學運算中大多采用有符號整數,這就涉及如何獲取負整數的二進制補碼的問題。表3.2舉例給出了4位二進制補碼與有符號整數的對應關系,也給出了將二進制補碼轉換為有符號整數的方法。例如,-4=1 ×(-8)+1 ×4。對比表3.1和表3.2,不難發現-7的補碼和9的原碼以4位二進制表示時相同,且-7和9分別取絕對值并相加,其結果為24。這就為我們求取負整數的二進制補碼提供了方法,如圖3.2所示,圖中給出了3種求取負整數二進制補碼的方法。
表3.2 4位二進制補碼與有符號整數的對應關系


圖3.2 將整數轉換為二進制補碼的方法
根據如圖3.2所示的求補碼的方法,求取有符號整數-4的4位二進制補碼可按以下方法進行。
方法1:24 -| -4|=12,12以4位二進制原碼表示為1100,這即為-4的4位二進制補碼。
方法2:|-4|=4,4以4位二進制原碼表示為0100,其反碼為1011,加1為1100。
方法3:|-4|=4,4以4位二進制原碼表示為0100,逐位取反直至最后一個1止,即為1100,次高位1及其后面的兩個0保持不變。
用同樣的方法可知,-4的5位二進制補碼為11100。不難發現,11100是1100將符號位擴展1位得到的。所謂符合位擴展,是指將符號位向高位復制。這說明符號位擴展是不改變數值大小的,認識這一點是非常重要的。
根據上述有符號整數與二進制碼的對應關系,對于給定的有符號整數 X,可由式(3.1)確定其以二進制補碼表示時的最小位寬ws。

式中,ceil表示向上取整。
對于無符號整數,因為不需要符號位,故其以二進制原碼表示時的最小位寬為

3.1.2 定點數的字長問題
字長(位寬)和小數部分字長共同構成了定點數的兩個要素。以wl表示字長,以fl表示小數部分字長,那么有符號定點數以Fix_wl_fl的形式表示,無符號定點數以UFix_wl_fl的形式表示。整數可看做是小數點在最后一位,即fl為0。對于定點小數,一旦wl與fl確定,那么小數點的位置即可固定。表3.3舉例給出了Fix_5_3與十進制小數的對應關系。
在定點小數中,有一類值得關注,那就是只有一位整數位的定點小數。表3.4給出了Fix_5_4與十進制小數的對應關系。可見,此類定點小數只能表示(-1,1)區間內的純小數,范圍受限。在表3.4中,如果將小數點“抹掉”,把其視為整數,那么也就是將數值放大了16倍,這對運算結果并沒有實質的影響。采用FPGA實現數字信號處理時是可以這么做的。
表3.3 Fix_5_3與十進制小數的對應關系

表3.4 Fix_5_4與十進制小數的對應關系

定點數據在運算時要防止溢出,包括上溢(Overflow)和下溢(Underflow)。上溢是指運算結果超出了定點數整數部分所能表示的范圍,下溢是指運算結果超出了定點數小數部分所能表示的范圍。例如,UFix_4_2所能表示的定點數的范圍為[0,3.75],步進(精度)為0.25,如果運算結果為4,則發生上溢;如果運算結果為0.125,則發生下溢。一旦溢出將會造成計算精度的損失甚至結果的錯誤。因此,合理地選擇字長尤為重要。
定點數據的量化模式決定了當運算結果的精度高于定點數所能表示的精度時如何對超出精度部分的比特處理。通常有兩種處理方式:Truncate和Round。Truncate為直接截尾,將超出精度部分的比特舍棄掉。Round即“四舍五入”,將舍去的比特的最高位加到要保留的比特的最低位。量化模式的兩種處理方式如圖3.3所示。顯然,采用Round可獲得更高的精度,但也需要額外的資源。這兩種方式都是針對發生下溢時的處理方式。

圖3.3 量化模式的兩種處理方式
定點數據的溢出模式決定了當運算結果大于定點數所能表示的最大值時如何對溢出部分處理。通常有兩種處理方式:Saturate和Wrap。Saturate為飽和處理,一旦溢出就將計算結果飽和處理為最大值。Wrap為截斷處理。溢出模式的兩種處理方式如圖3.4所示。不難看出溢出對計算結果的不利影響。這兩種方式都是針對發生上溢時的處理方式。

圖3.4 溢出模式的兩種處理方式