OpenCores
URL https://opencores.org/ocsvn/igor/igor/trunk

Subversion Repositories igor

[/] [igor/] [trunk/] [processor/] [pl/] [control.vhd] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 atypic
library ieee;
2
use ieee.std_logic_1164.all;
3
use work.leval2_package.all;
4
 
5
entity control is
6
    port (
7
    -- from decode
8
    -- Controls the indirect register fetch stage.
9
    IndirReg1 : in std_logic;
10
    IndirReg2 : in std_logic;
11
 
12
     -- controls 
13
    PCmux : out std_logic_vector(1 downto 0);
14
    AluOp : out std_logic_vector(ALU_FUNCT_SIZE - 1 downto 0);
15
    WriteReg : out std_logic;
16
    Flush : out std_logic;
17
    MemToReg : out std_logic;
18
 
19
    IndirMux1 : out std_logic;
20
    IndirMux2 : out std_logic;
21
 
22
        Branch : out std_logic;
23
        StoreInst : out std_logic;
24
    Stall : out std_logic;
25
 
26
    Opcode : in std_logic_vector(INSTR_OPCODE_BITS - 1 downto 0);
27
    MemWait : in std_logic;
28
        Sync : in std_logic;
29
    BranchTaken : in std_logic;
30
 
31
        Hazard : in std_logic
32
);
33
end entity;
34
 
35
 
36
architecture behav of control is
37
begin
38
    control_set : process (IndirReg1,IndirReg2,Opcode,MemWait,BranchTaken)
39
    begin
40
        -- default values for the output. 
41
        PCmux <= PCMUX_NOBRANCH;
42
        AluOp <= ALU_PASS;
43
        WriteReg <= '0';
44
        MemToReg <= '0';
45
                StoreInst <= '0';
46
 
47
                -- Stall control
48
 
49
        -- Indirection control
50
        if IndirReg1 = '1' or Sync = '1' then
51
            --We have an indirect register addressing mode. Stall pipeline.
52
            PCmux <= PCMUX_STALL;
53
 
54
        elsif MemWait = '1' or Sync = '1' then
55
            -- Memory wait control. Freeze pipeline while waiting 
56
            -- for memory transaction to complete.
57
            PCmux <= PCMUX_STALL;
58
        end if;
59
 
60
        -- Opcode control
61
        case opcode is
62
                    -- Arithmetical / Logic functions
63
            when ADD =>
64
                AluOp<= ALU_ADD;
65
                WriteReg <= '1';
66
 
67
            when SUBB =>
68
                AluOp<= ALU_SUB;
69
                WriteReg <= '1';
70
 
71
            when MUL =>
72
                AluOp<= ALU_MUL;
73
                WriteReg <= '1';
74
 
75
                    --                                  -- NOT IMPLEMENTED
76
                    --                                  when DIV =>
77
                    --                                          AluOp<= ALU_DIV;
78
                    --                                          --WriteReg <= '1';
79
                    --                                  when MODULO =>
80
                    --                                          AluOp<= ALU_MOD;
81
                    --                                          --WriteReg <= '1';
82
 
83
            when LAND =>
84
                AluOp<= ALU_AND;
85
                WriteReg <= '1';
86
 
87
            when LOR =>
88
                AluOp<= ALU_OR;
89
                WriteReg <= '1';
90
 
91
            when LXOR =>
92
                AluOp<= ALU_XOR;
93
                WriteReg <= '1';
94
 
95
            when LOAD =>
96
                MemToReg <= '1'; -- use data bus
97
                AluOp<= ALU_ADD;
98
--                alu_op2_sel <= '1';
99
 --               --alu_op1_sel <= '1';
100
                --stored <= false;
101
                --stall <= '1';
102
                -- Also, stall pipeline!
103
 
104
            when STORE =>
105
                AluOp<= ALU_ADD;
106
                                StoreInst <= '1';
107
                --alu_op2_sel <= '1';
108
                ----alu_op1_sel <= '1';
109
 
110
            when BIDX =>
111
                if BranchTaken = '1' then
112
                    AluOp<= ALU_ADD;
113
                    --branch_taken <= '1';
114
                    --alu_op2_sel <= '1';
115
                end if;
116
 
117
            when GET_TYPE =>
118
                AluOp<= ALU_GET_TYPE;
119
                WriteReg <= '1';
120
 
121
            when SET_TYPE =>
122
                AluOp<= ALU_SET_TYPE;
123
                WriteReg <= '1';
124
 
125
            when SET_TYPE_IMM   =>
126
                AluOp<= ALU_SET_TYPE;
127
                WriteReg <= '1';
128
                --alu_op2_sel <= '1';
129
 
130
            when SET_DATUM =>
131
                AluOp<= ALU_SET_DATUM;
132
                WriteReg <= '1';
133
 
134
            when SET_DATUM_IMM =>
135
                AluOp<= ALU_SET_DATUM;
136
                WriteReg <= '1';
137
                --alu_op2_sel <= '1';
138
 
139
            when SET_GC =>
140
                AluOp<= ALU_SET_GC;
141
                WriteReg <= '1';
142
 
143
            when SET_GC_IMM =>
144
                AluOp<= ALU_SET_GC;
145
                WriteReg <= '1';
146
                --alu_op2_sel <= '1';
147
 
148
            when CPY =>
149
                AluOp<= ALU_CPY;
150
                WriteReg <= '1';
151
 
152
            when CMP_TYPE =>
153
                AluOp<= ALU_CMP_TYPE;
154
 
155
            when CMP_TYPE_IMM =>
156
                AluOp<= ALU_CMP_TYPE_IMM;
157
                --alu_op2_sel <= '1';
158
 
159
            when CMP_DATUM =>
160
                AluOp<= ALU_CMP_DATUM;
161
 
162
            when CMP_DATUM_IMM =>
163
                AluOp<= ALU_CMP_DATUM;
164
                --alu_op2_sel <= '1';
165
 
166
            when CMP_GC =>
167
                AluOp<= ALU_CMP_GC;
168
 
169
            when CMP_GC_IMM =>
170
                AluOp<= ALU_CMP_GC_IMM;
171
                --alu_op2_sel <= '1';
172
 
173
            when CMP =>
174
                AluOp<= ALU_CMP;
175
 
176
            when SHIFT_L =>
177
                AluOp<= ALU_SL;
178
                WriteReg <= '1';
179
 
180
            when SHIFT_R =>
181
                AluOp<= ALU_SR;
182
                WriteReg <= '1';
183
 
184
            when SETLED =>
185
                AluOp<= ALU_SETLED;
186
 
187
            when others =>
188
                -- unknown opcode, do nothing
189
                AluOp<= ALU_PASS;
190
        end case;
191
    end process;
192
end architecture;
193
 
194
 
195
 
196
 
197
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.