7、16位除法器
原理: 11010 / 101 = 101…1
为什么被除数要补位?因为被除数要移位超过自身原有位数。
为什么除数要补位? 因为除数要与被除数按位对齐,相减。
比较被除数与除数大小,然后相减做判断。
以5位除法器为例:
Reg_a = 00000_11010 //被除数
Reg_b = 00101_00000 //除数
Temp = 00000
I = 0
Reg_a = 00001_10100
Temp = 00000
Reg _b = 00101_00000
Reg_a < reg_b
Temp = 00000
I = 1
Reg_a = 00011_01000
Temp = 00000
Reg_b = 00101_00000
Reg_a <reg_b
Temp = 00000
I = 2
Reg_a = 00110_10000
Temp = 00000
Reg_b = 00101_00000
Reg_a > reg_b
Reg_a = 00001_10000
Temp = 00001
I = 3
Reg_a = 00011_00000
Temp = 00010
Reg_b = 00101_00000
Reg_a < reg_b
Temp = 00010
I = 4
Reg_a = 00110_00000
Temp = 00100
Reg_b = 00101_00000
Reg_a > reg_b
Reg_a = 00001_00000
Temp = 00101
16位触除法器仅仅改变被除数和除数补零个数
module division
(
input [15:0] a, //被除数
input [7:0 ] b, //除数
output [15:0] res, //商
output [15:0] yu //余数
);
reg [31:0] reg_a;
reg [31:0] reg_b;
reg [15:0] temp;
integer i ;
always@(*)begin
reg_a = {16'b0,a};
reg_b = {b,16'b0};
temp = 0;
for(i=0;i<16;i=i+1)begin
reg_a = reg_a << 1;
temp = temp << 1;
if(reg_a >= reg_b)begin
reg_a = reg_a - reg_b;
temp[0] = 1;
end
else begin
reg_a = reg_a;
temp[0] = 0;
end
end
end
assign res = temp;
assign yu = reg_a[31:16];
endmodule