目录
与乘法可以由一系列的移位和累加操作实现相比,除法则可以转化为减法和除数的右移。在使用FPGA进行数字信号处理的过程中,人们对于除法器的使用会格外慎重,因为它消耗资源量大,且有较大的时延。本文将从实例出发,尝试着用verilog实现除法器。首先绘制除法器的系统框图,从一个除法运算的实例中提炼出除法器的结构,然后进行代码的编写与仿真。
1.除法器系统框图:
module Divider
#(parameter DIVIDENT_WIDTH = 16,
DIVISOR_WIDTH = 16)
(
input sys_clk,
input rst,
input [DIVIDENT_WIDTH - 1 : 0] dividend ,
input [DIVISOR_WIDTH - 1 : 0] divisor ,
input divide_in_vld,
output reg [DIVIDENT_WIDTH - 1 : 0] quotient ,
output reg [DIVISOR_WIDTH - 1 : 0] remainder ,
output reg divide_out_vld
);
信号说明
信号名称 | 方向 | 描述 |
dividend | 输入 | 被除数 |
divisor | 输入 | 除数 |
divide_in_vld | 输入 | 输入有效标志 |
quotient | 输出 | 商 |
remainder | 输出 | 余数 |
divide_out_vld | 输出 | 输出有效标志 |
2.除法运算实例
以8bit数121(1011001)除以9(1001)为例, 下图为121除以9的运算过程
1.1111 > 1001 , 给商的对应位置1,1111 - 1001 = 110 ,将被除数的对应位0填充到110的最低位得到1100,作为下一个与被除数比较的数。
2.1100 > 1001 , 给商的对应位置1,1100 - 1001 = 11,将被除数的对应位0填充到11的最低位得到110
3.110 <1001 , 因此给商的对应位置0 ,将被除数的对应位1填充到110的最低位得到1101
4.1101 >1001, 因此将商的对应位置零,1101-1001 = 100,此时除法运算结束,商为1101,余数为100
将根据被除数的有效位宽对除数进行截取得到的被除数,命名为比较数,通过对上述除法运算的实现过程的观察,我们可以发现除法运算主要由以下几个步骤组成
1.将比较数与被除数进行比较,如第一步运算的1111与1001比较
2.比较数大于等于被除数,则给商的对应位置一,同时将比较数同被除数作差,然后将被除数的对 应位填充到作差结果的最低位作为新的比较数。 比较数小于被除数,则给商的对应位置零,将被除数对应位填充到比较数的最低位作为新的比较数
重复这两步直到除数最低位到达被除数最低位。
3.算法实现思路
总结以上的步骤,除法运算可以概括为对齐,比较,作差,新的比较数生成。从被除数的角度来看,除法运算为对齐后除数的右移。从除数的角度来看,除法运算为对齐后被除数的左移,同样以上面8bit数121除以9为例