FPGA系统性学习笔记连载_Day8【4位乘法器、4位除法器设计】 【原理及verilog实现、仿真】篇
连载《叁芯智能fpga设计与研发-第8天》 【4位乘法器、4位除法器设计】 【原理及verilog实现、仿真】
原创作者:紫枫术河 转载请联系群主授权,否则追究责任
一、乘法器原理
1、我们先看十进制的乘法过程
可以看出来,我们是分别用乘数的个位、十位、百位与被乘数相乘分别得到 ;
最后的结果 等于 A B10 C100 = 401050
2、二进制的乘法过程
可以看出来,二进制乘法和十进制是一致的
最后的结果 等于 A B2 C4 D*8 = 1991
二、verilog代码实现
mult4bit.v
代码语言:javascript复制module mult4bit(
input [3:0] a,
input [3:0] b,
output [7:0] y
);
wire [7:0] temp1;
wire [7:0] temp2;
wire [7:0] temp3;
wire [7:0] temp4;
assign temp1 = {4'b0000,a&{4{b[0]}}};
assign temp2 = {3'b000,a&{4{b[1]}},1'b0};
assign temp3 = {2'b00,a&{4{b[2]}},2'b0};
assign temp4 = {1'b0,a&{4{b[3]}},3'b0};
assign y = temp1 temp2 temp3 temp4;
endmodule
三、编写仿真脚本
mult4bit.v
代码语言:javascript复制`timescale 1ns/1ps
module mult4bit_tb();
reg [3:0] a;
reg [3:0] b;
wire [7:0] y;
mult4bit mult4bit_inst(
.a (a),
.b (b),
.y (y)
);
initial begin
repeat (100)begin
a = {$random};
b = {$random};
#20;
end
end
endmodule
四、仿真结果
仿真结果显示我们的乘法器设计正确
五、除法器原理
1、我们先看十进制的除法过程
从十进制的除法运算,我们可以看见有几个步骤;
1.1、首先除法是从高位至低位依次进行;
1.2、每一位要加上前一位留下来的余数,组成一个新数和除数比较;
1.3、当新数大于/等于除数时,写商求余;
1.4、按照上述方式依次进行,直到被除数最末尾,除法运算结束。
2、二进制的除法过程
从图中可以看出二进制的除法,和十进制一致
六、代码实现
div4bit.v
代码语言:javascript复制module div4bit(
input [3:0] a,
input [3:0] b,
output [3:0] s,
output [3:0] y
);
wire [3:0] part1;
wire [3:0] part2;
wire [3:0] part3;
wire [3:0] part4;
assign s[3] = (a[3] >= b)?1'b1:1'b0;
assign part1 = (a[3] >= b)?(a[3]-b):a[3];
assign s[2] = ({part1[0],a[2]} >= b)?1'b1:1'b0;
assign part2 = ({part1[0],a[2]} >= b)?({part1[0],a[2]}-b):{part1[0],a[2]};
assign s[1] = ({part2[1:0],a[1]} >= b)?1'b1:1'b0;
assign part3 = ({part2[1:0],a[1]} >= b)?({part2[1:0],a[1]}-b):{part2[1:0],a[1]};
assign s[0] = ({part3[2:0],a[0]} >= b)?1'b1:1'b0;
assign part4 = ({part3[2:0],a[0]} >= b)?({part3[2:0],a[0]}-b):{part3[2:0],a[0]};
assign y = part4;
//这段代码执行也是对的,但是编译器会报警告,因为我们把5bit的数据赋值给4bit
// assign s[3] = a[3] >= b;
// assign part1 = (s[3]) ? a[3] - b : a[3];
//
// assign s[2] = {part1,a[2]} >= b;
// assign part2 = (s[2]) ? {part1,a[2]} - b : {part1,a[2]};
//
// assign s[1] = {part2,a[1]} >= b;
// assign part3 = (s[1]) ? {part2,a[1]} - b : {part2,a[1]};
//
// assign s[0] = {part3,a[0]} >= b;
// assign part4 = (s[0]) ? {part3,a[0]} - b : {part3,a[0]};
//
// assign y = part4;
endmodule
七、编写仿真文件
div4bit_tb.v
代码语言:javascript复制`timescale 1ns/1ps
module div4bit_tb();
reg [3:0] a;
reg [3:0] b;
wire [3:0] s;
wire [3:0] y;
div4bit div4bit_isnt(
.a (a),
.b (b),
.s (s),
.y (y)
);
initial begin
repeat(100)begin
a ={$random};
b ={$random};
#20;
end
end
endmodule
八、仿真结果
从仿真结果可以看出,我们设计的4bit除法器正确。