兩個一位的二進制數x,y相加,假設和為s,進位為cout,其真值表為:
從真值表中,我們可以得到:s = x^y, cout = x&y,實現兩個一位數相加的邏輯電路稱為半加器。
實現該電路的verilog代碼如下:
module halfadd(x,y,s,cout); input x; input y; output s; output cout; assign s = x^y; assign cout = x&y; endmodule
相對應的testbench文件如下代碼。在代碼中,我們采用系統函數$random來產生隨機激勵。半加器電路中並沒有使用時鍾,但在testbench中,產生了時鍾信號,主要是為了功能驗證時候,有一個時間單位信號,便於檢查結果。
`timescale 1ns/1ns
`define clock_period 20
module halfadd_tb;
reg x,y;
wire cout;
wire s;
reg clk;
halfadd halfadd_0(
.x(x),
.y(y),
.s(s),
.cout(cout)
);
initial clk = 0;
always #(`clock_period/2) clk = ~clk;
initial begin
x = 0;
repeat(20)
#(`clock_period) x = $random;
end
initial begin
y = 0;
repeat(20)
#(`clock_period) y = $random;
end
initial begin
#(`clock_period*20)
$stop;
end
endmodule
在quartus II中,分析與綜合后,用rtl view 可以得到 halfadd的電路如下,和我們預想的一樣。
功能仿真結果如下,從波形中可以看到結果正確。
全編譯后,在Cyclone IV E-EP4CE10F17C8中的門級仿真結果如下,輸入和輸出之間,會有幾ns的時延。
通常,我們更感興趣的是多位二進制數的相加,在多位二進制數相加時,對每一位而言,除了考慮相加的兩位數(第i位),還要考慮來自低位(i-1位)的進位。實現帶低位進位的兩個一位數相加的邏輯電路,稱為全加器。
它的真值表如下:
從真值表中,我們可以得知:s = ~x & y & ~cin + x&~y&~cin+~x&~y&cin+x&y&cin = (~x&y+x&~y)&~cin+(~x&~y+x&y)&cin=(x^y)&~cin+~(x^y)&cin=x^y^cin,
這兒我們用~表示非,+表示或。cout = x&y+x&cin+y&cin
全加器verilog代碼如下:
module fulladd(cin,x,y,s,cout); input cin; input x; input y; output s; output cout; assign s = x^y^cin; assign cout = (x&y)|(x&cin)|(y&cin); endmodule
對應的testbench代碼如下:
`timescale 1ns/1ns
`define clock_period 20
module fulladd_tb;
reg cin,x,y;
wire cout;
wire s;
reg clk;
fulladd fulladd_0(
.cin(cin),
.x(x),
.y(y),
.s(s),
.cout(cout)
);
initial clk = 0;
always #(`clock_period/2) clk = ~clk;
initial begin
x = 0;
repeat(20)
#(`clock_period) x = $random;
end
initial begin
y = 0;
repeat(20)
#(`clock_period) y = $random;
end
initial begin
cin = 0;
repeat(2)
#(`clock_period*10) cin = {$random};
end
initial begin
#(`clock_period*20)
$stop;
end
endmodule
從rtl view中,可以看到全加器邏輯電路圖如下:包括3個與門,一個三輸入的異或門,一個三輸入的或門。
功能仿真和門級仿真的波形如下,信號符合預期。








