在FPGA系統(tǒng)中有兩個(gè)基本準(zhǔn)則非常重要,分別為:數(shù)字表示法和代數(shù)運(yùn)算的實(shí)現(xiàn)。本博文主要介紹數(shù)字表示。
可以購(gòu)買(mǎi)相關(guān)書(shū)籍進(jìn)行研讀。
零、計(jì)數(shù)系統(tǒng)框架
一 、整數(shù)的表示
數(shù)字信號(hào)處理中需要考慮的基本要點(diǎn)是數(shù)字的表示,數(shù)字信號(hào)處理需要將量值用有限精度的數(shù)字表示。一方面,該表示必須足夠準(zhǔn)確地處理數(shù)字信號(hào)處理系統(tǒng)中真實(shí)世界的輸入和輸出;另一方面, 該表示必須在硬件實(shí)現(xiàn)方面具有高效性。
二進(jìn)制數(shù)的使用是任何數(shù)字系統(tǒng)的基礎(chǔ), 當(dāng)處理大型復(fù)雜的 DSP 系統(tǒng)時(shí), 每秒將需要處理數(shù)十億次的乘加運(yùn)算。因此, 通過(guò)減少位數(shù)來(lái)降低硬件開(kāi)銷(xiāo)的方法將變得非常有意義。
假設(shè)有一個(gè)使用 16 位分辨率運(yùn)算的 DSP 濾波應(yīng)用, 因此對(duì)于一個(gè) 16 位乘 16 位并行乘法 , 硬件開(kāi)銷(xiāo)的量級(jí)為 16 X 16 = 256 個(gè)單元。使用 16 位字長(zhǎng)的原因是它就是 DSP處理器通常使用的字長(zhǎng), 鑒于習(xí)慣仍然選擇一樣的字長(zhǎng)。在 FPGA世界中可以選擇分辨率。因此, 如果說(shuō) 9 位分辨率已經(jīng)足夠了, 乘法器的硬件開(kāi)銷(xiāo)即為 9 X 9= 81 個(gè)單元。這大約是使用 16 位計(jì)算開(kāi)銷(xiāo)的 30%。
因此正確選擇字長(zhǎng)很重要:使用太多位浪費(fèi)硬件資源, 而太少則會(huì)損失分辨率。所以, 保證選擇正確的字長(zhǎng)的前提是掌握算法和 DSP 知識(shí)。
1.1 二進(jìn)制反碼
可使用二進(jìn)制反碼描述正數(shù)和負(fù)數(shù)。求一個(gè)數(shù)的反碼只需對(duì)所有的位取反。然而需要注意, 當(dāng)使用反碼時(shí), 有兩種表示數(shù)字 0 的方法, 通常來(lái)說(shuō), 用反碼并不能直接表示算術(shù)運(yùn)算。
當(dāng)在這種數(shù)字系統(tǒng)中執(zhí)行二進(jìn)制運(yùn)算時(shí), 將遇到奇怪的問(wèn)題, 這是由于數(shù)字 0 有兩個(gè)表示版本。事實(shí)上,-0 小于+0,這是由于使用反碼表示時(shí):-0+ 1 =+0;+0 -1=-0。
實(shí)現(xiàn)上述功能需要相當(dāng)復(fù)雜的硬件。實(shí)際需要的是這樣一種系統(tǒng), 其處理正數(shù)和負(fù)數(shù)與處理無(wú)符號(hào)數(shù)字一樣, 不需要增加硬件的復(fù)雜性。
反碼實(shí)際上從來(lái)沒(méi)有在實(shí)時(shí) DSP 或數(shù)字系統(tǒng)中使用過(guò), 但是它能夠引出標(biāo)準(zhǔn)形式的二進(jìn)制補(bǔ)碼的概念。
1.2 二進(jìn)制補(bǔ)碼
對(duì)于+0 和-0 來(lái)說(shuō), 更加合理的數(shù)字系統(tǒng)為只有一個(gè) 0 的二進(jìn)制補(bǔ)碼。表 1.1 給出了二進(jìn)制補(bǔ)碼的表示。
生成 0 的第 9 位可被忽略, 注意用二進(jìn)制補(bǔ)碼可以表示- 128,但不能表示+ 128。在對(duì)正值取反時(shí), 會(huì)發(fā)現(xiàn)需要用第 9 位表示負(fù)零。然而, 如果簡(jiǎn)單地忽略這個(gè)第 9 位 , 那么這個(gè)負(fù)零與正零的表示將完全相同。
注意在數(shù)值系統(tǒng)中, 每個(gè)位置上階的意義。例如對(duì)于十進(jìn)制 156 來(lái)說(shuō):
也就是說(shuō)字符串“156”代表數(shù)字 156,它是每個(gè)位置上的值與其階的乘積的和。
如表1.2 所示, 這個(gè)規(guī)則對(duì)二進(jìn)制數(shù)也同樣適用。如表 1.3 所示, 對(duì)于二進(jìn)制補(bǔ)碼整數(shù), 如果將最左列考慮為負(fù)值, 則結(jié)果同樣適。
二、 非整數(shù)值的表示
在數(shù)字信號(hào)處理系統(tǒng)中, 經(jīng)常希望描述諸如正弦波的信號(hào), 顯然需要處理非整數(shù)數(shù)值的情況。對(duì)這種非整數(shù)值要求的一種可能的解決辦法是允許正弦波幅度按比例增加并以整數(shù)形式來(lái)表示。
這種方法很常見(jiàn), 但在某些情況下, 需要表示 0~1 之間的數(shù)值, 也需要表示整數(shù)之間的數(shù)值。用十進(jìn)制表示小數(shù)很容易。通過(guò)引入十進(jìn)制小數(shù)點(diǎn)來(lái)描述非整數(shù), 并在小數(shù)點(diǎn)的右邊插人數(shù)字。例如:
在式中, 字符串“10.34”代表數(shù)字 10. 34 ,即 10 的乘方的倍數(shù)的總和。
同樣地, 可以對(duì)二進(jìn)制數(shù)執(zhí)行同樣的運(yùn)算:
在式屮, 字符串“10.01”表示數(shù)字 2.25,即 2 的乘方的倍數(shù)的總和。
2.1 定點(diǎn)二進(jìn)制數(shù)
定點(diǎn)數(shù)就是二進(jìn)制小數(shù)點(diǎn)在固定位罝的數(shù)。二進(jìn)制小數(shù)點(diǎn)左邊部分的位被定義為整數(shù)位, 而該點(diǎn)右邊部分的位被定義成小數(shù)位。舉例來(lái)說(shuō):“101.01011”有 3 個(gè)整數(shù)位, 5個(gè)小數(shù)位。如表 2.1 所示, 定點(diǎn)數(shù)按類(lèi)似的方式處理有符號(hào)整數(shù)。
根據(jù)表 2.1可得, 110.00111( 二進(jìn)制數(shù)) = - 1.78125( 十進(jìn)制數(shù))
如表 2.2所示 , 一種非常重要的定點(diǎn)數(shù)字類(lèi)型只有一個(gè)整數(shù)位。
例如, Motorola StarCore 和 TI C62x DSP 處理器都使用只有一個(gè)整數(shù)位的定點(diǎn)表示法。這種格式可能是有問(wèn)題的, 因?yàn)樗荒鼙硎? 1.0,實(shí)際上, 任何定點(diǎn)格式都不能表示其負(fù)數(shù)最小值的相反數(shù)。
所以在使用定點(diǎn)數(shù)時(shí)要多加注意。一些 DSP 處理器結(jié)構(gòu)允許利用擴(kuò)展位對(duì)格式進(jìn)行 1 個(gè)整數(shù)位的擴(kuò)展( 這些擴(kuò)展位就是附加的整數(shù)位)。
2.2 定點(diǎn)量化
重新考慮數(shù)字的格式:aaa. bbbb 表示 3 個(gè)整數(shù)位, 5 個(gè)小數(shù)位??梢员硎? 4 和3.96785 之間的數(shù), 數(shù)之間的步長(zhǎng)為 0.03125。由于具有 8 位, 故具有 28 = 256 個(gè)不同的值。需要注意使用定點(diǎn)時(shí)的量化,將有± 1 /2LSB( 最低有效位) 的誤差。
量化就是使用有限數(shù)位來(lái)表示無(wú)限精度的數(shù)。在十進(jìn)制中, 很熟悉處理給定位數(shù)的十進(jìn)制小數(shù)的方法。實(shí)數(shù)可以表示為 3.14159265… , 可以量化或?qū)⑵浔硎鰹閹?4 個(gè)十進(jìn)制位的小數(shù) 3.1416。如果在這里使用舍人, 則誤差為:
3.14159265…- 3.1416 =- 0.00000735
如果使用截?cái)喾ǎ?即第 4 位小數(shù)以后的位數(shù)被扔掉) , 則誤差將變得更大, 如下:
3.14159265…- 3.1415 = 0.00009265
很明顯, 舍人是比較合適的能夠得到預(yù)期精度的方法。然而該方法也會(huì)有一些硬件開(kāi)銷(xiāo)。盡管開(kāi)銷(xiāo)相對(duì)較小, 但它的確不是免費(fèi)的。
當(dāng)乘以小數(shù)時(shí)需要處理到給定數(shù)目的位數(shù)。例如, 如果需要計(jì)算兩個(gè)十進(jìn)制小數(shù)位, 則計(jì)算過(guò)程如下:
0.57 X 0.43 = 0.2451
可被舍人到 0.25,或者截?cái)嗟?0.24。結(jié)果是不同的。
一旦開(kāi)始在數(shù)字信號(hào)處理系統(tǒng)中執(zhí)行上億次的乘加運(yùn)算, 就不難發(fā)現(xiàn)這些微小的誤差會(huì)因?yàn)槔鄯e而造成嚴(yán)重的影響。
2.3歸一化處理
使川二進(jìn)制小數(shù)使得算術(shù)運(yùn)算變得容易, 也易于處理字長(zhǎng)增長(zhǎng)。作為一個(gè)例子, 考這樣一個(gè)“ 機(jī)器”, 它有 4 位十進(jìn)制數(shù)和一個(gè)具有 4 個(gè)數(shù)字位的算術(shù)單元, 范圍為-9999~+9999。兩個(gè) 4 位數(shù)相乘將導(dǎo)致多達(dá) 8 個(gè)有效數(shù)字。
6787 X 4198 = 28491826 --》(標(biāo)定)2849.1826–》(截?cái)啵?849
如果想把這個(gè)數(shù)送到該機(jī)器的下一級(jí)( 算術(shù)運(yùn)算具有 4 位的精度 ) , 那么需要按比例減小 10000 倍, 然后截?cái)?。
將其歸一化到范圍-0.9999 ~+0.9999。
0.6787 X 0.4198 = 0.28491826 —》(截?cái)啵?0.2849
現(xiàn)在截?cái)嗟?4 位的操作變得相當(dāng)容易。當(dāng)然兩種結(jié)果是嚴(yán)格一致的, 而差別僅僅在于如何執(zhí)行截?cái)嗪蜆?biāo)定。
然而對(duì)輸入執(zhí)行歸一化操作, 所有的輸人值都位于-1~ + 1 的區(qū)間內(nèi)??梢宰⒁獾皆搮^(qū)間內(nèi)任意兩個(gè)數(shù)的乘積同樣存在于-1 +1 的區(qū)間之內(nèi)。
同樣的歸一化操作也適用于二進(jìn)制, 而且大多數(shù)數(shù)字信號(hào)處理系統(tǒng)也使用二進(jìn)制點(diǎn)。
下面考慮 二 進(jìn) 制 補(bǔ) 碼 中 的 8 位 數(shù) 值。因 此 該 數(shù) 值 的 取 值 范 圍 是 10 0 0 0 0 0 0~01111111 (-128~+127)。
如果將這些數(shù)歸一化到-1~ 1 之間( 除以 128 ), 那么二進(jìn)制的范圍是 1.0000000~0.1111111( -1~ 0.9921875,其中 127/128= 0.9921875 )。所以把十進(jìn)制乘法中歸一化的概念用于二進(jìn)制。
十進(jìn)制乘法 36 X 97=3492 等價(jià)于二進(jìn)制乘法 0010 0100 X 0110 0001 = 0000 1101 1010010。在二進(jìn)制中,將值歸一化就是計(jì)算 0.0100100 X 0.1100001 =0.00110110100100。等價(jià)于十進(jìn)制中:
0.28125 X 0.7578125=0.213134765625
注意:在 數(shù) 字 信 號(hào) 處 理 系 統(tǒng) 中, 在 設(shè) 計(jì) 者 的 眼 中, 二 進(jìn) 制 點(diǎn) 是 存 在 的, 然 而 卻 沒(méi) 有 實(shí)際 的 連 接 或 連 線。這 只 是 使 得 跟 蹤 字 長(zhǎng) 增 長(zhǎng), 以 及 通 過(guò) 扔 掉 小 數(shù) 位 來(lái) 截 斷 變 得 更 加 容易。當(dāng) 然 如 果 更 愿 意 使 用 整 數(shù) 并 且 跟 蹤 定 標(biāo) 等 , 也 可 以 這 樣 做。得 到 的 答 案 是 相 同 的 ,硬 件 開(kāi) 銷(xiāo) 也 是 相 同 的。
2.4 小數(shù)部分截?cái)?/p>
二進(jìn)制中, 截?cái)嗍呛?jiǎn)單地將位去除的過(guò)程。通常使用這種強(qiáng)制的方法來(lái)將大的二進(jìn)制字長(zhǎng)變小, 通常需要截掉最低有效位 (LSB),該操作的影響是降低了準(zhǔn)確度。
考慮將十進(jìn)制數(shù) 7.8 9 9 2 截 斷 到 3 個(gè) 有 效 位 7.89。當(dāng)然, 可以截?cái)嘧畹陀行?, 其結(jié)果是損失了精度( 分辨率) , 但它仍是最初 5 位數(shù)的代表。如果截?cái)嘧罡哂行?992 ( 或0.0992), 其結(jié)果將不是所希望的, 而且也失去了意義。
在二進(jìn)制中, 最髙有效位截?cái)嗟母拍钍呛苌偈褂玫模?在十進(jìn)制的例子中, 最高有效位截?cái)嗤ǔJ菫?zāi)難性的。然而, 在某些極少情況下, 一系列的操作將導(dǎo)致整個(gè)數(shù)值的范圍減小。所以移除 MSB 也是有好處的。
截?cái)?MSB 通常發(fā)生在要截?cái)嗟奈粸榭盏臅r(shí)候。當(dāng)使用有符號(hào)的值時(shí), 由于丟失了符號(hào)位, 截?cái)?MSB 將會(huì)帶來(lái)問(wèn)題。
舍入是一種更準(zhǔn)確的方法, 但同時(shí)也是更復(fù)雜的技術(shù)。該技術(shù)需要進(jìn)行一個(gè)加法操作, 然后再直接截?cái)?,該過(guò)程等價(jià)于十進(jìn)制的四舍五人, 即通過(guò)在 7 。 8 9 上 加 0 。 0 5 然 后 再 截 斷 到 7.9 來(lái) 舍人到一個(gè)小數(shù)位。因此簡(jiǎn)單的舍人需要一個(gè)加法操作。
2.5 一種不同的方法 Trounding
Trounding 是截?cái)?truncation )和 舍 人( rounding )之 間 的 一 種 折中方 法, 其 特 點(diǎn)如下。
① 和舍人一樣, Trcnmding 保留了 LSB 以上的信息。
② 它和舍人不同, 它不影響新的 LSB 以上的任何位。
其具體實(shí)現(xiàn)方法在 XtremDSP 中進(jìn)行了詳細(xì)的介紹, 具體可以參看這部分相關(guān)內(nèi)容。Trounding 的好處是它不需要全加器, 而且可以通過(guò)或門(mén)得到比截?cái)喔玫男阅堋1M管是一個(gè)很小的優(yōu)點(diǎn), 但這種成本上的節(jié)省以及性能的改善還是有價(jià)值的。
三、 浮點(diǎn)數(shù)定義及表示
3.1 標(biāo) 準(zhǔn) 浮 點(diǎn) 數(shù) 表 述
浮點(diǎn)數(shù)可以在更大的動(dòng)態(tài)范圍內(nèi)提供更高的分辨率, 通常當(dāng)定點(diǎn)數(shù)由于受其精度和動(dòng)態(tài)范圍所限不能勝任時(shí), 浮點(diǎn)數(shù)能提供解決方案。當(dāng)然, 也在速度和復(fù)雜度方面帶來(lái)了損失 , 大多數(shù)的浮點(diǎn)數(shù)都遵循單精度或雙精度的 IEEE 浮點(diǎn)標(biāo)準(zhǔn)。標(biāo)準(zhǔn)浮點(diǎn)數(shù)字長(zhǎng)由一個(gè)符號(hào)位 S,指數(shù) e 和無(wú)符號(hào)( 小數(shù)) 的規(guī)格化尾數(shù)m構(gòu)成, 其格式如下:
浮點(diǎn)數(shù)可以用下式描述:
指數(shù) e=1…2 是為∞準(zhǔn)備的。而 e=0 是 為 0 預(yù) 備 的。表 2.3 給 出 了 IEEE 的單精度和雙精度格式的參數(shù)。
在浮點(diǎn)乘法中, 尾數(shù)部分可以像定點(diǎn)數(shù)一樣相乘, 而把指數(shù)部分相加。浮點(diǎn)數(shù)減法復(fù)雜一些,因?yàn)槭紫葘⑽矓?shù)歸一化, 就是將兩個(gè)數(shù)都調(diào)整到較大的指數(shù), 然后將兩個(gè)尾數(shù)相加。對(duì)于加法和乘法混合運(yùn)算來(lái)說(shuō), 最終的歸一化, 就是將結(jié)果尾數(shù)再統(tǒng)一乘小數(shù)1.m 形式的表達(dá)式, 這是非常必要的。
一些浮點(diǎn)編碼的范例 ( 單精度浮點(diǎn) 32 位, 注意這些運(yùn)算都是基于二進(jìn)制的計(jì)算)。如下:
注意小數(shù)點(diǎn)之前的 1 沒(méi)有被編碼( 那里一直有個(gè) 1, 因而不需要顯式表示)。
3.2 浮點(diǎn)數(shù)的短指數(shù)表示
簡(jiǎn)化浮點(diǎn)硬件的一種方法是創(chuàng)建一種使用短指數(shù)的數(shù)據(jù)格式。這種情況下有一個(gè) 4位的指數(shù)和一個(gè) 11 位的尾數(shù)。因此可以表示-7~ 8 的范圍內(nèi)的指數(shù)。其結(jié)果在動(dòng)態(tài)范圍內(nèi)顯著地增加, 代價(jià)只是精度輕微降低。表 2.4 給出了定點(diǎn)數(shù)和短指數(shù)的比較。
3.3 浮點(diǎn)數(shù)的應(yīng)用
浮點(diǎn)在許多具有專(zhuān)用浮點(diǎn)單元( FPU ) 的 DSP 處理器中被廣泛使用。不在 FPGA中使用浮點(diǎn)的原因如下。
① 運(yùn)算速度慢:FPU 是一個(gè)復(fù)雜的單元, 設(shè)計(jì)中的每個(gè)代數(shù)運(yùn)算將共用該單元。
② 低效的芯片面積:使用 FPGA 實(shí)現(xiàn) FPU 需要很大的硬件空間。
然而, 某些情況下 FPU 也許是必不可少的, 例如在需要一個(gè)巨大的動(dòng)態(tài)范圍的應(yīng)用場(chǎng)合, 使用浮點(diǎn)可能使得設(shè)計(jì)更加簡(jiǎn)單 , 這是因?yàn)樵诙c(diǎn)設(shè)計(jì)中, 需要最好地利用可用的動(dòng)態(tài)范圍, 但是在浮點(diǎn)設(shè)計(jì)中, 動(dòng)態(tài)范圍的限制不是一個(gè)需要考慮的問(wèn)題。
原文標(biāo)題:基于 FPGA 的數(shù)字表示
文章出處:【微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
FPGA
+關(guān)注
關(guān)注
1629文章
21736瀏覽量
603375 -
FPU
+關(guān)注
關(guān)注
0文章
42瀏覽量
21316
原文標(biāo)題:基于 FPGA 的數(shù)字表示
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論