目录
题目:除法器的verilog实现,16bit A,8bit B。C = A/B;
1、除法器原理
摘自别的博客,这里除法器的原理其实就是模拟人进行除法的过程,如下图以4bit数为例,抓要从以下几个方面考虑:
(1)为什么要扩展呢?
个人理解,因为后面涉及到左移,会将实际参与运算的位数一位一位移到扩展位上参数运算,然后将每次运算的商通过+1/+0的操作,移到最低的bit位上,这也是后来取结果和余数的时候,为什么是低4位为商,高四位为最终的余数。
(2)a=a-b+1,是什么操作
a-b其实就是模拟,人每次除法的操作,当a>b,就+1.将商移到LSB位,当a<b.其实就是那个位是0,就将0移到LSB位,每次右移操作,每次运算的商也会随之左移就依次得到0110,的结果。
2、无符号的除法器的实现
module division (
input wire [15:0] A,
input wire [7:0] B,
output wire [15:0] result,
output wire [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
3、书写tb
`timescale 1ns/1ps
module tb_division;
reg [15:0] A;
reg [7:0] B;
wire [15:0] result;
wire [15:0] odd;
integer i;
initial begin
A=1;
B=1;
#100;
for(i= 0;i <15;i=i+1) begin
#20;
A = {$random}% 65536;
B = {$random}% 256;
end
end
division division_inst (
.A(A),
.B(B),
.result(result),
.odd(odd)
);
endmodule
4、仿真结果分析
分析一下仿真结果,
第一组: 123604/129=105......59
第二组:54793/99 = 553......46
第三组:........
仿真结果,与实际计算结果一致