本篇文章,介绍4位乘法器、4位除法器的设计原理 与 verilog 代码实现
一、乘法器原理
1、我们先看十进制的乘法过程
可以看出来,我们是分别用乘数的各位、十位、百位与被乘数相乘分别得到 ;
最后的结果 等于 A + B*10 + C*100 = 401050
2、二进制的乘法过程
可以看出来,二进制乘法和十进制是一致的
最后的结果 等于 A + B*2 + C*4 + D*8 = 1991
二、verilog代码实现
mult4bit.v
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
`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}%16; b = {$random}%16; #20; end end endmodule
四、仿真结果
仿真结果显示我们的乘法器设计正确
五、除法器原理
1、我们先看十进制的除法过程
从十进制的除法运算,我们可以看见有几个步骤;
1.1、首先除法是从高位至低位依次进行;
1.2、每一位要加上前一位留下来的余数,组成一个新数和除数比较;
1.3、当新数大于/等于除数时,写商求余;
1.4、按照上述方式依次进行,直到被除数最末尾,除法运算结束。
2、二进制的除法过程
从图中可以看出二进制的除法,和十进制一致
六、代码实现
div4bit.v
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
`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}%16; b ={$random}%16; #20; end end endmodule
八、仿真结果
从仿真结果可以看出,我们设计的4bit除法器正确