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

背景

首先,我们要明确的是不管是什么数字,一切数字在计算机中都是采用二进制表示的,就算你是小数点数。所以,这些概念,我们一定要屡清楚。下面,我们马上就来看看。转载需要与博主联系。
作者:ciscomonkey

定点数的表示与计算

定点数具有三种表示的形式,原码、反码、以及补码。

  • 原码

关于原码,例如二进制 0△110 表示+0.75;1△110表示的是-0.75.这一点很好理解,因为0.75*2^3(定点三位)=6 也就是二进制110.
简单的说如何将小数转换为十进制数呢。利用matlab提供的整转二进制函数dec2bin很容易获得转换结果。即需要先将十进制小数乘以一个比例因子2^B-1,并进行四舍五入操作取整。转换函数的表达式子是:

dec2bin(round(abs(D)*2^(B-1)+(2^(B-1))*(d<0)),B)

需要说明的是十进制的小数转换为二进制存在误差,其误差大小由二进制数的位数决定的。

x表示实际的数(一个浮点数), q表示它的Qn型定点小数(一个整数)。

  • 反码
    正数的反码与原码相同,负数的反码为原码除符号位的所有位取反,及得到负数的反码。例如说,十进制的-0.75的二进制原码表示为x=1△110,其反码为1△001
  • 补码
    负数的补码就是在反码的最低位加1.补码最重要的特性就是将减法用加法运算实现。同样,将十进制数转换成补码形式的二进制数也可以用dec2bin函数实现。

`

 dec2bin(round(D*2^(B-1))+ 2 ^ B*(D<0),B)

我们用数学表达式总结一下如何将小数定点化

q = (int) (x * 2^n)

x = (float)q/2^n 
其中n代表实际的数中,小数点后保留的位数

假设q1,q2,q3表达的值分别为x1,x2,x3
q3 = q1 + q2 若 x3 = x1 + x2

q3 = q1 - q2 若 x3 = x1 - x2

q3 = q1 * q2 / 2^n若 x3 = x1 * x2

q3 = q1 * 2^n / q2若 x3 = x1 / x2

对于加减法到比较简单,对于乘除法,我们对/ 2 ^ n和* 2^n可以简单的用移位来计算。所以定点小数的运算比浮点小数要快的多。

用Q12来计算2.1 * 2.2,先把2.1 2.2转换为Q12定点小数:
2.1 * 2^12 = 8601.6 = 8602
2.2 * 2^12 = 9011.2 = 9011
(8602 * 9011) >> 12 = 18923
18923的实际值是18923/2^12 = 4.619873046875 和实际的结果 4.62相差0.000126953125,对于一般的计算已经足够精确了。

经常有人问, fpga里小数乘法怎么搞?

如果你乐意, 按照IEEE754标准做"浮点"型运算的ip当然最好(虽然面积上不太好).
不过,很多情况下,没有这个必要.

一般我们就用"定点"了.
你得自己"定个点", 比如用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.164
256 = 298 = 16’h012A

所以 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的.

总结:
module fixpmul
#(
    parameter IW = 8,
    parameter FW = 8 
)(
    input signed [IW+FW-1 : 0] a,
    input signed [IW+FW-1 : 0] b,
    output signed [IW+FW-1 : 0] o
);
    (* multstyle = "dsp" *) wire signed [IW*2+FW*2-1 : 0] long;
    assign long = a * b;
    assign o = long >>> FW;
endmodule
  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值