Ex07課題2015: ControlUnit_1.v

File ControlUnit_1.v, 2.0 KB (added by nakasato, 11 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)
103endmodule // ControlUnit