1. 除法器原理(补码除法运算)
被除数和除数都用补码表示,符号位参加运算,商和余数也用补码表示。
Booth除法需要考虑以下问题:
1. 够减的判断:
当两数同号时,实际应做减法;两数异号时,实际应做加法。
2. 上商规则:
3. 商符的确定:
商符是在求商的过程中自然形成的,第一次得出的商就是实际应得的商符
4. 求新部分余数:
5.末位恒置1
2. 设计思想
程序首先进行判0操作,如果被除数数中为0时,则直接输出结果0,否则进入程序主体。程序主体分成三个模块进行,首先判断第一次应该做加法还是减法,然后计算部分余数和商符;然后进入循环,左移部分余数和商,判断商和加数,依次按算法执行;最后末位置1。
3. 程序设计
module Division(Dx,Dy,Dout,Dre);//补码一位除法(Booth除法)
input [5:0]Dx,Dy;//定义六位数输入,其中前两位为符号位
output reg [4:0]Dout;//定义5位数输出,商
output reg [5:0]Dre;//定义六位数输出,余数
reg [5:0] HDre;//HDre寄存器存放部分余数
reg [5:0] IDy;//IDy寄存器存放 【-除数】补码
reg [3:0] n;//n作为临时变量,用来存放循环次数
always @ (Dx,Dy)
begin
if(Dx==0)//被除数为零
begin
Dout=0;
Dre=0;
end
else
begin
Dout=5'b00000;
Dre=6'b000000;
HDre=6'b000000;
IDy=~Dy+1;
n=4'b1111;
if(Dx[5]==Dy[5])//X补 与 Y补 同号
begin
HDre=Dx+IDy;//加 -Y补
Dout[0]=0;
end
else
begin
HDre=Dx+Dy;//加 Y补
Dout[0]=1;
end
while(n)
begin
HDre=HDre<<1;
Dout=Dout<<1;
begin
if(Dout[1]==1)//商1时加 -Y补
HDre=HDre+IDy;
else//商0时加 Y补
HDre=HDre+Dy;
end
begin
if(Dy[5]==HDre[5])//ri补 与 Y补 同号
Dout[0]=1;//商1
else
Dout[0]=0;
end
n=n>>1;//循环次数减1
end
Dout[0]=1;//末位恒置1(虽然在上面的循环中已将末位置数,但那不是准确的)
Dre=HDre;
end
end
endmodule
4. 设计验证
例:已知X=0.1000,Y=-0.1010,求X/Y:
1. 两数用补码表示 X补=00.1000 Y补=11.0110 -Y补=00.1010
2. 设置输入为001000和110110
3. 仿真得结果为111110和10011,即 商:1.0011 余数:11.1110
4. 最终:[X/Y]补=1.0011+(1.1110*2^(-4)/1.0110) [X/Y]=……