Tom Kelliher, CS 240
25 points, due April. 6
For this assignment, you will be implementing in VHDL and simulating an eight-bit version of the simplified arithmetic logic unit (ALU) used in Patterson & Hennessy's Computer Organization & Design textbook. Use the following for the top-level entity I/O structure of your ALU:
entity alu8 is Port ( a : in STD_LOGIC_VECTOR (7 downto 0); b : in STD_LOGIC_VECTOR (7 downto 0); op : in STD_LOGIC_VECTOR (2 downto 0); result : out STD_LOGIC_VECTOR (7 downto 0); overflow : out STD_LOGIC ); end alu;The functions to be computed by the ALU are defined by:
if (op == 0) result = a AND b; else if (op == 1) result = a OR b; else if (op == 2) result = a NAND b; else if (op == 3) result = a NOR b; else if (op == 4) { result = a + b; if (overflow has occurred) overflow = 1; else overflow = 0; } else if (op == 5) { result = a - b; if (overflow has occurred) overflow = 1; else overflow = 0; } else if (op == 6) // set on less than AKA slt if (a < b) result = 1; else result = 0;For those ops for which
overflow
is not defined, you may assume that
it is a don't care. (Don't read too much into this -- it simply means
that you only need be concerned with overflow's value being correct
for the addition and subtraction operations.) You may assume that op's value will never be 7.
The eight-bit ALU just described can be broken down into eight one-bit ALUs and some combinational control logic. Use this entity statement for the one-bit ALU:
entity alu1 is Port ( a : in STD_LOGIC; b : in STD_LOGIC; less : in STD_LOGIC; ainvert : in STD_LOGIC; binvert : in STD_LOGIC; carryin : in STD_LOGIC; operation : in STD_LOGIC_VECTOR (1 downto 0); result : out STD_LOGIC; carryout : out STD_LOGIC; sign : out STD_LOGIC );The following block diagram illustrates nearly all of the functionality required of the one-bit ALU. The one missing piece is the sign output defined in the above entity statement. Use the sum output directly from the one-bit full adder to produce the sign bit.
Two small pieces of combinational logic are necessary. The first of these
generates the control signals needed by the one-bit ALUs from the op
input of the eight-bit ALU:
The values of these output signals, needed by the one-bit ALUs, are
completely determined by the value of op
.
For example, if op
is 011
(NOR), then both ainvert
and binvert
should be 1
, carry(0)
is a don't care,
and operation
should be 00
, selecting the value of the AND
gate as the output of the mux.
The second piece of combinational logic is used to generate bit 0 of
result
for the slt
instruction and to generate the
overflow
output:
Some hints:
result
for the slt
instruction.
slt
instruction should work correctly for all values of
a
and b
, even if overflow
occurs. Remember, overflow indicates that the sign bit is wrong.
a
and
b
within the one-bit ALU can be replaced with fan-in 2 EXOR
gates. (VHDL has an xor
operator.)
sign
outputs of the seven least significant one-bit ALUs
will be unneeded in the eight-bit ALU. You may use the open
keyword in the port map lists for those seven ALUs to indicate that the
sign output should be left unconnected.
Turn in your VHDL source code (module files and test bench files), your test waveforms from ISim, and a brief commentary defending your choice of test bench test cases as demonstrating the correctness of your eight-bit ALU.