关于FPGA被乘数为定点数的乘法的3种写法:乘法、移位和位拼接

博客探讨了在FPGA设计中,如何通过分配律将常数乘法转换为移位和位拼接的加法运算,以减少资源消耗和改善时序违例。对比了直接乘法、移位运算和位拼接三种方法在资源和时序上的差异,显示移位和位拼接在某些方面优于直接乘法。尽管有优化,但当加法数量增多时,实际效果仍有待进一步验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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定点数乘法的实现方法与优化 #### 定点数表示的重要性 在FPGA设计中,定点数是一种非常重要的数值表示方式。通过使用定点数可以显著降低硬件复杂度减少计算量,从而更好地满足实时应用数字信号处理领域的需求[^1]。 #### 定点数乘法的三种常见写法及其优缺点分析 对于FPGA中的定点数乘法操作,通常有以下三种不同的实现方法: 1. **直接乘法** 使用标准的乘法指令来完成运算。这种方法的优点在于其实现简单直观,但在资源消耗方面表现较差。例如,在某些情况下,直接乘法会占用更多的查找表(LUTs),达到252个单位[^2]。 2. **移位操作替代乘法** 利用二进制特性,将部分乘法转换为简单的移位操作。这种方式能够有效减少组合逻辑资源的消耗,其LUT需求仅为217个单位,并且具有更好的时序性能(最差路径延迟为-0.630 ns)。 3. **位拼接加法** 将复杂的乘法分解成多个较小规模的加法以及相应的位拼接操作。此方案同样能大幅削减所需的LUT数目至217个单位并改善时序违例状况到-0.630 ns级别。然而需要注意的是,当涉及较多级联加法器时(如`a × 15 = a × (8 + 4 + 2 + 1)`),实际效果可能因增加过多加法器而导致新的瓶颈问题出现。 #### 正负数之间的定点小数乘法规则 针对正数与负数之间或者两个负数间的定点小数乘法,遵循如下步骤执行: 1. 若存在负数参与运算,则先将其转为对应的正值形式(采用补码机制:按位取反后再加一)。 2. 接下来按照常规两正整数相乘的方式开展具体计算过程(忽略符号位的影响)。 3. 计算所得结果的符号由原始输入数据的符号位异或决定。 4. 如果最终得出的结果符号位为“1”,那么需补充高位填充“1”直至满足目标精度下的总宽度要求;反之亦然。 5. 整合以上各环节成果形成完整的输出值,其中最高一位代表整体符号状态,其余低位构成具体的数值信息[^3]。 #### 示例代码展示 以下是基于Verilog HDL的一个简化版定点数乘法模块实例: ```verilog module fixed_point_multiplier ( input signed [9:0] multiplicand, // 被乘数 input signed [9:0] multiplier, // 乘数 output reg signed [10:0] product // 结果 ); always @(*) begin product = multiplicand * multiplier; end endmodule ``` 该模块接受两位十比特带符号输入参数,并返回它们积作为十一比特长度的数据流。 #### 浮点数对比及应用场景考量 相较于浮点数而言,尽管后者提供了更高的动态范围灵活性,但由于内部结构更加繁琐,往往伴随着更大的面积开销与时钟频率限制等问题。相比之下,合理配置后的定点算法能够在许多特定场合下提供更为优越的整体性价比表现[^4]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值