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 |
Half-Adder Schematic – From Wikipedia
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
Results of Simulation:
Modelsim Simulation of Half Adder




Leave A Comment