<- previous index next ->
Basic decimal addition (with carry digit shown) 101 <- carry (note that three numbers are added after first digit) 567 + 526 ----- 1093 Binary addition (with carry bit shown) 1011 <- carry (note that three bits are added after first bit) for future reference c(3)=1, c(2)=0, c(1)=1, c(0)=1 1011 bits are numbered from zero, right to left + 1001 ----- 10100 for future reference s(3)=0, s(2)=1, s(1)=0, s(0)=0 the leftmost '1' is cout Since three bits must be added, a truth table for a full adder needs three inputs and thus eight entries. a b c | s co ------+----- _ _ _ _ _ _ 0 0 0 | 0 0 s = (a*b*c) + (a*b*c) + (a*b*c) + (a*b*c) 0 0 1 | 1 0 simplifies to 0 1 0 | 1 0 s = a xor b xor c 0 1 1 | 0 1 s <= a xor b xor c; 1 0 0 | 1 0 _ _ _ 1 0 1 | 0 1 co = (a*b*c) + (a*b*c) + (a*b*c) + (a*b*c) 1 1 0 | 0 1 simplifies to 1 1 1 | 1 1 co = (a*b)+(a*c)+(b*c) co <= (a and b) or (a and c) or (b and c); This can be drawn as a box for use on larger schematics +-------+ | a b c | The inputs are shown at the top (or left) | | | fadd | | | | co s | The outputs are shown at the bottom (or right) +-------+ The full adder can be written as an entity in VHDL entity fadd is -- full stage adder, interface port(a : in std_logic; b : in std_logic; c : in std_logic; s : out std_logic; co : out std_logic); end entity fadd; architecture circuits of fadd is -- full adder stage, body begin -- circuits of fadd s <= a xor b xor c after 1 ns; co <= (a and b) or (a and c) or (b and c) after 1 ns; end architecture circuits; -- of fadd Connecting four full adders, four fadd's, to make a 4-bit adderThe connections are written for VHDL as a0: entity WORK.fadd port map(a(0), b(0), cin, s(0), c(0)); a1: entity WORK.fadd port map(a(1), b(1), c(0), s(1), c(1)); a2: entity WORK.fadd port map(a(2), b(2), c(1), s(2), c(2)); a3: entity WORK.fadd port map(a(3), b(3), c(2), s(3), c(3)); Note that the carry out of the previous stage is wired into the carry input of the next higher stage. In a computer, four bits are added to four bits and this produces four bits of sum. The last carry bit, c(3) here, is usually called 'cout' and is not called a 'sum' bit. The circuit was simulated with a(3)=0, a(2)=0, a(1)=0, a(0)=1 cin=0 b(3)=1, b(2)=1, b(1)=1, b(0)=1 There is a small delay time from the input to the output. When a circuit is simulated, the initial values of signals are shown as 'U' for uninitialized. As the circuit simulation proceeds, the 'U' are computed and become '0' or '1'. Partial output from the VHDL simulation shows this propagation. (the upper line is logic '1', the lower line is logic '0') s(0) UU_____________________________ s(1) UUUUUU_________________________ s(2) UUUUUUUUUU_____________________ s(3) UUUUUUUUUUUUUU_________________ ____________________________ c(0) UU ________________________ c(1) UUUUUU ____________________ c(2) UUUUUUUUUU ________________ c(3) UUUUUUUUUUUUUU At the end of the simulation the values are: s(0)=0, s(1)=0, s(2)=0, s(3)=0, c(0)=1, c(1)=1, c(2)=1, c(3)=1 The full VHDL code is add_trace.vhdl The run file is add_trace.run The full output file is add_trace.out A fragment of the Makefile is Makefile.add_trace Given that the computer can "add" it now has to be able to "subtract." Thus, a representation has to be chosen for negative numbers. All computers have chosen the left most bit (also called the high-order bit) to be the sign bit. The convention is that a '1' in the sign bit means negative, a '0' in the sign bit means positive. Within these conventions, three representations have been used in computers: two's complement, one's complement and sign magnitude. All bits are shown for 4-bit words in the table below. decimal twos complement ones complement sign magnitude 0 0000 0000 0000 1 0001 0001 0001 2 0010 0010 0010 3 0011 0011 0011 4 0100 0100 0100 5 0101 0101 0101 6 0110 0110 0110 7 0111 0111 0111 -8 1000 - - -7 1001 1000 1111 -6 1010 1001 1110 -5 1011 1010 1101 -4 1100 1011 1100 -3 1101 1100 1011 -2 1110 1101 1010 -1 1111 1110 1001 -0 - 1111 1000 We could choose to build a subtractor that uses a borrow, yet this would require as many gates as were needed for the adder. By choosing the two's complement representation of negative numbers, an adder with a relatively low gate count multiplexor and inverter can become a subtractor. The implementation follows the definition of a negative number in two's complement representation: invert the bits and add one. Given a new symbol for an adder, the complete circuit for doing 4-bit add and subtract becomes:
When the signal "subtract" is '1' the circuit subtracts 'b' from 'a'. When the signal "subtract" is '0' the circuit adds 'a' to 'b'. The basic circuit is written for VHDL as: a4: entity work.add4 port map(a, b_mux, subtract, sum, cout); i4: b_bar <= not b; m4: entity work.mux4 port map(b, b_bar, subtract, b_mux); The general rule is that each circuit component symbol on a schematic diagram will become one VHDL statement. There are many other VHDL statements needed to run a complete simulation. The annotated output of the simulation is: subtract=0, a=0100, b=0010, sum=0110 4+2=6 subtract=1, a=0100, b=0010, sum=0010 4-2=2 subtract=0, a=1100, b=0010, sum=1110 (-4)+2=(-2) subtract=1, a=1100, b=0010, sum=1010 (-4)-2=(-6) subtract=0, a=1100, b=1110, sum=1010 (-4)+(-2)=(-6) subtract=1, a=1100, b=1110, sum=1110 (-4)-(-2)=(-2) subtract=0, a=0011, b=1110, sum=0001, 3+(-2)=1 subtract=1, a=0011, b=1110, sum=0101, 3-(-2)=5 The full VHDL code is sub4.vhdl The run file is sub4.run The full output file is sub4.out A fragment of the Makefile is Makefile.sub4
<- previous index next ->