赞
踩
和十进制除法一样,其实除法是一个移位并比较大小的过程
下图为二进制的除法运算(27/5)
除法运算过程如下:
1.取被除数的高几位数据,位宽和除数相同(上述为3bit数据)。
2.将被除数高位数据与除数作比较,如果前者不小于后者,则可得到对应位的商为1,两者做差得到第一步的余数;否则得到对应的商为0,将前者直接作为余数。
3.将上一步中的余数与被除数剩余最高位1bit数据拼接成新的数据,然后再和除数做比较,可以得到新的商和余数。
4.重复过程3,直到被除数最低位数据也参与计算。
这里以被除数为16bit,除数为8bit为例。
module division(
input [15:0] A,
input [7:0] B,
output [15:0] result,
output [15:0] odd
);
reg [15:0] a_reg;
reg [7:0] b_reg;
reg [31:0] temp_a;
reg [31:0] temp_b;
integer i;
always@(*)begin
a_reg = A;
b_reg = B;
end
always@(*)begin
temp_a = {16'h0,a_reg};
temp_b = {b_reg,16'h0};
for(i=0;i<16;i=i+1)begin
temp_a = temp_a <<1;
if(temp_a >= temp_b)begin
temp_a = temp_a-temp_b+1;
end
else begin
temp_a = temp_a;
end
end
end
assign odd = temp_a[31:16];
assign result = temp_a[15:0];
endmodule
注意:
1.商和余数的位宽要和被除数位宽相同
2.被除数在数据前面补零,除数为数据末端补零,补零的长度由被除数位宽决定。
3.循环次数也是由被除数位宽决定。
4.当移位的被除数大于除数时,被除数减去除数是在前16bit得到余数,再加1是在后16bit得到商,
小于时,保持不变接着移位相当于商补0.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。