Lab 5: Decode Unit Components¶
In this lab, you have two new components to build.
Decoder Unit¶
This unit is a mess to build, so take it slowly. Work with your team, and add one instruction at a time. You should test things as you go.
The decode unit takes two 16-bit uint16_t
instruction data values in and
produces several output results. If we start with the ADD
instruction, we
will generate two register numbers, and a code for the ALU operation we want.
This code is up to you to pick.
Note
You might use a C++ enumeration for this (look this up if you have never seen it, it is a neat way to use names instead of numbers for places like this.)
For this lab, focus on the basic instructions the ALU needs to support:
ADD
SUB
AND
OR
NOT (COM)
EOR
All of these are single instruction word operands, and all reference registers. Remember that you need to update the PC as part of this work.
Register Memory¶
The register memory is very similar to the instruction memeory you constructed
for the last lab, You need to set up an array of uint8_t
data items for this
memory component, and we need exactly 32 items, so set this up as a simple
array.
Add signals to control reading and writing. It is common to keep these separate, but you can use a single line if you wish.
The tick
method will need to check the read
signal to verify that it is
doing a read. It will then use the two incoming register number signals to
access the register memory, delivering two results to the output pins that we
will connect up to the ALU in our next lab.
When we are writing, we need one other input line, holding data that will be
delivered later by the store stage. That data will be recorded into memeory
using the register number indicated in the instruction (usually the Rd
register).
Again, write test code to verify that your unit is working properly.