| 1 | // constant definition for opcode |
|---|
| 2 | `define RTYPE 0 |
|---|
| 3 | `define LW 35 |
|---|
| 4 | `define SW 43 |
|---|
| 5 | `define BEQ 4 |
|---|
| 6 | `define JMP 2 |
|---|
| 7 | `define ADDI 8 |
|---|
| 8 | `define SLTI 10 |
|---|
| 9 | `define ANDI 12 |
|---|
| 10 | `define ORI 13 |
|---|
| 11 | |
|---|
| 12 | module ControlUnit(PCWriteCond, PCWrite, IorD, MemRead, MemWrite, MemtoReg, |
|---|
| 13 | IRWrite, PCSource, ALUOp, ALUSrcB, ALUSrcA, |
|---|
| 14 | RegWrite, RegDST, Op, CK, CLR); |
|---|
| 15 | |
|---|
| 16 | // clock |
|---|
| 17 | input CK; |
|---|
| 18 | input CLR; |
|---|
| 19 | |
|---|
| 20 | // opcode (6 bit) |
|---|
| 21 | input [5:0] Op; |
|---|
| 22 | |
|---|
| 23 | // 1 bit control signal |
|---|
| 24 | output PCWriteCond; |
|---|
| 25 | output PCWrite; |
|---|
| 26 | output IorD; |
|---|
| 27 | output MemRead; |
|---|
| 28 | output MemWrite; |
|---|
| 29 | output MemtoReg; |
|---|
| 30 | output IRWrite; |
|---|
| 31 | output RegWrite; |
|---|
| 32 | output RegDST; |
|---|
| 33 | output ALUSrcA; |
|---|
| 34 | |
|---|
| 35 | // 2 bit control signal |
|---|
| 36 | output [1:0] PCSource; |
|---|
| 37 | output [1:0] ALUOp; |
|---|
| 38 | output [2:0] ALUSrcB; |
|---|
| 39 | |
|---|
| 40 | // register declaration |
|---|
| 41 | reg PCWriteCond; |
|---|
| 42 | reg PCWrite; |
|---|
| 43 | reg IorD; |
|---|
| 44 | reg MemRead; |
|---|
| 45 | reg MemWrite; |
|---|
| 46 | reg MemtoReg; |
|---|
| 47 | reg IRWrite; |
|---|
| 48 | reg [1:0] PCSource; |
|---|
| 49 | reg [1:0] ALUOp; |
|---|
| 50 | reg [2:0] ALUSrcB; |
|---|
| 51 | reg ALUSrcA; |
|---|
| 52 | reg RegWrite; |
|---|
| 53 | reg RegDST; |
|---|
| 54 | |
|---|
| 55 | // state register |
|---|
| 56 | reg [3:0] state; |
|---|
| 57 | |
|---|
| 58 | always @(posedge CK or posedge CLR) |
|---|
| 59 | begin |
|---|
| 60 | if(CLR==1) state <= 0; |
|---|
| 61 | else |
|---|
| 62 | case(state) |
|---|
| 63 | 0: state <= 1; |
|---|
| 64 | 1: |
|---|
| 65 | begin |
|---|
| 66 | if(Op == `LW || Op == `SW) |
|---|
| 67 | state <= 2; |
|---|
| 68 | else if(Op == `RTYPE) |
|---|
| 69 | state <= 6; |
|---|
| 70 | else if(Op == `BEQ) |
|---|
| 71 | state <= 8; |
|---|
| 72 | else if(Op == `JMP) |
|---|
| 73 | state <= 9; |
|---|
| 74 | else if(Op == `ADDI || Op == `SLTI) |
|---|
| 75 | state <= 10; |
|---|
| 76 | else if(Op == `ANDI || Op == `ORI) |
|---|
| 77 | state <= 12; |
|---|
| 78 | end // case: 1 |
|---|
| 79 | |
|---|
| 80 | 2: |
|---|
| 81 | begin |
|---|
| 82 | if(Op == `LW) |
|---|
| 83 | state <= 3; |
|---|
| 84 | else if(Op == `SW) |
|---|
| 85 | state <= 5; |
|---|
| 86 | end |
|---|
| 87 | |
|---|
| 88 | 3: state <= 4; |
|---|
| 89 | 4: state <= 0; |
|---|
| 90 | 5: state <= 0; |
|---|
| 91 | 6: state <= 7; |
|---|
| 92 | 7: state <= 0; |
|---|
| 93 | 8: state <= 0; |
|---|
| 94 | 9: state <= 0; |
|---|
| 95 | 10: state <= 11; |
|---|
| 96 | 11: state <= 0; |
|---|
| 97 | 12: state <= 11; |
|---|
| 98 | |
|---|
| 99 | default: ; |
|---|
| 100 | |
|---|
| 101 | endcase // case (state) |
|---|
| 102 | end // always @ (posedge CK or posedge CLR) |
|---|
| 103 | |
|---|
| 104 | always @(state) |
|---|
| 105 | begin |
|---|
| 106 | case(state) |
|---|
| 107 | 0: |
|---|
| 108 | begin |
|---|
| 109 | MemWrite <= 0; |
|---|
| 110 | PCWriteCond <= 0; |
|---|
| 111 | RegWrite <= 0; |
|---|
| 112 | MemRead <= 1; |
|---|
| 113 | ALUSrcA <= 0; |
|---|
| 114 | IorD <= 0; |
|---|
| 115 | IRWrite <= 1; |
|---|
| 116 | ALUSrcB <= 3'b001; |
|---|
| 117 | ALUOp <= 2'b00; |
|---|
| 118 | PCWrite <= 1; |
|---|
| 119 | PCSource <= 2'b00; |
|---|
| 120 | end |
|---|
| 121 | |
|---|
| 122 | 1: |
|---|
| 123 | begin |
|---|
| 124 | MemRead <= 0; |
|---|
| 125 | IRWrite <= 0; |
|---|
| 126 | PCWrite <= 0; |
|---|
| 127 | MemWrite <= 0; |
|---|
| 128 | PCWriteCond <= 0; |
|---|
| 129 | RegWrite <= 0; |
|---|
| 130 | ALUSrcA <= 0; |
|---|
| 131 | ALUSrcB <= 3'b011; |
|---|
| 132 | ALUOp <= 2'b00; |
|---|
| 133 | end |
|---|
| 134 | |
|---|
| 135 | default: ; |
|---|
| 136 | endcase |
|---|
| 137 | end // always @ (state) |
|---|
| 138 | |
|---|
| 139 | endmodule // ControlUnit |
|---|