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

Subversion Repositories aemb

[/] [aemb/] [branches/] [AEMB2_712/] [rtl/] [verilog/] [aeMB_ctrl.v] - Blame information for rev 41

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 41 sybreon
// $Id: aeMB_ctrl.v,v 1.1 2007-11-02 03:25:40 sybreon Exp $
2
//
3
// AEMB CONTROL UNIT
4
// 
5
// Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
6
//  
7
// This library is free software; you can redistribute it and/or
8
// modify it under the terms of the GNU Lesser General Public License
9
// as published by the Free Software Foundation; either version 2.1 of
10
// the License, or (at your option) any later version.
11
//
12
// This library is distributed in the hope that it will be useful, but
13
// WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
// Lesser General Public License for more details.
16
//  
17
// You should have received a copy of the GNU Lesser General Public
18
// License along with this library; if not, write to the Free Software
19
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20
// USA
21
//
22
// $Log: not supported by cvs2svn $
23
 
24
module aeMB_ctrl (/*AUTOARG*/
25
   // Outputs
26
   rMXDST, rMXSRC, rMXTGT, rMXALT, rMXALU, rRW, rDWBSTB, rXCE,
27
   dwb_stb_o, dwb_wre_o,
28
   // Inputs
29
   rDLY, rIMM, rALT, rOPC, rRD, rRA, rRB, rPC, rBRA, rMSR_IE, gclk,
30
   grst, gena, sys_int_i
31
   );
32
   // INTERNAL   
33
   //output [31:2] rPCLNK;
34
   output [1:0]  rMXDST;
35
   output [1:0]  rMXSRC, rMXTGT, rMXALT;
36
   output [2:0]  rMXALU;
37
   output [4:0]  rRW;
38
   output        rDWBSTB;
39
   output [1:0]  rXCE;
40
   input         rDLY;
41
   input [15:0]  rIMM;
42
   input [10:0]  rALT;
43
   input [5:0]    rOPC;
44
   input [4:0]    rRD, rRA, rRB;
45
   input [31:2]  rPC;
46
   input         rBRA;
47
   input         rMSR_IE;
48
 
49
   // DATA WISHBONE
50
   output        dwb_stb_o;
51
   output        dwb_wre_o;
52
 
53
   // SYSTEM
54
   input         gclk, grst, gena;
55
   input         sys_int_i;
56
 
57
   // --- DECODE INSTRUCTIONS
58
   // TODO: Simplify
59
 
60
   wire          fSFT = (rOPC == 6'o44);
61
   wire          fLOG = ({rOPC[5:4],rOPC[2]} == 3'o4);
62
 
63
   wire          fMUL = (rOPC == 6'o20) | (rOPC == 6'o30);
64
   wire          fBSF = (rOPC == 6'o21) | (rOPC == 6'o31);
65
   wire          fDIV = (rOPC == 6'o22);
66
 
67
   wire          fRTD = (rOPC == 6'o55);
68
   wire          fBCC = (rOPC == 6'o47) | (rOPC == 6'o57);
69
   wire          fBRU = (rOPC == 6'o46) | (rOPC == 6'o56);
70
   wire          fBRA = fBRU & rRA[3];
71
 
72
   wire          fIMM = (rOPC == 6'o54);
73
   wire          fMOV = (rOPC == 6'o45);
74
 
75
   wire          fLOD = ({rOPC[5:4],rOPC[2]} == 3'o6);
76
   wire          fSTR = ({rOPC[5:4],rOPC[2]} == 3'o7);
77
   wire          fLDST = (&rOPC[5:4]);
78
 
79
 
80
   // --- OPERAND SELECTOR ---------------------------------
81
 
82
   wire          fRDWE = |rRW;
83
   wire          fAFWD_M = (rRW == rRA) & (rMXDST == 2'o2) & fRDWE;
84
   wire          fBFWD_M = (rRW == rRB) & (rMXDST == 2'o2) & fRDWE;
85
   wire          fAFWD_R = (rRW == rRA) & (rMXDST == 2'o0) & fRDWE;
86
   wire          fBFWD_R = (rRW == rRB) & (rMXDST == 2'o0) & fRDWE;
87
 
88
   assign        rMXSRC = (fBRU | fBCC) ? 2'o3 : // PC
89
                          (fAFWD_M) ? 2'o2: // RAM
90
                          (fAFWD_R) ? 2'o1: // FWD
91
                          2'o0; // REG
92
 
93
   assign        rMXTGT = (rOPC[3]) ? 2'o3 : // IMM
94
                          (fBFWD_M) ? 2'o2 : // RAM
95
                          (fBFWD_R) ? 2'o1 : // FWD
96
                          2'o0; // REG
97
 
98
   assign        rMXALT = (fAFWD_M) ? 2'o2 : // RAM
99
                          (fAFWD_R) ? 2'o1 : // FWD
100
                          2'o0; // REG
101
 
102
 
103
   // --- ALU CONTROL ---------------------------------------
104
 
105
   reg [2:0]      rMXALU;
106
   always @(/*AUTOSENSE*/fBRA or fBSF or fDIV or fLOG or fMOV or fMUL
107
            or fSFT) begin
108
      rMXALU <= (fBRA | fMOV) ? 3'o3 :
109
                (fSFT) ? 3'o2 :
110
                (fLOG) ? 3'o1 :
111
                (fMUL) ? 3'o4 :
112
                (fBSF) ? 3'o5 :
113
                (fDIV) ? 3'o6 :
114
                3'o0;
115
   end
116
 
117
 
118
   // --- RAM CONTROL ---------------------------------------
119
 
120
   reg           rDWBSTB, xDWBSTB;
121
   reg           rDWBWRE, xDWBWRE;
122
 
123
   assign        dwb_stb_o = rDWBSTB;
124
   assign        dwb_wre_o = rDWBWRE;
125
 
126
   // --- DELAY SLOT REGISTERS ------------------------------
127
 
128
   reg [31:2]    rPCLNK, xPCLNK;
129
   reg [1:0]      rMXDST, xMXDST;
130
   reg [4:0]      rRW, xRW;
131
 
132
   wire          fSKIP = rBRA & !rDLY;
133
 
134
   always @(/*AUTOSENSE*/fLOD or fSKIP or fSTR)
135
     if (fSKIP) begin
136
        /*AUTORESET*/
137
        // Beginning of autoreset for uninitialized flops
138
        xDWBSTB <= 1'h0;
139
        xDWBWRE <= 1'h0;
140
        // End of automatics
141
     end else begin
142
 
143
        xDWBSTB <= fLOD | fSTR;
144
        xDWBWRE <= fSTR;
145
 
146
     end
147
 
148
   always @(/*AUTOSENSE*/fBCC or fBRU or fLOD or fRTD or fSKIP or fSTR
149
            or rRD)
150
     if (fSKIP) begin
151
        /*AUTORESET*/
152
        // Beginning of autoreset for uninitialized flops
153
        xMXDST <= 2'h0;
154
        xRW <= 5'h0;
155
        // End of automatics
156
     end else begin
157
 
158
        //xPCLNK <= rPC;
159
 
160
        /*
161
        case (rXCE)
162
          2'o1: xMXDST <= 2'o1;
163
          default: xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
164
                             (fLOD) ? 2'o2 :
165
                             (fBRU) ? 2'o1 :
166
                             2'o0;
167
        endcase // case (rXCE)
168
 
169
        case (rXCE)
170
          2'o1: xRW <= 5'd14;
171
          default: xRW <= rRD;
172
        endcase // case (rXCE)
173
        */
174
 
175
        xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
176
                  (fLOD) ? 2'o2 :
177
                  (fBRU) ? 2'o1 :
178
                  2'o0;
179
 
180
        xRW <= rRD;
181
 
182
     end
183
 
184
   // --- INTERRUPT CONTROL ---------------------------------
185
   wire         fNCLR;
186
   assign       fNCLR = (rOPC == 6'o46) | (rOPC == 6'o56) | // BRU
187
                        (rOPC == 6'o47) | (rOPC == 6'o57) | // BCC
188
                        (rOPC == 6'o55) | // RTD
189
                        (rOPC == 6'o54); // IMM
190
   reg [2:0]     rINT;
191
   reg [1:0]     rXCE, xXCE;
192
   //wire       fINT = rINT[0] & rINT[1] & !rINT[2] & rMSR_IE; // +Edge
193
   wire         fINT = rINT[2] & rMSR_IE;
194
 
195
   always @(/*AUTOSENSE*/fINT or fNCLR or rXCE)
196
     case (rXCE)
197
       2'o0: xXCE <= (fINT & !fNCLR) ? 2'o1 : 2'o0;
198
       default: xXCE <= 2'o0;
199
     endcase // case (rXCE)
200
 
201
   always @(posedge gclk)
202
     if (grst) begin
203
        /*AUTORESET*/
204
        // Beginning of autoreset for uninitialized flops
205
        rINT <= 3'h0;
206
        // End of automatics
207
     end else if (gena) begin
208
        rINT <= #1 {rINT[1:0], sys_int_i & rMSR_IE};
209
     end
210
 
211
   // --- PIPELINE CONTROL DELAY ----------------------------
212
 
213
   always @(posedge gclk)
214
     if (grst) begin
215
        /*AUTORESET*/
216
        // Beginning of autoreset for uninitialized flops
217
        rDWBSTB <= 1'h0;
218
        rDWBWRE <= 1'h0;
219
        rMXDST <= 2'h0;
220
        rRW <= 5'h0;
221
        rXCE <= 2'h0;
222
        // End of automatics
223
     end else if (gena) begin
224
        //rPCLNK <= #1 xPCLNK;
225
        rMXDST <= #1 xMXDST;
226
        rRW <= #1 xRW;
227
        rDWBSTB <= #1 xDWBSTB;
228
        rDWBWRE <= #1 xDWBWRE;
229
        rXCE <= #1 xXCE;
230
     end
231
 
232
 
233
 
234
endmodule // aeMB_ctrl

powered by: WebSVN 2.1.0

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