概述
FPGA中大位宽数的乘法比较耗费资源,且不利于时序收敛。这里仅仅讨论:变量×常数.
利用分配律,乘法可以被写为加法,如 b=a×6 = a×4 + a×2 .
在二进制中,4和2都是可以通过移位来进行的,在verilog中还可以通过位拼接符号来进行操作。
所以,总能写成:b = a× (c0 ×1 +C1× 2 + c2× 4 + c3 × 8+…)
这样,常数乘法就写成加法了,而加的每一项只需要通过移位就能实现。
实际上,除数为常数的除法也能这么表示,如b=a÷6 =a×(1/6),
而,1/6 =0.16666666666666666666666666666667,其二进制表示为 0.0010101010101010101010101010101010101010101010101010101。
二进制小数乘法,小数点左边就是左移,右边自然就是右移了。
当然我这里精度取得有点高,实际位数根据误差需求取。
1. 直接写乘法
代码中的某个计算中直接写乘法:
reg[35:0] a,b;
b<= a * 6 ;
消耗资源:
lut 252 ,ff 268
时序违例情况:
最差来到 -1.648ns
2.使用移位运算
整个代码文件只改变该乘法的写法,其他均保持不变。
reg[35:0] a,b;
b<= a<<2 + a<<1 ;
消耗资源:
lut 217, ff 268
时序违例:
最差时序来到了 -0. 630ns
3. 位拼接
代码:
reg[35:0] a,b;
b<= { a[33:0],2'b00} + {a[33:0],2'b00 } ;
资源消耗:
lut 217 ,ff 268
时序违例:
最差到 -0.630ns
4总结
上述三段代码只修改了同一个地方的乘法的写法,最终的综合布线结果是有差异的,说明这3种写法效果是不同的。
资源消耗情况: 三中写法的FF是相同的,因为这仅取决于定义变量的位宽;但是组合逻辑资源LUT不同,直接乘法消耗的多一些(252),而移位和位拼接消耗更少(217).
时序违例情况 移位和位拼接的最差来到-0.630ns,相比直接写乘法的-1.648ns,好了很多。
显然 ,上述这种把乘法改为基于移位或者位拼接的加法运算无论对资源控制还是时序控制是有一定优化效果的,但是更多的情况有待继续验证,如当修改后的加法数量很多时,如a x 15=a x (8+4+2+1),由于加法器数量太多,实际效果有待验证。
补充一点
单独生成一个乘法器来验证时,上述3个的资源消耗情况是相同的,但是在嵌入具体的代码中时,表现是有差异的,所以验证不能光只写一个乘法运算来进行。
最后
以上就是干净柚子为你收集整理的关于FPGA被乘数为定点数的乘法的3种写法:乘法、移位和位拼接FPGA中大位宽数的乘法比较耗费资源,且不利于时序收敛。这里仅仅讨论:变量×常数.的全部内容,希望文章能够帮你解决关于FPGA被乘数为定点数的乘法的3种写法:乘法、移位和位拼接FPGA中大位宽数的乘法比较耗费资源,且不利于时序收敛。这里仅仅讨论:变量×常数.所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复