算术型数字电路之定点数(fixed point)

无符号定点数

N-bit 二进制数共可以组成2^N个元素。用U(a,b)表示一个N(N=a+b)bit的数,a表示整数位宽,b表示小数位宽。对于任意一个数x,可用下面公式计算得到:

x=(\frac{1}{2^b})\Sigma_{n=0}^{N-1}2^n x_n

能表示的最小数是0,最大数是:

(2^N -1) / 2^b = 2^a - 2^{-b}

例如

1. 8-bit无符号定点数U(6.2),每个bit的权重分别是

b_5 b_4 b_3 b_2 b_1 b_0 b_{-1} b_{-2}

b_k表示权重为2^k。范围是0到2^6-2^{-2} = 64-1/4 = 63 \ 3/4

1000_1010b 表示的数是(1/2^2)(2^1+2^3+2^7) = 2^{-1} + 2^1 + 2^5 = 34.5

2. U(-2,18),共有(-2+18)=16bits,取值范围是0至 2^{-2} - 1/2^{18}

0000_0100_1011_1100b表示的数是

(1/2^{18})(2^2+2^3+2^4+2^5+2^7+2^{10}) = 1212/2^{18}=0.004623413085938

3. U(16,0),共有(16+0)bits,取值范围是0至2^{16}-1

0000_0100_1011_1100表示的数是

(1/2^0)(2^2+2^3+2^4+2^5+2^7+2^{10})=1212/2^0 = 1212

反码与补码

反码(one's complement) \bar{x} = 2^N-1-x

补码(two's complement) \widehat{x} = \bar{x} + 1 = 2^N-x

例如:

U(8,0) 03h(0000_0011b)的反码是1111_1100b

U(8,0) 03h(0000_0011b)的补码是1111_1101b

应用场景:求绝对值

wire signed [7:0] a;
wire unsigned [7:0] abs_a;

assign abs_a = a[7] ? (~a[7:0] + 8'h1) : a;

用补码表示的有符号定点数

用A(a,b) 表示N (N=a+b+1) bits,任意一个数x的值等于:

x = (1/2^b) [-2^{N-1}x_{N-1} + \Sigma_{n=0}^{N-2}2^n x_n]

取值范围是:

-2^a <= x <= 2^a - 1/2^b

例如:A(13,2),共有13+2+1=16bits,取值范围是

-2^{-13}=-8192<=x<=2^{13}-1/4=8191.75

小结

U(a,b) 位宽是 a+b,取值范围是0<=x<=2^a-2^{-b}

A(a,b) 位宽是a+b+1,取值范围是-2^a<=x<=2^a-2^{-b}

加法操作

X(c,d) + Y(e,f) 相加的前提是 c=e, d=f

因此,x(c,d) + x(c,d) = x(c+1,d),该规则对有符号数或者无符号数都适用

乘法操作

U(a1,b1) X U(a2, b2) = U(a1+a2, b1+b2) 

A(a1,b1) X A(a2, b2) = A(a1+a2+1, b1+b2) 

除法操作

U(a1,b1)/U(a2,b2) = U(a1+b2,[log2(2^(a2+b1)-2^(b1-b2))])

参考文章

Fixed-Point Arithmetic: An Introduction

猜你喜欢

转载自blog.csdn.net/zhong_ethan/article/details/121057252