Half Adder Module in VHDL and Verilog
Half adders are a basic building block for new digital designers. A half-adder shows how two bits can be added together with a few simple logic gates. In practice they are not often used because they are limited to two one-bit inputs. For adding together larger numbers a Full-Adder can be used. A single half-adder has two one-bit inputs, a sum output, and a carry-out output. Refer to the truth table below to see how these bits operate. The code creates a half adder. There is also a test bench that stimulates the design and ensures that it behaves correctly.
Half Adder Truth Table | |||
---|---|---|---|
A | B | Carry | Sum |
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
1 | 1 | 1 | 0 |
VHDL Implementation:
half_adder.vhd
------------------------------------------------------------------------------- -- File Downloaded from http://www.nandland.com ------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity half_adder is port ( i_bit1 : in std_logic; i_bit2 : in std_logic; -- o_sum : out std_logic; o_carry : out std_logic ); end half_adder; architecture rtl of half_adder is begin o_sum <= i_bit1 xor i_bit2; o_carry <= i_bit1 and i_bit2; end rtl;
half_adder_tb.vhd
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity half_adder_tb is end half_adder_tb; architecture behave of half_adder_tb is signal r_BIT1 : std_logic := '0'; signal r_BIT2 : std_logic := '0'; signal w_SUM : std_logic; signal w_CARRY : std_logic; begin UUT : entity work.half_adder -- uses default binding port map ( i_bit1 => r_BIT1, i_bit2 => r_BIT2, o_sum => w_SUM, o_carry => w_CARRY ); process is begin r_BIT1 <= '0'; r_BIT2 <= '0'; wait for 10 ns; r_BIT1 <= '0'; r_BIT2 <= '1'; wait for 10 ns; r_BIT1 <= '1'; r_BIT2 <= '0'; wait for 10 ns; r_BIT1 <= '1'; r_BIT2 <= '1'; wait for 10 ns; end process; end behave;
Verilog Implementation:
half_adder.v
/////////////////////////////////////////////////////////////////////////////// // File Downloaded from http://www.nandland.com /////////////////////////////////////////////////////////////////////////////// module half_adder ( i_bit1, i_bit2, o_sum, o_carry ); input i_bit1; input i_bit2; output o_sum; output o_carry; assign o_sum = i_bit1 ^ i_bit2; // bitwise xor assign o_carry = i_bit1 & i_bit2; // bitwise and endmodule // half_adder
half_adder_tb.v:
/////////////////////////////////////////////////////////////////////////////// // File Downloaded from http://www.nandland.com /////////////////////////////////////////////////////////////////////////////// `include "half_adder.v" module half_adder_tb; reg r_BIT1 = 0; reg r_BIT2 = 0; wire w_SUM; wire w_CARRY; half_adder half_adder_inst ( .i_bit1(r_BIT1), .i_bit2(r_BIT2), .o_sum(w_SUM), .o_carry(w_CARRY) ); initial begin r_BIT1 = 1'b0; r_BIT2 = 1'b0; #10; r_BIT1 = 1'b0; r_BIT2 = 1'b1; #10; r_BIT1 = 1'b1; r_BIT2 = 1'b0; #10; r_BIT1 = 1'b1; r_BIT2 = 1'b1; #10; end endmodule // half_adder_tb
Leave A Comment