本文转载自:FPGA入门到精通微信公众号
在FPGA数学运算中,除法运算因其特殊性,成为FPGA设计的重点和难点。
本文将详细介绍FPGA中除法运算的多种实现方法。
一、除数是常数
除法运算中当除数是常数时,可以将除数求倒数并左移Nbit(即乘以2的N次方),转换为整数,再乘以被除数,最后将计算结果右移Nbit,其中N越大,计算结果的误差越小。
这个方法也就是除法转换乘法,优点是省资源,1~2个周期可计算完成.
举例:计算X/122
选择左移12bit,即 2^12/122 = 34 。
则X/122 ≈ (X*34)>>12
Verilog代码示例:
reg [15:0] X;
reg [9:0] Y;
//34 = 32 + 2
always@(posedge clk) begin
Y <= ({X,5'b0} + {X, 1'b0}) >> 12;
end
二、流水线实现除法器
数字电路中运行的都是二进制数据只有0和1,那么计算除法,不应该从十进制数据角度来看,转换成二进制数据角度就好理解了,也就是二进制除法运算,如下图所示:
分析除法的运算过程如下:
(1) 取被除数的高N位数据,这个N和除数位宽一样。
(2) 比较被除数高N位数据与除数,如果前者大于或等于后者,则将商的对应位为 1,将两者求差得到余数;否则将到商对应位为 0,将前者直接作为余数。
(3) 将上一步的余数与被除数剩余最高位 1bit 数据拼接成新的数据,重复进行第二步,直到被除数最低位数据也参与计算。
从以上的除法过程中可以看到:除法运算实质上就是循环计算求余数和商的过程。
有了上面的计算过程分析,除法器实现起来还是不难的,大家可以自己试着写一下。
FPGA实现代码:暂不公开,需要的可以加入我的知识星球,正在FPGA数学运算专栏,详细文章、设计逻辑、完整工程代码都有。