fpga里小数乘法怎么搞?
来源:互联网 发布:电子屏编辑软件 编辑:程序博客网 时间:2024/05/01 09:13
原文链接:http://blog.sina.com.cn/s/blog_be7040250101kcgn.html
fpga里小数乘法怎么搞?
(2013-03-27 13:52:13)转载▼
经常有人问, fpga里小数乘法怎么搞?
如果你乐意, 按照IEEE754标准做"浮点"型运算的ip当然最好(虽然面积上不太好).
不过,很多情况下,没有这个必要.
一般我们就用"定点"了.
你得自己"定个点", 比如用16位, 分成8位整数8位小数(后面记为"(8.8)"), 即"定点"在第8位.
那么:
1 -> 16'h0100;
1.5 -> 16'h0180;
-1.5 -> -1.5*256 + 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的.
因为 (8.8) 乘 (8.8) 得到 (16.16), 为了恢复成 (8.8), 所以帯符号右移8位即可.
把低8位小数舍掉, 高8位整数也丢了, 所以你得保证你的16位(8.8)的"定点小数"乘积不能超过范围, 多数数字信号处理系数都是区间[-1.0, 1.0]的,多半不存在问题, 积分什么的, 还有其它可能有问题的自己想清楚就行, 当然你要保留16位整.16位小也可以~~~
总结:
module fixpmul
#(
)(
);
endmodule
PS: 作为一个完美主义者的想法: 以8位整型为例, 其实 8位有符号 乘 8位有符号得到的 16位有符号, 中的第14位(权2^14的位, 符号位右边的位), 很讨厌, 它只有在 -128 * -128时才等于1, 其它65535种情况, 全是0, 很浪费.
所以我们一般在数字信号处理系统中, 永远把[-1,1]映射到[-127,127], 这样那个讨厌的第14位永远用不到, 然后就可以: wire signed [15:0] mul = a * b; wire signed [14:0] out = {wire[15], wire[13:0]}, 8位有符号 乘 8位有符号 得到 15位有符号, 节约一位.
0 0
- fpga里小数乘法怎么搞?
- FPGA里怎么做小数乘法
- 在循环里跳出怎么搞
- 在Hibernate里遇到Mysql的datetime类型怎么搞
- fpga 定点小数计算
- 小数高精度乘法
- 高精度乘法(小数)
- S里做小数的乘法运算出现浮点错误的解决方法
- FPGA基础-定点小数运算
- js 运算 除法运算会保留小数,和js里怎么求余数
- 怎么搞的?
- 大数据,怎么搞?
- 大数据,怎么搞?
- 大数据,怎么搞?
- Android摄像头 怎么搞?
- 怎么搞积分
- Verilog基础知识2(FPGA小数运算处理--定点小数)
- FPGA浮点小数与定点小数的换算及应用
- HttpClient使用详解
- 100篇文章回想
- [Leetcode.Array]561. Array Partition I Add to List
- Git操作失败并提示Another git process seems to be running in this......
- poj2516(最小费最大流)
- fpga里小数乘法怎么搞?
- git使用笔记-找回误删除文件
- Web服务器之Nginx详解(理论部分)
- Unity 各端调试方法记录
- Android mvp 使用分析
- HTTP学习(一) HTTP基本知识
- 黑马程序员 六、线程技术
- 批处理设置系统环境变量
- 新的开始---React