Ex08課題2016: ControlUnit_2.v

File ControlUnit_2.v, 2.6 KB (added by nakasato, 10 years ago)
Line 
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
12module 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
139endmodule // ControlUnit