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