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

Subversion Repositories theia_gpu

[/] [theia_gpu/] [branches/] [beta_2.0/] [rtl/] [Unit_ControlProcessor.v] - Blame information for rev 230

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 213 diegovalve
`include "aDefinitions.v"
2
 
3
/**********************************************************************************
4
Theia, Ray Cast Programable graphic Processing Unit.
5
Copyright (C) 2012  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 230 diegovalve
 
25 213 diegovalve
`define CONTROL_PROCESSOR_ADDR_WIDTH          8
26
`define CONTROL_PROCESSOR_ISSUE_CMD_RNG       24:0
27
`define CONTROL_PROCESSOR_INSTRUCTION_WIDTH   32
28
 
29
`define CONTROL_PROCESSOR_INST_OP_RNG         31:24
30
`define CONTROL_PROCESSOR_INST_OP_DST_RNG     23:16
31
`define CONTROL_PROCESSOR_INST_OP_SRC1_RNG    15:8
32
`define CONTROL_PROCESSOR_INST_OP_SRC0_RNG    7:0
33
 
34
 
35
`define CONTROL_PROCESSOR_OP_NOP             `CONTROL_PROCESSOR_OP_WIDTH'd0
36
`define CONTROL_PROCESSOR_OP_DELIVER_COMMAND `CONTROL_PROCESSOR_OP_WIDTH'd1
37
`define CONTROL_PROCESSOR_OP_ADD             `CONTROL_PROCESSOR_OP_WIDTH'd2
38
`define CONTROL_PROCESSOR_OP_SUB             `CONTROL_PROCESSOR_OP_WIDTH'd3
39
`define CONTROL_PROCESSOR_OP_AND             `CONTROL_PROCESSOR_OP_WIDTH'd4
40
`define CONTROL_PROCESSOR_OP_OR              `CONTROL_PROCESSOR_OP_WIDTH'd5
41
`define CONTROL_PROCESSOR_OP_BRANCH          `CONTROL_PROCESSOR_OP_WIDTH'd6
42
`define CONTROL_PROCESSOR_OP_BEQ             `CONTROL_PROCESSOR_OP_WIDTH'd7
43
`define CONTROL_PROCESSOR_OP_BNE             `CONTROL_PROCESSOR_OP_WIDTH'd8
44
`define CONTROL_PROCESSOR_OP_BG              `CONTROL_PROCESSOR_OP_WIDTH'd9
45
`define CONTROL_PROCESSOR_OP_BL              `CONTROL_PROCESSOR_OP_WIDTH'd10
46
`define CONTROL_PROCESSOR_OP_BGE             `CONTROL_PROCESSOR_OP_WIDTH'd11
47
`define CONTROL_PROCESSOR_OP_BLE             `CONTROL_PROCESSOR_OP_WIDTH'd12
48
`define CONTROL_PROCESSOR_ASSIGN             `CONTROL_PROCESSOR_OP_WIDTH'd13
49
`define CONTROL_PROCESSOR_OP_COPYBLOCK       `CONTROL_PROCESSOR_OP_WIDTH'd14
50
`define CONTROL_PROCESSOR_OP_EXIT            `CONTROL_PROCESSOR_OP_WIDTH'd15
51
`define CONTROL_PROCESSOR_OP_NOT             `CONTROL_PROCESSOR_OP_WIDTH'd16
52
`define CONTROL_PROCESSOR_OP_SHL             `CONTROL_PROCESSOR_OP_WIDTH'd17
53
`define CONTROL_PROCESSOR_OP_SHR             `CONTROL_PROCESSOR_OP_WIDTH'd18
54
 
55
 
56
module ControlProcessor
57
(
58
input wire                              Clock,
59
input wire                              Reset,
60
output wire[`CBC_BUS_WIDTH-1:0]         oControlBus,
61
input wire                              iMCUFifoEmpty,
62
output reg [`MCU_REQUEST_SIZE-1:0]      oCopyBlockCommand
63
);
64
 
65
 
66
 
67
wire [`CONTROL_PROCESSOR_ADDR_WIDTH-1:0]                     wIP,wIP_temp;
68
reg                                                          rWriteEnable,rBranchTaken;
69
reg  [`CBC_BUS_WIDTH-1:0]                                    rIssueCommand;
70
wire [`CONTROL_PROCESSOR_INSTRUCTION_WIDTH-1:0]              wInstruction;
71
wire [`CONTROL_PROCESSOR_OP_WIDTH-1:0]                       wOperation;
72
reg  [`WIDTH-1:0]                                            rResult;
73
wire [`WIDTH-1:0]                                            wPrevResult;
74 230 diegovalve
wire [`CONTROL_PROCESSOR_ADDR_WIDTH-1:0]                     wSourceAddr0,wSourceAddr1,wDestination,wPrevDestination,wIPInitialValue;
75
wire [`WIDTH-1:0]                                            wSourceData0,wSourceData1,wImmediateValue;
76 213 diegovalve
 
77
 
78
assign oControlBus = rIssueCommand;
79
 
80
RAM_SINGLE_READ_PORT # (`CONTROL_PROCESSOR_INSTRUCTION_WIDTH, `CONTROL_PROCESSOR_ADDR_WIDTH, 256) InstructionRam
81
(
82
        .Clock(         Clock       ),
83
        .iWriteEnable(  1'b0        ),
84
        .iReadAddress0(     wIP     ),
85
        .oDataOut0( wInstruction    )
86
);
87
 
88
 
89
wire [`WIDTH-1:0]  wSourceData0_FromMem,wSourceData1_FromMem,wSourceData0_FromMem_Pre,wSourceData1_FromMem_Pre;
90
RAM_DUAL_READ_PORT # (`WIDTH,`CONTROL_PROCESSOR_ADDR_WIDTH) DataRam
91
(
92
        .Clock(         Clock        ),
93
        .iWriteEnable(  rWriteEnable ),
94
        .iReadAddress0( wInstruction[`CONTROL_PROCESSOR_INST_OP_SRC0_RNG] ),
95
        .iReadAddress1( wInstruction[`CONTROL_PROCESSOR_INST_OP_SRC1_RNG] ),
96
        .iWriteAddress( wDestination ),
97
        .iDataIn(       rResult      ),
98
        .oDataOut0(     wSourceData0_FromMem_Pre ),
99
        .oDataOut1(     wSourceData1_FromMem_Pre )
100
);
101
 
102
wire [`WIDTH-1:0]  wSprBlockDestination;
103
FFD_POSEDGE_SYNCRONOUS_RESET # (`WIDTH ) FFD_SPR_COREID
104
(
105
        .Clock(Clock),
106
        .Reset(Reset),
107
        .Enable(rWriteEnable && (wDestination == `CONTROL_PROCESSOR_REG_BLOCK_DST)),
108
        .D(rResult),
109
        .Q(wSprBlockDestination)
110
);
111
 
112
assign wSourceData0_FromMem  = (wSourceAddr0 == `CONTROL_PROCESSOR_REG_STATUS) ? { 30'b0,iMCUFifoEmpty} : wSourceData0_FromMem_Pre;
113
assign wSourceData1_FromMem  = (wSourceAddr1 == `CONTROL_PROCESSOR_REG_STATUS) ? { 30'b0,iMCUFifoEmpty} :wSourceData1_FromMem_Pre;
114
 
115
assign wSourceData0 = ( wSourceAddr0 == wPrevDestination ) ? wPrevResult : wSourceData0_FromMem ;
116
assign wSourceData1 = ( wSourceAddr1 == wPrevDestination) ? wPrevResult : wSourceData1_FromMem ;
117
 
118
assign wIPInitialValue = (Reset) ? `CONTROL_PROCESSOR_ADDR_WIDTH'b0 : wDestination;
119
UPCOUNTER_POSEDGE # (`CONTROL_PROCESSOR_ADDR_WIDTH) IP
120
(
121
.Clock(   Clock                ),
122
.Reset(   Reset | rBranchTaken ),
123 230 diegovalve
.Initial( wIPInitialValue + `CONTROL_PROCESSOR_ADDR_WIDTH'd1  ),
124 213 diegovalve
.Enable(  1'b1                 ),
125
.Q(       wIP_temp             )
126
);
127
assign wIP = (rBranchTaken) ? wIPInitialValue : wIP_temp;
128
 
129
 
130
 
131
FFD_POSEDGE_SYNCRONOUS_RESET # ( `CONTROL_PROCESSOR_OP_WIDTH ) FFD1
132
(
133
        .Clock(Clock),
134
        .Reset(Reset),
135
        .Enable(1'b1),
136
        .D(wInstruction[`CONTROL_PROCESSOR_INST_OP_RNG]),
137
        .Q(wOperation)
138
);
139
 
140
FFD_POSEDGE_SYNCRONOUS_RESET # ( `WIDTH ) FFD2
141
(
142
        .Clock(Clock),
143
        .Reset(Reset),
144
        .Enable(1'b1),
145
        .D(rResult),
146
        .Q(wPrevResult)
147
);
148
 
149
FFD_POSEDGE_SYNCRONOUS_RESET # ( `CONTROL_PROCESSOR_ADDR_WIDTH ) FFD255
150
(
151
        .Clock(Clock),
152
        .Reset(Reset),
153
        .Enable(1'b1),
154
        .D(wInstruction[`CONTROL_PROCESSOR_INST_OP_SRC0_RNG]),
155
        .Q(wSourceAddr0)
156
);
157
 
158
FFD_POSEDGE_SYNCRONOUS_RESET # ( `CONTROL_PROCESSOR_ADDR_WIDTH ) FFD3
159
(
160
        .Clock(Clock),
161
        .Reset(Reset),
162
        .Enable(1'b1),
163
        .D(wInstruction[`CONTROL_PROCESSOR_INST_OP_SRC1_RNG]),
164
        .Q(wSourceAddr1)
165
);
166
 
167
FFD_POSEDGE_SYNCRONOUS_RESET # ( `CONTROL_PROCESSOR_ADDR_WIDTH ) FFD4
168
(
169
        .Clock(Clock),
170
        .Reset(Reset),
171
        .Enable(1'b1),
172
        .D(wInstruction[`CONTROL_PROCESSOR_INST_OP_DST_RNG]),
173
        .Q(wDestination)
174
);
175
 
176
FFD_POSEDGE_SYNCRONOUS_RESET # ( `CONTROL_PROCESSOR_ADDR_WIDTH ) FFD44
177
(
178
        .Clock(Clock),
179
        .Reset(Reset),
180
        .Enable(1'b1),
181
        .D(wDestination),
182
        .Q(wPrevDestination)
183
);
184
 
185
 
186
assign wImmediateValue = {wSourceAddr1,wSourceAddr0};
187
 
188
 
189
 
190
always @ ( * )
191
begin
192
        case (wOperation)
193
        //-------------------------------------
194
        `CONTROL_PROCESSOR_OP_COPYBLOCK:
195
        begin
196
 
197
                rIssueCommand = `CBC_BUS_WIDTH'b0;
198
                oCopyBlockCommand =
199
                {wSprBlockDestination[15:0],wSourceData1,wSourceData0[`MCU_COPYMEMBLOCK_TAG_BIT],wSourceData0[`MCU_COPYMEMBLOCKCMD_BLKLEN_RNG],wSourceData0[`MCU_COPYMEMBLOCKCMD_DSTOFF_RNG]};
200
                rWriteEnable = 1'b0;
201
                rResult      = 0;
202
                rBranchTaken = 1'b0;
203
 
204
        end
205
        //-------------------------------------
206
        `CONTROL_PROCESSOR_OP_DELIVER_COMMAND:
207
        begin
208
           oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
209
           rIssueCommand = {wDestination[7:0],wSourceData1[7:0],wSourceData0[15:0]};
210
                rWriteEnable = 1'b0;
211
                rResult      = 0;
212
                rBranchTaken = 1'b0;
213
        end
214
        //-------------------------------------
215
        `CONTROL_PROCESSOR_OP_NOP:
216
        begin
217
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
218
           rIssueCommand = `CBC_BUS_WIDTH'b0;
219
                rBranchTaken = 1'b0;
220
                rWriteEnable = 1'b0;
221
                rResult      = 0;
222
        end
223
        //-------------------------------------
224
        `CONTROL_PROCESSOR_OP_ADD:
225
        begin
226
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
227
                rIssueCommand = `CBC_BUS_WIDTH'b0;
228
                rBranchTaken = 1'b0;
229
                rWriteEnable = 1'b1;
230
                rResult      = wSourceData1 + wSourceData0;
231
        end
232
        //-------------------------------------
233
        `CONTROL_PROCESSOR_OP_SUB:
234
        begin
235
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
236
                rIssueCommand = `CBC_BUS_WIDTH'b0;
237
                rBranchTaken = 1'b0;
238
                rWriteEnable = 1'b1;
239
                rResult      = wSourceData1 - wSourceData0;
240
        end
241
        //-------------------------------------
242
        `CONTROL_PROCESSOR_OP_AND:
243
        begin
244
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
245
                rIssueCommand = `CBC_BUS_WIDTH'b0;
246
                rBranchTaken = 1'b0;
247
                rWriteEnable = 1'b1;
248
                rResult      = wSourceData1 & wSourceData0;
249
        end
250
        //-------------------------------------
251
        `CONTROL_PROCESSOR_OP_SHL:
252
        begin
253
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
254
                rIssueCommand = `CBC_BUS_WIDTH'b0;
255
                rBranchTaken = 1'b0;
256
                rWriteEnable = 1'b1;
257
                rResult      = wSourceData1 << wSourceData0;
258
        end
259
        //-------------------------------------
260
        `CONTROL_PROCESSOR_OP_SHR:
261
        begin
262
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
263
                rIssueCommand = `CBC_BUS_WIDTH'b0;
264
                rBranchTaken = 1'b0;
265
                rWriteEnable = 1'b1;
266
                rResult      = wSourceData1 >> wSourceData0;
267
        end
268
        //-------------------------------------
269
        `CONTROL_PROCESSOR_OP_OR:
270
        begin
271
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
272
                rIssueCommand = `CBC_BUS_WIDTH'b0;
273
                rBranchTaken = 1'b0;
274
                rWriteEnable = 1'b1;
275
                rResult      = wSourceData1 | wSourceData0;
276
        end
277
        //-------------------------------------
278
        `CONTROL_PROCESSOR_OP_BLE:
279
        begin
280
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
281
                rIssueCommand = `CBC_BUS_WIDTH'b0;
282
                rWriteEnable = 1'b0;
283
                rResult      = 0;
284
                if (wSourceData1 <= wSourceData0 )
285
                        rBranchTaken = 1'b1;
286
                else
287
                        rBranchTaken = 1'b0;
288
 
289
        end
290
        //-------------------------------------
291
        `CONTROL_PROCESSOR_OP_BL:
292
        begin
293
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
294
                rIssueCommand = `CBC_BUS_WIDTH'b0;
295
                rWriteEnable = 1'b0;
296
                rResult      = 0;
297
                if (wSourceData1 < wSourceData0 )
298
                        rBranchTaken = 1'b1;
299
                else
300
                        rBranchTaken = 1'b0;
301
 
302
        end
303
        //-------------------------------------
304
        `CONTROL_PROCESSOR_OP_BG:
305
        begin
306
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
307
                rIssueCommand = `CBC_BUS_WIDTH'b0;
308
                rWriteEnable = 1'b0;
309
                rResult      = 0;
310
                if (wSourceData1 > wSourceData0 )
311
                        rBranchTaken = 1'b1;
312
                else
313
                        rBranchTaken = 1'b0;
314
 
315
        end
316
        //-------------------------------------
317
        `CONTROL_PROCESSOR_OP_BGE:
318
        begin
319
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
320
                rIssueCommand = `CBC_BUS_WIDTH'b0;
321
                rWriteEnable = 1'b0;
322
                rResult      = 0;
323
                if (wSourceData1 >= wSourceData0 )
324
                        rBranchTaken = 1'b1;
325
                else
326
                        rBranchTaken = 1'b0;
327
 
328
        end
329
        //-------------------------------------
330
        `CONTROL_PROCESSOR_OP_BEQ:
331
        begin
332
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
333
                rIssueCommand = `CBC_BUS_WIDTH'b0;
334
                rWriteEnable = 1'b0;
335
                rResult      = 0;
336
                if (wSourceData1 == wSourceData0 )
337
                        rBranchTaken = 1'b1;
338
                else
339
                        rBranchTaken = 1'b0;
340
 
341
        end
342
        //-------------------------------------
343
        `CONTROL_PROCESSOR_OP_BNE:
344
        begin
345
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
346
                rIssueCommand = `CBC_BUS_WIDTH'b0;
347
                rWriteEnable = 1'b0;
348
                rResult      = 0;
349
                if (wSourceData1 != wSourceData0 )
350
                        rBranchTaken = 1'b1;
351
                else
352
                        rBranchTaken = 1'b0;
353
 
354
        end
355
        //------------------------------------- 
356
        `CONTROL_PROCESSOR_OP_BRANCH:
357
        begin
358
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
359
                rIssueCommand = `CBC_BUS_WIDTH'b0;
360
                rWriteEnable = 1'b0;
361
                rResult      = 0;
362
                rBranchTaken = 1'b1;
363
        end
364
        //-------------------------------------
365
        `CONTROL_PROCESSOR_ASSIGN:
366
        begin
367
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
368
                rIssueCommand = `CBC_BUS_WIDTH'b0;
369
                rWriteEnable = 1'b1;
370
                rResult      = wImmediateValue;
371
                rBranchTaken = 1'b0;
372
 
373
        end
374
        //-------------------------------------
375
        default:
376
        begin
377
                oCopyBlockCommand = `MCU_REQUEST_SIZE'b0;
378
           rIssueCommand = `CBC_BUS_WIDTH'b0;
379
                rWriteEnable = 1'b0;
380
                rResult      = 0;
381
                rBranchTaken = 1'b0;
382
        end
383
        //------------------------------------- 
384
        endcase
385
end
386
 
387
 
388
 
389
 
390
 
391
endmodule

powered by: WebSVN 2.1.0

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