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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
背景, N( U2 P8 m( j5 ^

- {1 o/ |/ o) e8 y" h6 Y  ^6 Z6 H, m. p  z
首先,我们要明确的是不管是什么数字,一切数字在计算机中都是采用二进制表示的,就算你是小数点数。所以,这些概念,我们一定要捋清楚。下面,我们马上就来看看。
. ^1 \( W- v1 ]( k. }' W: D1 u
5 [+ I: T9 H3 i+ F& d
) A6 M+ l7 D& f* c定点数的表示与计算/ {0 n- _* b9 @/ O  U6 W
* C4 j9 @# y- L: `" J
8 W4 k1 F2 r( E( A( e
定点数具有三种表示的形式,原码、反码、以及补码。; L" U. o! J/ B$ Z# d4 l: C

4 ~( N. H3 G% }9 B, e; J1 K5 A- e* l8 ~# ^- [5 P
. C6 n2 n2 j+ G5 w0 A
01
/ I8 i/ v- w/ ]8 l) Z: K  Q; }5 e3 B
原码" _. |' o9 T: S' P

3 Q) M5 J6 ^2 C2 g$ j8 N$ c关于原码,例如二进制 0△110 表示+0.75;1△110表示的是-0.75.这一点很好理解,因为0.75*2^3(定点三位)=6 也就是二进制110.简单的说如何将小数转换为十进制数呢。利用matlab提供的整转二进制函数dec2bin很容易获得转换结果。即需要先将十进制小数乘以一个比例因子2^B-1,并进行四舍五入操作取整。转换函数的表达式子是:
$ U% i8 R: Z2 |. y" y+ N- t
! d& a$ i( ~/ C5 f
2 t) a  r. f3 m& G% B
, f" ]2 ~4 E$ ^
需要说明的是十进制的小数转换为二进制存在误差,其误差大小由二进制数的位数决定的。
# ]& Y/ ~3 X- ~' A5 r
  J, W7 f! v1 H9 Hx表示实际的数(一个浮点数), q表示它的Qn型定点小数(一个整数)。
! t5 {0 T! f  z/ R# f" w3 P$ r. S4 R$ Y9 f& _2 h! j

* F& ^5 K3 ~- H# K) X
7 {5 i2 q3 l# j( V02
$ Y: t% x" M/ f; H
2 k( ^2 R" ~7 H* G3 z6 M  p反码, Z- ~0 t2 ]9 L! u$ Q7 x9 J

! m4 h% C( R+ z& r正数的反码与原码相同,负数的反码为原码除符号位的所有位取反,及得到负数的反码。例如说,十进制的-0.75的二进制原码表示为x=1△110,其反码为1△001
/ Y8 L4 d+ E6 t# r  b. D9 s
& ~, b  Y" m4 X# b
9 y9 g  [2 ~# Q) U' U3 o+ [; F7 n. p# Y9 Z/ w4 r
03
3 B5 Z, C* m# @5 k0 A2 _/ t1 Y" W# q/ R6 B7 Y6 ?
补码
* q/ i; ^5 t% V! n! L+ z; }+ M4 Q/ Z
5 _" W) }. E' O2 _2 u负数的补码就是在反码的最低位加1.补码最重要的特性就是将减法用加法运算实现。同样,将十进制数转换成补码形式的二进制数也可以用dec2bin函数实现。
) q% `/ \3 Y: M3 R8 f( R% Q  i5 J1 ~" f0 u9 H3 N+ y* o
# I% j, d  j, P% Q
  L( n. {* g2 e4 l% k. E' Z! ~
我们用数学表达式总结一下如何将小数定点化
/ \: ?2 n: k; T: b* i) c3 _* Y% }6 T1 ?) f) w  G+ u

$ m# J" ~8 p. [# n2 E
# e( C/ J9 h6 H8 v; S& V4 G( L假设q1,q2,q3表达的值分别为x1,x2,x37 R- v  k2 T7 x* ?
! D4 Q/ w7 T. D  @* d( s6 v% t
q3 = q1 + q2 若 x3 = x1 + x20 M/ \) V0 Y; y5 @$ b  T! I0 v1 @
3 E6 p% [$ ~6 k  \
q3 = q1 - q2 若 x3 = x1 - x2. \0 Y+ p6 v6 r$ b0 \/ c
8 l' f/ F+ N/ Z
q3 = q1 * q2 / 2^n若 x3 = x1 * x2
- M0 {4 B8 U, F  I+ L9 N' H# V, E/ k9 J! t* y. w/ p. j
q3 = q1 * 2^n / q2若 x3 = x1 / x2
$ r  `' V+ O- R6 w2 v, P
: u! T" ~2 s. I. \对于加减法到比较简单,对于乘除法,我们对/ 2 ^ n和* 2^n可以简单的用移位来计算。所以定点小数的运算比浮点小数要快的多。( f) u! t0 n9 P/ P- v1 h2 d
# r+ j* s7 y3 ?; H6 Q8 g$ F, Y
8 m0 @) d9 s6 ?

  }5 ?' }, A* C, s( z经常有人问, FPGA里小数乘法怎么搞?
4 |# L. K  Z2 l9 L9 q7 `, I) t3 E' e$ D' F
如果你乐意, 按照IEEE754标准做"浮点"型运算的ip当然最好(虽然面积上不太好).不过,很多情况下,没有这个必要.
& r$ c; {4 G5 r. Y2 o! ], B; y1 o6 N3 G* {0 M) o* l3 }9 ^' ~
一般我们就用"定点"了.你得自己"定个点", 比如用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. w& F8 ]" O, v1 S8 A
5 C2 f3 H% @: I7 f7 i1 ]* n/ @
所以 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的.6 C7 N8 d) N. O; M6 \

% A' o. |2 a/ w, E2 Y; ~1 Y  M

该用户从未签到

2#
发表于 2021-9-9 11:02 | 只看该作者
定点数具有三种表示的形式,原码、反码、以及补码
& `- A- p: N2 R$ a- C4 A  L

该用户从未签到

3#
发表于 2021-9-9 11:25 | 只看该作者
负数的补码就是在反码的最低位加1.补码最重要的特性就是将减法用加法运算实现。同样,将十进制数转换成补码形式的二进制数也可以用dec2bin函数实现
5 b9 n  n  b; c% q1 d

该用户从未签到

4#
发表于 2021-9-9 13:23 | 只看该作者
一切数字在计算机中都是采用二进制表示的,就算你是小数点数7 q9 D5 @0 Q+ P5 ^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 22:06 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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