Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 9117|回復: 3
打印 上一主題 下一主題

FPGA數值運算問題解答收集

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2008-1-19 20:56:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在使用FPGA後教了別人數次定點數小數表示法,發現一些狀況。但自己並不是走這一行的,所以一些比較深入的問題也無法回答。所以希望經由各位高手將其應用經驗以或是提供相關資料參考。5 u0 Q0 I, S* E' ?: ]" u
能得到一些常用於FPGA的數值運算,如小數表示、乘除法、開根及平方、三角函數、亂數以及其他常用數值方法。
3 y" d1 y9 A- |6 x' m( s: p此篇文章屬拋磚引玉性質,可能對一些人來說這些知識是"幼稚班"等級,但對於像我這種由韌體兼職FPGA工程師是有很大的幫助。. h+ \: {. h6 m3 u# m6 Y2 y8 ~3 L  q- Z
格式大概為下列所列,各作者可以自行調整。) q4 b7 m) R* h- o* E
主題:可以讓人了解的題目
: Z1 M7 S0 U! e- s) ?/ c: v4 Y使用資源:計算時間、使用Gate count數目等. P5 \3 A+ Y/ w" x. j/ P
適用及限定範圍:說明常用及不合適的地方
6 l  |0 w# z$ V參考資料來源:出處或參考書本
0 ?1 W0 ]3 [1 I$ S5 y& E) }原理說明及例子:就是文章開始的地方

評分

參與人數 1Chipcoin +5 收起 理由
chip123 + 5 感謝 拋磚引玉!誰來 仙人指路?

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂1 踩 分享分享
2#
 樓主| 發表於 2008-1-19 20:57:07 | 只看該作者
主題:定點數小數表示法
, t, A! A/ O/ ?  H0 M. C使用範圍:使用整數運算系統下之小數運算
, e( S2 ^2 v" C5 _; v  r" }1 V+ b參考資料:嵌入式系統構件 Jean J. Labrosse原著 黃文增譯 全華科技圖書出版
  G) m3 P1 [* b& e: g原理說明:. [; H) W$ s8 ~! h
先復習一下計算機概論,有許多人都還給老師了。"^"表示次方運算
- U/ q9 }" q  s% U% v: `1 S101.101b=2^3+2^0+2^-1+2^-3=5.6252 ]- m0 v8 L4 `% N
現在是如何運用到FPGA上了。其實這個問題在之前的定點數DSP就遇過了,只是後來應用變少了。現在的FPGA又要用,捲土重來。0 }9 f2 f' O5 ?7 P+ M( Z6 V7 V* @4 R
我們知道FPGA對於整數系統的加減法是可以,但是遇到小數有些人就不知該如何。其實不難,只要在整數運算系統上加上小數點就行了。0 M$ X# O9 f! O8 u
例如101.1b+101.1b=1011.0b,可以發現去掉小數點就和整數運算沒有兩樣。意指,只要將小數點那個位數對齊就可以了,使用移位對FPGA是很容易的。
7 f$ `+ _3 ?7 s1 [4 M& b但是整數運算使用為小數要標示小數位置,所以引入類似科學記號表示法。我們知道科學表示法為<尾數>E<指數>,例:3E3=3*10^3=3000,E表示10的次方。
9 O2 G, O+ h! D1 b2 q定點數的表示法符號為S,表示法為<尾數>S<指數>,S表示為2的次方。舉例2.5S3=2.5*2^3=2.5*8=20。
9 A& b9 W/ O. s$ {- G3 A在基本數學運算下的處理為:
( B# ^! o6 H( A  [) \1.加減法: @  r6 K/ D1 a1 R- _% \- T% x
處理方式是將小數位數對齊再做運算。例:2S3+3S2=20S2+3S2=23S2+ K: Y: @  _% h0 f
2.乘除法/ ^" M8 y7 K) H9 G! a; E
乘法時要將指數相加,尾數相乘。例:2S3*3S2=6S5) V2 ~& j/ K1 t! V& r
除法時要將指數相減,尾數相除。例:2S3/3S2=0.66S1
( F) n; B) H" u% p' k( `7 B3 v3.開根
! Z  J+ e% v5 ]) d% A主要是推導數學運算對指數的影響。
: k: c8 o3 v3 S- O, X- c' l* ], I* Zsqrt(aSb)=sqrt(a)*sqrt(2^b)=sqrt(a)*2^(b/2); `% u' d" u+ y0 S, |8 D8 c; b
可以發現在開根時指數是除2,尾數直接開根。
" `1 _3 y0 @0 p+ X; T/ M' O' r$ L4.小數精度的選用
: y6 l+ D3 h! x  l& w為了符合精度,要如何選用指數範圍。我們使用定點數其精度取決於二進位小數取多少位。3 p# G  R" N# J$ H
例如若是使用S-4為其指數,每二數之間最小距離為2^-4=0.0625。此為S-4下的精度。6 c' Z  ?2 V- m* C
對應十進位精度可以使用log(精度)/log(2)去計算要使用的指數。& F4 j7 X3 `; v$ ~( o- ~5 Y  ~
使用精度0.1則S取用為log(0.1)/log(2)=-3.32,則使用S-4為其數值格式,就夠用了。
( c4 \5 a2 e1 P7 C- N# i5.數值範圍  S5 z: `" u& y% Q5 e! u
因為定點數是有限的位元組成,也是有限的數字集合及有限的可使用範圍,一但超過範圍的數也無法表示。也就是在運算上有可能會產生縊位問題,而造成非預期結果。7 x/ D/ b* p5 f" C4 T
所以只可以使用在變動不大的運算上。所以要考量使用的數值範圍及使用精度,這方面是定點數在使用前要考量好的。1 y% A% T7 t5 W0 W5 ~0 A
定點數應用例:
7 B2 a6 b& r0 U. k已知機器運算只能使用整數的狀況下,要使用小數,則是使用負的S指數,將尾數變成整數。尾數送入機器去運算;指數則是人工管理。# I! F* Y5 e6 L5 W  Q9 I4 ?4 ?' U
例:r=10.1求圓面積area,假設輸出入需求精度為0.1% \4 a* F9 y/ S6 G9 ^4 B1 ]9 Y
解答:精度為0.1則,log(0.1)/log(2)=-3.32,故選用的S指數要到S-4可以達成。
8 ]2 }4 x& I9 d; S' K; epi=3.1416=50S-4(四捨五入)9 E4 X) Z3 q% d; R% x+ \
r=10.1=162S-4(四捨五入)
# X( e9 a- ]% O' ]. qarea=pi*r*r=50S-4*162S-4*162S-4=1312200S-12=5126S-4(四捨五入)7 t: L5 ~; e, G* r2 U' ~
換算為320.375
9 }) P1 H. S& I7 w實際為320.47386659269480825557425152834
' b4 d: B6 C6 ^5 D' @; o0 `只有精準到整數,是因為所有數值精確度只有到0.1,誤差是0.05,運算來源有三個,故最大誤差為0.15,所以符合誤差範圍。
" r- W$ E8 _. x' }7 d. M- }+ f由算式可以得知機器只計算50*162*162,解讀結果需右移8位元含四捨五入,輸出結果為S-4格式。( g9 s- n& \) [2 U7 t
小技巧:
0 ~) b& ]& y( Z2 N' s+ r# @6 s! g5 d定點數之計算可以使用小算盤來算。將小算盤設定為工程型。使用二進位顯示就可以將十進位轉成二進位。
8 J! }1 |+ }. @' [+ x5 X因二進位只能使用整數,所以要先轉成整數才可以顯示。4 P8 J' a6 {8 E  @
例如:pi的取用。
; d" r6 I) _  E- W6 T% Bpi取S-4結果為何?先取出pi=3.14159265358979323846264338327957 e. g/ ^3 U9 X6 n
若我們使用精度為Qword則有64位元可以用,可以先乘上2^32,取用4相關的指數,可以在顯示時容易找到小數點位置。! W! T* q6 n. F; u3 q6 x7 d
結果為13493037704.522018958598982648896
8 j6 ?2 L; W* R& ?+ h直接按二進位,結果為11 0010 0100 0011 1111 0110 1010 1000 1000
$ l3 v4 }% {- x# Q" K找到小數點位置後可以發現是110010bS-4( G: c4 v* @# t1 n9 \6 q; s. o
輸入110010按十進位可得50,我們可知pi=50S-4; q& L# |$ A* ?1 P+ U  a
另外pi常有人用201/64來表示,其實是使用S-6的格式,可以看上面的值找出pi=11001001bS-6=201S-68 k( E8 i  h9 n8 M" g
另外四捨五入在二進位很容易做,只要看取需要取用的小數精度下一位是否為1,若是則結果加一,不是則捨棄。# `8 D# d6 z  K6 h' }7 R, c
但會引發另一問題,剛好尾數LSB為多個1連續,則會進位。- _7 b& p/ w* z9 _8 }' ~
以pi為例取S-10至S-15四捨五入後表示的數皆相同,都會和S-10完全一樣,精度沒有增加,pi皆為3217S-10,就算是寫成不同的S值,如12868S-12,仍等於3217S-10。
3#
 樓主| 發表於 2008-1-19 20:57:28 | 只看該作者
主題:使用加法做開根及平方計算. l* V7 G0 f3 j$ u1 N' R
使用範圍:整數計算開根及平方,計算慢,gate count少  s5 c  R1 s# L* h7 s
參考資料:MATH toolkit for Real-Time Programming by Jack W. Crenshaw CMP Books
! J# B$ h) S& l原理說明:
6 K3 ]1 C  ?1 f$ l! ^9 k4 u* S0 {. G( [這是我們常用的公式(n+1)^2=n^2+2*n+16 a. p; \9 |$ |$ d# q* J; N9 T
改寫為(n+1)^2=n^2+n+(n+1),其中n^2在上次計算可得到,所以只剩n及(n+1)且只使用加法就可以進行。* Q- P, F8 @4 `8 H3 s
設計演算法為
" u$ H2 R# P1 ]+ Y$ q. k8 ua=Count
' }6 z, R; F% W8 M' hb=Last Sum= Sum
  S  n- Z' n+ r1 \, B' J: P( o( ^2 `c=Sum=Last Sum+Count6 L# p  @4 A! ~+ O" ?( u
d=Squart=Sum+Last Sum
/ I+ h/ g1 E3 F9 [排表為, ?# O# v5 p; y- I
a b c d" ~- e+ ~/ r3 V
0  0   0  0' {/ t6 H) x7 G) [" N  t
1  0   1  1
) w: w- p5 z6 u) O# L 2  1   3  4
0 I4 \. S9 B7 z7 r5 w5 C4 c 3  3   6  9
3 M; u* b2 _* L: Y% h$ ^ 4  6  10 16& u! u, R$ [- e& T7 q
5 10  15 25
9 G8 S; `- i% w: Z! r若要取得平方,就將輸入做為計算的次數。計算停下來時,取出d就是答案。
; C$ J* U6 x% l7 L# n$ I要做開方,就將輸入和輸出比較,超過時停下來,取出a就是答案。
$ W* a3 C# u* }: \3 }若要使用到小數,則使用定點數方式可以得到。
4#
發表於 2008-3-20 10:04:05 | 只看該作者
It is good topic for me. thanks your sharing.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-11-1 12:39 PM , Processed in 0.167009 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表