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

Subversion Repositories theia_gpu

[/] [theia_gpu/] [trunk/] [rtl/] [Unit_EXE.v] - Blame information for rev 211

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

Line No. Rev Author Line
1 152 diegovalve
`timescale 1ns / 1ps
2
`include "aDefinitions.v"
3
/**********************************************************************************
4
Theia, Ray Cast Programable graphic Processing Unit.
5
Copyright (C) 2010  Diego Valverde (diego.valverde.g@gmail.com)
6
 
7
This program is free software; you can redistribute it and/or
8
modify it under the terms of the GNU General Public License
9
as published by the Free Software Foundation; either version 2
10
of the License, or (at your option) any later version.
11
 
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20
 
21
***********************************************************************************/
22
 
23
//---------------------------------------------------------------------
24
module ExecutionUnit
25
(
26
 
27
input wire                             Clock,
28
input wire                             Reset,
29
input wire [`ROM_ADDRESS_WIDTH-1:0]         iInitialCodeAddress,
30
input wire [`INSTRUCTION_WIDTH-1:0]      iInstruction1,
31
input wire [`INSTRUCTION_WIDTH-1:0]      iInstruction2,
32
 
33
 
34
input wire [`DATA_ROW_WIDTH-1:0]                 iDataRead0,
35
input wire [`DATA_ROW_WIDTH-1:0]       iDataRead1,
36
input wire                             iTrigger,
37
 
38
 
39
output wire [`ROM_ADDRESS_WIDTH-1:0]     oInstructionPointer1,
40
output wire [`ROM_ADDRESS_WIDTH-1:0]     oInstructionPointer2,
41
output wire [`DATA_ADDRESS_WIDTH-1:0]    oDataReadAddress0,
42
output wire [`DATA_ADDRESS_WIDTH-1:0]  oDataReadAddress1,
43
output wire                                                                     oDataWriteEnable,
44
output wire [`DATA_ADDRESS_WIDTH-1:0]    oDataWriteAddress,
45
output wire [`DATA_ROW_WIDTH-1:0]                oDataBus,
46
output wire                            oReturnCode,
47
 
48
 
49
output wire [`DATA_ROW_WIDTH-1:0]    oOMEMWriteAddress,
50
output wire [`DATA_ROW_WIDTH-1:0]    oOMEMWriteData,
51
output wire                                 oOMEMWriteEnable,
52
output wire [`DATA_ROW_WIDTH-1:0]    oTMEMReadAddress,
53
input wire [`DATA_ROW_WIDTH-1:0]     iTMEMReadData,
54
input wire                           iTMEMDataAvailable,
55
output wire                          oTMEMDataRequest,
56
 
57
`ifdef DEBUG
58
input wire [`MAX_CORES-1:0]            iDebug_CoreID,
59
`endif
60
output wire                            oDone
61
 
62
 
63
 
64
 
65
);
66
 
67
 
68
`ifdef DEBUG
69
        wire [`ROM_ADDRESS_WIDTH-1:0] wDEBUG_IDU2_EXE_InstructionPointer;
70
`endif
71
 
72
wire                                                                            wEXE2__uCodeDone;
73
wire                                                                            wEXE2_IFU__EXEBusy;
74
wire [`DATA_ADDRESS_WIDTH-1:0]   wEXE2_IDU_DataFordward_LastDestination;
75
wire                                                                            wALU2_EXE__BranchTaken;
76
wire                                                                            wALU2_IFU_BranchNotTaken;
77
wire [`INSTRUCTION_WIDTH-1:0]    CurrentInstruction;
78
//wire                                                                          wIDU2_IFU__IDUBusy;
79
 
80
 
81
wire [`INSTRUCTION_OP_LENGTH-1:0]                                wOperation;
82
 
83
 
84
wire [`DATA_ROW_WIDTH-1:0] wSource0,wSource1;
85
wire [`DATA_ADDRESS_WIDTH-1:0] wDestination;
86
wire wInstructionAvailable;
87
 
88
//ALU wires
89
wire [`INSTRUCTION_OP_LENGTH-1:0]                ALU2Operation;
90
wire [`WIDTH-1:0]                                        ALU2ChannelA;
91
wire [`WIDTH-1:0]                                        ALU2ChannelB;
92
wire [`WIDTH-1:0]                                        ALU2ChannelC;
93
wire [`WIDTH-1:0]                                        ALU2ChannelD;
94
wire [`WIDTH-1:0]                                        ALU2ChannelE;
95
wire [`WIDTH-1:0]                                        ALU2ChannelF;
96
wire [`WIDTH-1:0]                                        ALU2ResultA;
97
wire [`WIDTH-1:0]                                        ALU2ResultB;
98
wire [`WIDTH-1:0]                                        ALU2ResultC;
99
wire                                                                            wEXE2_ALU__TriggerALU;
100
wire                                                                            ALU2OutputReady;
101
wire                                                                            w2FIU__BranchTaken;
102
wire    [`ROM_ADDRESS_WIDTH-1:0] JumpIp;
103
wire  [`ROM_ADDRESS_WIDTH-1:0]   wIDU2_IFU_ReturnAddress;
104
wire                             wALU2_IFU_ReturnFromSub;
105
 
106
//wire wIDU2_IFU__InputsLatched;        
107
 
108
wire wEPU_Busy,wTriggerIFU;
109
wire [`ROM_ADDRESS_WIDTH-1:0] wEPU_IP,wIFU_IP,wCodeEntryPoint;
110
 
111
assign oInstructionPointer1 = (wEPU_Busy) ? wEPU_IP : wIFU_IP;
112
 
113
 
114
InstructionEntryPoint EPU
115
(
116
.Clock( Clock ),
117
.Reset( Reset ),
118
.iTrigger( iTrigger ),
119
.iInitialCodeAddress( iInitialCodeAddress ),
120
.iIMemInput(iInstruction1),
121
 
122
.oEPU_Busy(wEPU_Busy),
123
.oEntryPoint( wCodeEntryPoint ),
124
.oTriggerIFU( wTriggerIFU ),
125
.oInstructionAddr( wEPU_IP )
126
 
127
);
128
 
129
InstructionFetch IFU
130
(
131
.Clock( Clock                                  ),
132
.Reset( Reset                                  ),
133
.iTrigger(              wTriggerIFU            ),
134
.iInstruction1(         iInstruction1          ),
135
.iInstruction2(         iInstruction2          ),
136
.iInitialCodeAddress(   wCodeEntryPoint        ),
137
.iBranchTaken(          w2FIU__BranchTaken     ),
138
.iSubroutineReturn(     wALU2_IFU_ReturnFromSub ),
139
//.iReturnAddress(        wIDU2_IFU_ReturnAddress ),
140
.oCurrentInstruction(   CurrentInstruction      ),
141
.oInstructionAvalable(  wInstructionAvailable   ),
142
.oIP(                   wIFU_IP                 ),
143
.oIP2(                  oInstructionPointer2    ),
144
.iEXEDone(              ALU2OutputReady         ),
145
.oMicroCodeReturnValue( oReturnCode             ),
146
.oExecutionDone(        oDone                   )
147
);
148
 
149
////---------------------------------------------------------
150
wire wIDU2_EXE_DataReady;
151
wire wEXE2_IDU_ExeLatchedValues;
152
 
153
InstructionDecode IDU
154
(
155
        .Clock( Clock ),
156
        .Reset( Reset ),
157
        .iEncodedInstruction( CurrentInstruction ),
158
        .iInstructionAvailable( wInstructionAvailable ),
159
        //.iIP( oInstructionPointer1 ),
160
        //.oReturnAddress( wIDU2_IFU_ReturnAddress ),
161
 
162
        .oRamAddress0( oDataReadAddress0 ),
163
        .oRamAddress1( oDataReadAddress1 ),
164
        .iRamValue0( iDataRead0 ),
165
        .iRamValue1( iDataRead1 ),
166
 
167
        .iLastDestination( wEXE2_IDU_DataFordward_LastDestination ),
168
        .iDataForward( {ALU2ResultA,ALU2ResultB,ALU2ResultC} ),
169
 
170
        //Outputs going to the ALU-FSM
171
        .oOperation( wOperation ),
172
        .oDestination( wDestination ),
173
        .oSource0( wSource0 ),
174
        .oSource1( wSource1  ),
175
 
176
        `ifdef DEBUG
177
        .iDebug_CurrentIP( oInstructionPointer1 ),
178
        .oDebug_CurrentIP( wDEBUG_IDU2_EXE_InstructionPointer ),
179
        `endif
180
 
181
        .oDataReadyForExe( wIDU2_EXE_DataReady )
182
 
183
 
184
 
185
 
186
 
187
);
188
 
189
 
190
ExecutionFSM     EXE
191
(
192
        .Clock( Clock ),
193
        .Reset( Reset | iTrigger ),  //New Sat Jun13
194
        .iDecodeDone( wIDU2_EXE_DataReady ),
195
        .iOperation( wOperation ),
196
        .iDestination( wDestination ),
197
        .iSource0( wSource0 ),
198
        .iSource1( wSource1 ) ,
199
 
200
 
201
        `ifdef DEBUG
202
                .iDebug_CurrentIP( wDEBUG_IDU2_EXE_InstructionPointer ),
203
                .iDebug_CoreID( iDebug_CoreID ),
204
        `endif
205
 
206
        //.iJumpResultFromALU( wALU2_EXE__BranchTaken ),
207
        .iBranchTaken( wALU2_EXE__BranchTaken ),
208
        .iBranchNotTaken( wALU2_IFU_BranchNotTaken ),
209
        .oJumpFlag( w2FIU__BranchTaken ),
210
        .oJumpIp( JumpIp ),
211
        .oRAMWriteEnable( oDataWriteEnable ),
212
        .oRAMWriteAddress( oDataWriteAddress ),
213
        .RAMBus( oDataBus ),
214
        .oBusy( wEXE2_IFU__EXEBusy ),
215
 
216
        .oExeLatchedValues( wEXE2_IDU_ExeLatchedValues ),
217
        .oLastDestination( wEXE2_IDU_DataFordward_LastDestination ),
218
 
219
        //ALU ports and control signals
220
        .oTriggerALU( wEXE2_ALU__TriggerALU ),
221
        .oALUOperation( ALU2Operation ),
222
        .oALUChannelX1( ALU2ChannelA ),
223
        .oALUChannelX2( ALU2ChannelB ),
224
        .oALUChannelY1( ALU2ChannelC ),
225
        .oALUChannelY2( ALU2ChannelD ),
226
        .oALUChannelZ1( ALU2ChannelE ),
227
        .oALUChannelZ2( ALU2ChannelF ),
228
        .iALUResultX( ALU2ResultA ),
229
        .iALUResultY( ALU2ResultB ),
230
        .iALUResultZ( ALU2ResultC ),
231
        .iALUOutputReady( ALU2OutputReady )
232
 
233
);
234
 
235
 
236
//--------------------------------------------------------
237
 
238
VectorALU ALU
239
(
240
        .Clock(Clock),
241
        .Reset(Reset),
242
        .iOperation( ALU2Operation ),
243
        .iChannel_Ax( ALU2ChannelA ),
244
        .iChannel_Bx( ALU2ChannelB ),
245
        .iChannel_Ay( ALU2ChannelC ),
246
        .iChannel_By( ALU2ChannelD ),
247
        .iChannel_Az( ALU2ChannelE ),
248
        .iChannel_Bz( ALU2ChannelF ),
249
        .oResultA( ALU2ResultA ),
250
        .oResultB( ALU2ResultB ),
251
        .oResultC( ALU2ResultC ),
252
        .oBranchTaken( wALU2_EXE__BranchTaken ),
253
        .oBranchNotTaken( wALU2_IFU_BranchNotTaken ),
254
        .oReturnFromSub( wALU2_IFU_ReturnFromSub ),
255
        .iInputReady( wEXE2_ALU__TriggerALU ),
256
 
257
        //***********
258
        .oOMEMWriteAddress(   oOMEMWriteAddress ),
259
        .oOMEMWriteData(      oOMEMWriteData    ),
260
        .oOMEM_WriteEnable(   oOMEMWriteEnable ),
261
 
262
        .oTMEMReadAddress(     oTMEMReadAddress ),
263
        .iTMEMReadData(        iTMEMReadData    ),
264
        .iTMEMDataAvailable(   iTMEMDataAvailable ),
265
        .oTMEMDataRequest(     oTMEMDataRequest   ),
266
        //***********
267
        .iCurrentIP( oInstructionPointer1 ),
268
        .OutputReady( ALU2OutputReady )
269
 
270
);
271
 
272
 
273
 
274
endmodule
275
//---------------------------------------------------------------------

powered by: WebSVN 2.1.0

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