57 lines
1.7 KiB
Systemverilog
57 lines
1.7 KiB
Systemverilog
|
// CSE141L
|
||
|
import definitions::*;
|
||
|
// control decoder (combinational, not clocked)
|
||
|
// inputs from instrROM, ALU flags
|
||
|
// outputs to program_counter (fetch unit)
|
||
|
module Ctrl (
|
||
|
input[ 8:0] Instruction, // machine code
|
||
|
input[ 7:0] DatMemAddr,
|
||
|
output logic Jump ,
|
||
|
BranchEn ,
|
||
|
RegWrEn , // write to reg_file (common)
|
||
|
MemWrEn , // write to mem (store only)
|
||
|
LoadInst , // mem or ALU to reg_file ?
|
||
|
PCTarg ,
|
||
|
tapSel ,
|
||
|
Ack // "done w/ program"
|
||
|
// output logic[2:0] ALU_inst
|
||
|
);
|
||
|
|
||
|
/* ***** All numerical values are completely arbitrary and for illustration only *****
|
||
|
*/
|
||
|
|
||
|
// ALU commands
|
||
|
//assign ALU_inst = Instruction[2:0];
|
||
|
|
||
|
// STR commands only -- write to data_memory
|
||
|
assign MemWrEn = Instruction[8:6]==3'b110;
|
||
|
|
||
|
// all but STR and NOOP (or maybe CMP or TST) -- write to reg_file
|
||
|
assign RegWrEn = Instruction[8:7]!=2'b11;
|
||
|
|
||
|
// route data memory --> reg_file for loads
|
||
|
// whenever instruction = 9'b110??????;
|
||
|
assign LoadInst = Instruction[8:6]==3'b110; // calls out load specially
|
||
|
|
||
|
assign tapSel = LoadInst && DatMemAddr=='d62;
|
||
|
// jump enable command to program counter / instruction fetch module on right shift command
|
||
|
// equiv to simply: assign Jump = Instruction[2:0] == kRSH;
|
||
|
always_comb
|
||
|
if(Instruction[2:0] == kRSH)
|
||
|
Jump = 1;
|
||
|
else
|
||
|
Jump = 0;
|
||
|
|
||
|
// branch every time instruction = 9'b?????1111;
|
||
|
assign BranchEn = &Instruction[3:0];
|
||
|
|
||
|
// whenever branch or jump is taken, PC gets updated or incremented from "Target"
|
||
|
// PCTarg = 2-bit address pointer into Target LUT (PCTarg in --> Target out
|
||
|
assign PCTarg = Instruction[3:2];
|
||
|
|
||
|
// reserve instruction = 9'b111111111; for Ack
|
||
|
assign Ack = &Instruction;
|
||
|
|
||
|
endmodule
|
||
|
|