兩個一位的二進制數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個與門,一個三輸入的異或門,一個三輸入的或門。
功能仿真和門級仿真的波形如下,信號符合預期。