本篇文章,介紹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除法器正確