找回密码
 注册
关于网站域名变更的通知
查看: 511|回复: 3
打印 上一主题 下一主题

FPGA实现数字信号处理的定点运算

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-9 09:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
背景
( w2 N# }; d1 O& b) u+ r. O, R6 ~; x7 P
7 ?/ |6 U# h$ J+ v. m* m5 {1 H
首先,我们要明确的是不管是什么数字,一切数字在计算机中都是采用二进制表示的,就算你是小数点数。所以,这些概念,我们一定要捋清楚。下面,我们马上就来看看。
3 C; b& b* A0 s! `3 O8 }
: @4 t6 @5 D% u3 e3 C
( |, T& f5 T& K3 a. W, H& Y4 |, `$ S3 p定点数的表示与计算& a5 W7 M+ Y/ C6 ^) I
( S3 [( |6 ]% x3 L" h

+ K: x* _7 w* Q- L2 c1 }* P7 ]定点数具有三种表示的形式,原码、反码、以及补码。
: H) T9 D& T4 U1 T* x% E: O
' B/ L% S/ O# i7 g) c- U  r5 Y; x, A# |2 G# k9 T6 G8 o4 i$ S6 r
6 C& b. |( ~5 W0 f, c9 H% K: B
01
# k* I% c3 n0 ^* B
: l$ i. V% N9 |- q# e原码
/ Y, ]/ N& F1 D2 c, Z4 J3 A, T1 ^- W; o8 y  ]7 C6 A- p9 A5 N8 x% t- L( y5 ?
关于原码,例如二进制 0△110 表示+0.75;1△110表示的是-0.75.这一点很好理解,因为0.75*2^3(定点三位)=6 也就是二进制110.简单的说如何将小数转换为十进制数呢。利用matlab提供的整转二进制函数dec2bin很容易获得转换结果。即需要先将十进制小数乘以一个比例因子2^B-1,并进行四舍五入操作取整。转换函数的表达式子是:' w1 d$ a% M! e: J4 [$ t

8 i# Y" r' g0 f: Q

" [/ @# |& v" w7 c0 l7 s0 e+ C$ \0 [( P
需要说明的是十进制的小数转换为二进制存在误差,其误差大小由二进制数的位数决定的。
+ ]- d- E: h3 C  f
2 X" H1 b, W. }1 P) T2 n  F# Ax表示实际的数(一个浮点数), q表示它的Qn型定点小数(一个整数)。
+ r. w3 T/ T9 [
/ p% w# U2 A! V( ~6 N
, C) p2 M0 ~7 d6 Z* e/ B: }7 R4 g+ c1 i
02
* k$ h0 c- G; b4 ^6 S" s: h' x% u
( }7 t7 l# ?+ p0 Q3 \1 X8 |9 h4 k反码
% s+ k: P6 T# w1 p9 N3 N. [: q- N5 e8 [0 j; g/ g
正数的反码与原码相同,负数的反码为原码除符号位的所有位取反,及得到负数的反码。例如说,十进制的-0.75的二进制原码表示为x=1△110,其反码为1△001. T. N9 @  z+ ^9 t4 [3 v% [

- Q1 n: u+ `( K7 _) T/ T" H: K  t4 p. N$ ]- ^  [' r

4 N' i8 U  |! K% ?03
7 K+ e6 U* {0 v- J/ u) f% r& n
$ m9 v5 L: P: g8 x) N' R0 q补码
, N8 k  [1 X5 G' `7 C
; @2 M1 e! u1 \( J负数的补码就是在反码的最低位加1.补码最重要的特性就是将减法用加法运算实现。同样,将十进制数转换成补码形式的二进制数也可以用dec2bin函数实现。
+ C. b) C- I: D9 M6 b$ I6 ^' I4 }! g5 z* x0 |

& y" s9 E: x! U, `# p" x/ [+ T# D) G$ _/ K, o) W: Y. ~
我们用数学表达式总结一下如何将小数定点化) Q( p! G. e, `. A! g* h
6 l) M/ }+ z' |' g

( ]7 J+ T" |+ r7 i4 V* I; @* P' J7 t3 r! i
假设q1,q2,q3表达的值分别为x1,x2,x3
8 D* z/ o: T* e7 \7 h9 Y, b" C; x; w6 L
q3 = q1 + q2 若 x3 = x1 + x2) y9 q  ~: A, ?0 [

  o% g0 j+ `5 Z/ i* E2 C' ~1 j" Vq3 = q1 - q2 若 x3 = x1 - x2
/ j8 F( s$ c9 a1 U. [! Z5 B9 X3 q! [: W# l
q3 = q1 * q2 / 2^n若 x3 = x1 * x2
) W+ L& s: G& X: a
% E9 y/ O* i. ?$ [9 S! V6 U+ P: sq3 = q1 * 2^n / q2若 x3 = x1 / x2
9 o8 e8 ~9 L/ A& Z* x. ^+ o3 H1 h* }2 U; D, r
对于加减法到比较简单,对于乘除法,我们对/ 2 ^ n和* 2^n可以简单的用移位来计算。所以定点小数的运算比浮点小数要快的多。
" R9 g$ h& W( _. G' K" S3 S
6 z/ ^( J- m# E0 ^- a

5 Z& D7 V. B# M' h" D3 [, d
, Q2 l. F9 @+ E2 m( y' F0 _经常有人问, FPGA里小数乘法怎么搞?" |. @: c  ^9 @/ M1 z% \+ {
- d" |& S2 a# ]; p  C, ]+ S8 P% s
如果你乐意, 按照IEEE754标准做"浮点"型运算的ip当然最好(虽然面积上不太好).不过,很多情况下,没有这个必要.) O" N' \0 [8 @% Z, q9 ]

; Q, M: {# p3 c1 F, i3 s0 U6 l4 q一般我们就用"定点"了.你得自己"定个点", 比如用16位, 分成8位整数8位小数(后面记为"(8.8)"), 即"定点"在第8位.那么:1 -> 16’h0100;1.5 -> 16’h0180;-1.5 -> -1.5256 + 65536(补码) -> 16’hFE80(其实就是-16’sh0180, 让综合器给我们算补码去~~);1.164 -> 1.164256 = 298 = 16’h012A; m! N3 Z3 l( N  m5 f+ }
6 E0 G6 t5 i, u- H, l& O
所以 signed input [15:0] a (也是"8整.8小")和 1.164相乘给 signed output [15:0] mul (也是"8整.8小"), 直接写:assign mul = (a * 16’sh012A) >>>8;就行了, 当然, 你的fpga里有DSP block最好, 不然也要几百个LE的.4 o  O1 x+ H( f' ~4 ^

# A# I3 F; u! Q

该用户从未签到

2#
发表于 2021-9-9 11:02 | 只看该作者
定点数具有三种表示的形式,原码、反码、以及补码
& F  H6 n1 @3 @1 a

该用户从未签到

3#
发表于 2021-9-9 11:25 | 只看该作者
负数的补码就是在反码的最低位加1.补码最重要的特性就是将减法用加法运算实现。同样,将十进制数转换成补码形式的二进制数也可以用dec2bin函数实现8 ?; a% ~1 t- p) ^' T; W! m$ I9 b

该用户从未签到

4#
发表于 2021-9-9 13:23 | 只看该作者
一切数字在计算机中都是采用二进制表示的,就算你是小数点数
" t( Y9 j, K9 p* z5 X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-31 03:24 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表