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

Subversion Repositories theia_gpu

[/] [theia_gpu/] [branches/] [beta_2.0/] [rtl/] [Module_OperandModifiers.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
module ModfierQueue
25
(
26
input wire                              Clock,
27
input wire                              Reset,
28
input wire                              iKeep,
29
input wire                              iGranted,
30
input wire [3:0]                        iRs,
31
input wire [2:0]                        iScale,
32
output wire [2:0]                       oScale,
33
input wire[`ISSUE_SRCTAG_SIZE-1:0]      iTag,
34
input wire[`COMMIT_PACKET_SIZE-1:0]     iData,
35 230 diegovalve
output wire[`DATA_ROW_WIDTH-1:0]        oData,
36 213 diegovalve
output wire[3:0]                        oRsID,
37
input wire[3:0]                         iKey,
38
output wire                             oRequest,
39
output wire                             oBusy,
40
output wire[`ISSUE_SRCTAG_SIZE-1:0]     oTag
41
);
42
 
43
wire wMatch,wGranted;
44
 
45
PULSE P1
46
(
47
.Clock( Clock               ),
48
.Reset( Reset               ),
49
.Enable( 1'b1 ),
50
.D(iGranted),
51
.Q(wGranted)
52
);
53
UPCOUNTER_POSEDGE # (1) UPBUSY
54
(
55
.Clock( Clock               ),
56
.Reset( Reset               ),
57
.Initial( 1'b0              ),
58
.Enable( iKeep | wGranted   ),
59
.Q(     oBusy               )
60
);
61
 
62
UPCOUNTER_POSEDGE # (1) UPREQ
63
(
64
.Clock( Clock               ),
65
.Reset( Reset               ),
66
.Initial( 1'b0              ),
67
.Enable( wMatch | (wGranted & oRequest)  ),
68
.Q(     oRequest            )
69
);
70
 
71
 
72
assign wMatch = (iKey == oRsID && oBusy == 1'b1)? 1'b1 : 1'b0;
73
 
74
//20 DST, SWZZL 6 bits, SCALE 3 bits, SIGN 3 bits = 15
75
 
76
FFD_POSEDGE_SYNCRONOUS_RESET # ( `ISSUE_SRCTAG_SIZE ) FFD1
77
(       Clock, Reset, iKeep ,iTag  , oTag  );
78
 
79 230 diegovalve
FFD_POSEDGE_SYNCRONOUS_RESET # ( `DATA_ROW_WIDTH ) FFD2
80
(       Clock, Reset, wMatch ,iData[`DATA_ROW_WIDTH-1:0]  , oData  );
81 213 diegovalve
 
82
FFD_POSEDGE_SYNCRONOUS_RESET # ( 4 ) FFD3
83
(       Clock, Reset, iKeep ,iRs  , oRsID  );
84
 
85
FFD_POSEDGE_SYNCRONOUS_RESET # ( 3 ) FFD4
86
(       Clock, Reset, iKeep ,iScale  , oScale  );
87
 
88
endmodule
89
//-----------------------------------------------------------------------------------
90
 
91
module ModifierBlock
92
 (
93
        input wire                           Clock,
94
        input wire                           Reset,
95
        input wire [`ISSUE_SRCTAG_SIZE-1:0]  iTag,
96
        input wire [1:0]                     iScale,
97
        input wire [`DATA_ROW_WIDTH-1:0]      iData,
98
        output wire [`DATA_ROW_WIDTH-1:0]     oData
99
 );
100
 
101
 wire [`DATA_ROW_WIDTH-1:0] wSignedData;
102
 wire [`DATA_ROW_WIDTH-1:0] wScaledData;
103
 wire [`DATA_ROW_WIDTH-1:0] wSwizzledData;
104
 
105
`ifdef DISABLE_FEATURE_SIGN_CONTROL
106
        assign wSignedData = iData;
107
 
108
`else
109
        assign wSignedData[`X_RNG] = (iTag[`TAG_SIGNX]) ? -iData[`X_RNG] : iData[`X_RNG];
110
        assign wSignedData[`Y_RNG] = (iTag[`TAG_SIGNY]) ? -iData[`Y_RNG] : iData[`Y_RNG];
111
        assign wSignedData[`Z_RNG] = (iTag[`TAG_SIGNZ]) ? -iData[`Z_RNG] : iData[`Z_RNG];
112
 
113
`endif
114
 
115
`ifdef DISABLE_FEATURE_SCALE_CONTROL
116
 
117
        assign wScaledData = wSignedData;
118
 
119
 
120
`else
121
        wire signed [`WIDTH-1:0] wSignedData_X,wSignedData_Y,wSignedData_Z;
122
        wire [`DATA_ROW_WIDTH-1:0] wScaledData_Pre,wUnscaledData_Pre;
123
 
124
        assign wSignedData_X  = wSignedData[`X_RNG];
125
        assign wSignedData_Y  = wSignedData[`Y_RNG];
126
        assign wSignedData_Z  = wSignedData[`Z_RNG];
127
 
128
 
129
        assign wScaledData_Pre  = wSignedData;//{(wSignedData_X << `SCALE),(wSignedData_Y << `SCALE),(wSignedData_Z << `SCALE)};
130
        assign wUnscaledData_Pre = {(wSignedData_X >>> `SCALE),(wSignedData_Y >>> `SCALE),(wSignedData_Z >>> `SCALE)};
131
 
132
 
133
        assign wScaledData = (iScale[0]) ? ((iScale[1]) ? wUnscaledData_Pre : wScaledData_Pre ): wSignedData;
134
        /*
135
        MUXFULLPARALELL_3SEL_GENERIC # ( `DATA_ROW_WIDTH ) MUX_SCALE0
136
 (
137
 .Sel( iScale   ),
138
 .I1( wSignedData                ),
139
 .I2( wScaledData_Pre     ),
140
 .I3( wSignedData             ),
141
 .I4( wScaledData_Pre         ),
142
 .I5( wSignedData             ),
143
 .I6( wUnscaledData_Pre        ),
144
 .I7( wSignedData             ),
145
 .I8( wUnscaledData_Pre        ),
146
 .O1( wScaledData             )
147
 );
148
 */
149
 
150
`endif
151
 
152
`ifdef DISABLE_FEATURE_SWIZZLE_CONTROL
153
        assign wSwizzledData = wScaledData;
154
 
155
`else
156
MUXFULLPARALELL_3SEL_EN SWIZZLE0X
157
(
158
    .I1(wScaledData[`X_RNG]),
159
         .I2(wScaledData[`Z_RNG]),
160
         .I3(wScaledData[`Y_RNG]),
161
         .EN(1'b1),
162
    .SEL(iTag[`TAG_SWLX_RNG]),
163
    .O1(wSwizzledData[`X_RNG])
164
 );
165
 
166
MUXFULLPARALELL_3SEL_EN SWIZZLE0Y
167
(
168
    .I1(wScaledData[`Y_RNG]),
169
         .I2(wScaledData[`Z_RNG]),
170
         .I3(wScaledData[`X_RNG]),
171
         .EN(1'b1),
172
    .SEL(iTag[`TAG_SWLY_RNG]),
173
    .O1(wSwizzledData[`Y_RNG])
174
);
175
 
176
MUXFULLPARALELL_3SEL_EN SWIZZLE0Z
177
(
178
    .I1(wScaledData[`Z_RNG]),
179
         .I2(wScaledData[`Y_RNG]),
180
         .I3(wScaledData[`X_RNG]),
181
         .EN(1'b1),
182
    .SEL(iTag[`TAG_SWLZ_RNG]),
183
    .O1(wSwizzledData[`Z_RNG])
184
);
185
 
186
`endif
187
 
188
assign oData = wSwizzledData;
189
 
190
 endmodule
191
//-----------------------------------------------------------------------------------
192
module OperandModifiers
193
(
194
input wire Clock,
195
input wire Reset,
196
input wire [`ISSUE_PACKET_SIZE-1:0]                       iIssueBus,
197
input wire [`COMMIT_PACKET_SIZE-1:0]                      iCommitBus,
198
output wire [`MOD_ISSUE_PACKET_SIZE-1:0]                  oModIssue,
199
output wire [`MOD_COMMIT_PACKET_SIZE-1:0]                 oCommitBus
200
);
201
 
202
 
203
wire [`ISSUE_PACKET_SIZE-1:0]                    wIssueBus;
204
wire [2:0]                                       wStationRequest;
205
wire [2:0]                                       wStationGrant;
206
wire                                             wIssue;
207
wire [3:0]                                       wBusy;
208
wire [3:0]                                       wKeep;
209
wire                                             wFifoEmpty;
210
wire                                             wDependencySrc0,wDependencySrc1;
211
wire [`ISSUE_SRCTAG_SIZE-1:0]                    wInTag0,wInTag1,wInTag2,wInTag3;                //8+3+ISSUE_SRCTAG_SIZE(9) = 20
212
wire [`ISSUE_SRCTAG_SIZE-1:0]                    wOutTag0,wOutTag1,wOutTag2,wOutTag3;            //8+3+ISSUE_SRCTAG_SIZE(9) = 20
213
wire [`DATA_ROW_WIDTH-1:0]                   wData0,wData1,wData2,wData3;
214
wire [(`ISSUE_SRCTAG_SIZE+`DATA_ROW_WIDTH)-1:0]  wSrcA_Pre;
215
wire [4:0]                                       wRequest,wGranted;
216
wire [3:0]                                       wInRs0,wInRs1,wInRs2,wInRs3;
217
wire [3:0]                                       wOutRs0,wOutRs1,wOutRs2,wOutRs3,wOutRsCommit;
218
wire [2:0]                                       wOutScale0,wOutScale1,wOutScale2,wOutScale3,wSrcA_Scale;
219
wire [2:0]                                       wInScale0,wInScale1,wInScale2,wInScale3;
220
 
221
 
222
assign wIssueBus = iIssueBus;
223
 
224
//If at least 1 bit of the RSID is 1 then IIU is currently Issuing a packet
225
assign wIssue = (iIssueBus[`ISSUE_RSID_RNG]) ? 1'b1 : 1'b0;
226
 
227
assign wDependencySrc0 = (iIssueBus[`ISSUE_SRC0RS_RNG] != 0) ? 1 : 0;
228
assign wDependencySrc1 = (iIssueBus[`ISSUE_SRC1RS_RNG] != 0) ? 1 : 0;
229
 
230
assign wKeep[0] = wDependencySrc0 & ~wBusy[0] |
231
                                            wDependencySrc1 & ~wDependencySrc0 & ~wBusy[0] & wBusy[1];
232
 
233
assign wKeep[1] = wDependencySrc1 & ~wBusy[1] |
234
                                                 wDependencySrc0 & ~wDependencySrc0 & wBusy[0] & ~wBusy[1];
235
 
236
assign wKeep[2] = wDependencySrc0 & wBusy[0] & ~wBusy[2]; //|
237
                   //wDependencySrc1 & ~wDependencySrc0 & wBusy[0] & wBusy[1] & ~wBusy[2];
238
 
239
assign wKeep[3] = wDependencySrc1 &  wBusy[1] & ~wBusy[3];// |
240
                                                 //wDependencySrc0 & ~wDependencySrc1 & wBusy[0] & wBusy[1] & wBusy[2] & ~wBusy[3];
241
 
242
 
243
assign wInTag0 = ( wDependencySrc0 ) ? iIssueBus[`ISSUE_SRC0_TAG_RNG] : iIssueBus[`ISSUE_SRC1_TAG_RNG];
244
assign wInTag1 = ( wDependencySrc1 ) ? iIssueBus[`ISSUE_SRC1_TAG_RNG] : iIssueBus[`ISSUE_SRC0_TAG_RNG];
245
assign wInTag2 = ( wDependencySrc0 ) ? iIssueBus[`ISSUE_SRC0_TAG_RNG] : iIssueBus[`ISSUE_SRC1_TAG_RNG];
246
assign wInTag3 = ( wDependencySrc1 ) ? iIssueBus[`ISSUE_SRC1_TAG_RNG] : iIssueBus[`ISSUE_SRC0_TAG_RNG];
247
 
248
assign wInRs0 = ( wDependencySrc0 ) ? iIssueBus[`ISSUE_SRC0RS_RNG] : iIssueBus[`ISSUE_SRC1RS_RNG];
249
assign wInRs1 = ( wDependencySrc1 ) ? iIssueBus[`ISSUE_SRC1RS_RNG] : iIssueBus[`ISSUE_SRC0RS_RNG];
250
assign wInRs2 = ( wDependencySrc0 ) ? iIssueBus[`ISSUE_SRC0RS_RNG] : iIssueBus[`ISSUE_SRC1RS_RNG];
251
assign wInRs3 = ( wDependencySrc1 ) ? iIssueBus[`ISSUE_SRC1RS_RNG] : iIssueBus[`ISSUE_SRC0RS_RNG];
252
 
253
 
254
assign wInScale0 = ( wDependencySrc0 ) ? {iIssueBus[`ISSUE_SCALER],iIssueBus[`ISSUE_SCALE_OP],iIssueBus[`ISSUE_SCALE0]} : {iIssueBus[`ISSUE_SCALER],iIssueBus[`ISSUE_SCALE_OP],iIssueBus[`ISSUE_SCALE1]};
255
assign wInScale1 = ( wDependencySrc1 ) ? {iIssueBus[`ISSUE_SCALER],iIssueBus[`ISSUE_SCALE_OP],iIssueBus[`ISSUE_SCALE1]} : {iIssueBus[`ISSUE_SCALER],iIssueBus[`ISSUE_SCALE_OP],iIssueBus[`ISSUE_SCALE0]};
256
assign wInScale2 = ( wDependencySrc0 ) ? {iIssueBus[`ISSUE_SCALER],iIssueBus[`ISSUE_SCALE_OP],iIssueBus[`ISSUE_SCALE0]} : {iIssueBus[`ISSUE_SCALER],iIssueBus[`ISSUE_SCALE_OP],iIssueBus[`ISSUE_SCALE1]};
257
assign wInScale3 = ( wDependencySrc1 ) ? {iIssueBus[`ISSUE_SCALER],iIssueBus[`ISSUE_SCALE_OP],iIssueBus[`ISSUE_SCALE1]} : {iIssueBus[`ISSUE_SCALER],iIssueBus[`ISSUE_SCALE_OP],iIssueBus[`ISSUE_SCALE0]};
258
assign wRequest[0] = 1'b0;
259
ModfierQueue Q0
260
(
261 230 diegovalve
.Clock(     Clock                          ),
262
.Reset(     Reset                          ),
263
.iRs(       wInRs0                         ),
264
.oRsID(     wOutRs0                        ),
265
.iTag(      wInTag0                        ),
266
.iScale(    wInScale0                      ),
267
.oScale(    wOutScale0                     ),
268 213 diegovalve
.iKeep(     wKeep[0]                       ),
269 230 diegovalve
.iKey(      iCommitBus[`COMMIT_RSID_RNG]   ),
270 213 diegovalve
.iData(     iCommitBus                     ),
271
.oTag(      wOutTag0                       ),
272
.oData(     wData0                         ),
273
.oRequest(  wRequest[1]                    ),
274
.iGranted(  wGranted[1]                    ),
275
.oBusy(     wBusy[0]                       )
276
);
277
 
278
 
279
ModfierQueue Q1
280
(
281 230 diegovalve
.Clock(     Clock                          ),
282
.Reset(     Reset                          ),
283
.iRs(       wInRs1                         ),
284
.oRsID(     wOutRs1                        ),
285
.iTag(      wInTag1                        ),
286
.iScale(    wInScale1                      ),
287
.oScale(    wOutScale1                     ),
288 213 diegovalve
.iKeep(     wKeep[1]                       ),
289 230 diegovalve
.iKey(      iCommitBus[`COMMIT_RSID_RNG]   ),
290 213 diegovalve
.iData(     iCommitBus                     ),
291
.oTag(      wOutTag1                       ),
292
.oData(     wData1                         ),
293
.oRequest(  wRequest[2]                    ),
294
.iGranted(  wGranted[2]                    ),
295
.oBusy(     wBusy[1]                       )
296
);
297
 
298
 
299
ModfierQueue Q2
300
(
301 230 diegovalve
.Clock(     Clock                          ),
302
.Reset(     Reset                          ),
303
.iRs(       wInRs2                         ),
304
.iTag(      wInTag2                        ),
305
.iScale(    wInScale2                      ),
306
.oScale(    wOutScale2                     ),
307
.oRsID(     wOutRs2                        ),
308 213 diegovalve
.iKeep(     wKeep[2]                       ),
309 230 diegovalve
.iKey(      iCommitBus[`COMMIT_RSID_RNG]   ),
310 213 diegovalve
.iData(     iCommitBus                     ),
311
.oTag(      wOutTag2                       ),
312
.oData(     wData2                         ),
313
.oRequest(  wRequest[3]                    ),
314
.iGranted(  wGranted[3]                    ),
315
.oBusy(     wBusy[2]                       )
316
);
317
 
318
ModfierQueue Q3
319
(
320 230 diegovalve
.Clock(     Clock                          ),
321
.Reset(     Reset                          ),
322
.iRs(       wInRs3                         ),
323
.oRsID(     wOutRs3                        ),
324
.iTag(      wInTag3                        ),
325
.iScale(    wInScale3                      ),
326
.oScale(    wOutScale3                     ),
327 213 diegovalve
.iKeep(     wKeep[3]                       ),
328 230 diegovalve
.iKey(      iCommitBus[`COMMIT_RSID_RNG]   ),
329 213 diegovalve
.iData(     iCommitBus                     ),
330
.oTag(      wOutTag3                       ),
331
.oData(     wData3                         ),
332
.oRequest(  wRequest[4]                    ),
333
.iGranted(  wGranted[4]                    ),
334
.oBusy(     wBusy[3]                       )
335
);
336
 
337
 
338
ROUND_ROBIN_5_ENTRIES ARBXXX
339
(
340
.Clock(      Clock ),
341
.Reset(      Reset ),
342 230 diegovalve
.iRequest0(  wIssue ),
343 213 diegovalve
.iRequest1(  wRequest[1] & ~wIssue ),  //Issues from IIU have priority
344
.iRequest2(  wRequest[2] & ~wIssue ),  //Issues from IIU have priority
345
.iRequest3(  wRequest[3] & ~wIssue ),  //Issues from IIU have priority,
346
.iRequest4(  wRequest[4] & ~wIssue ),
347
 
348
.oPriorityGrant(    wGranted[0]   ),
349
.oGrant1(    wGranted[1]   ),
350
.oGrant2(    wGranted[2]   ),
351
.oGrant3(    wGranted[3]   ),
352
.oGrant4(    wGranted[4]   )
353
 
354
);
355
 
356
 
357
wire[3:0] wBusSelector;
358 230 diegovalve
DECODER_ONEHOT_2_BINARY # (.OUTPUT_WIDTH(4) )DECODER
359 213 diegovalve
(
360 230 diegovalve
.iIn( {2'b0,wGranted}      ),
361 213 diegovalve
.oOut( wBusSelector        )
362
);
363
 
364
MUXFULLPARALELL_3SEL_GENERIC # (`ISSUE_SRCTAG_SIZE + `DATA_ROW_WIDTH ) MUX
365
 (
366 230 diegovalve
 .Sel( wBusSelector[2:0]                                                     ),
367
 .I1(  {`ISSUE_SRCTAG_SIZE'b0,`DATA_ROW_WIDTH'b0}                            ),
368
 .I2(  {wIssueBus[`ISSUE_SRC0_TAG_RNG],wIssueBus[`ISSUE_SRC0_DATA_RNG]}      ),
369
 .I3(  {wOutTag0,wData0}                                                     ),
370
 .I4(  {wOutTag1,wData1}                                                     ),
371
 .I5(  {wOutTag2,wData2}                                                     ),
372
 .I6(  {wOutTag3,wData3}                                                     ),
373
 .O1( wSrcA_Pre                                                              )
374 213 diegovalve
 );
375
 
376
 MUXFULLPARALELL_3SEL_GENERIC # ( 4 ) MUX2
377
 (
378 230 diegovalve
 .Sel(wBusSelector[2:0] ),
379
 .I1(  4'b0             ),
380
 .I2(  4'b0             ),
381
 .I3(  wOutRs0          ),
382
 .I4(  wOutRs1          ),
383
 .I5(  wOutRs2          ),
384
 .I6(  wOutRs3          ),
385
 .O1(  wOutRsCommit     )
386 213 diegovalve
 );
387
 
388
 
389
 MUXFULLPARALELL_3SEL_GENERIC # ( 3 ) MUX3
390
 (
391 230 diegovalve
 .Sel( wBusSelector[2:0] ),
392
 .I1( 3'b0               ),
393
 .I2( 3'b0               ),
394
 .I3(  wOutScale0        ),
395
 .I4(  wOutScale1        ),
396
 .I5(  wOutScale2        ),
397
 .I6(  wOutScale3        ),
398
 .O1(  wSrcA_Scale       )
399 213 diegovalve
 );
400
 
401
 wire [`DATA_ROW_WIDTH-1:0] wModIssueSource0, wModIssueSource1;
402
 
403
 ModifierBlock MD1
404
 (
405
        .Clock( Clock                           ),
406
        .Reset( Reset                           ),
407
        .iScale( {wSrcA_Scale[1:0]}                    ),
408
        .iTag(  wSrcA_Pre[`ISSUE_SRC0_TAG_RNG]  ),
409
        .iData( wSrcA_Pre[`ISSUE_SRC0_DATA_RNG] ),
410
        .oData( wModIssueSource0                )
411
 );
412
 
413
 assign oCommitBus = {wSrcA_Scale,wSrcA_Pre[`ISSUE_SRC0_TAG_RNG],wOutRsCommit,oModIssue[`MOD_ISSUE_SRC0_DATA_RNG]};
414
 wire [3:0] wScale;
415
 assign wScale = wIssueBus[`ISSUE_SCALE_RNG];
416
 
417
 ModifierBlock MD2
418
 (
419
        .Clock( Clock                           ),
420
        .Reset( Reset                           ),
421
        .iScale(  {wScale[`SCALE_OP],wScale[`SCALE_SRC1_EN]}   ),
422
        .iTag(  wIssueBus[`ISSUE_SRC1_TAG_RNG]  ),
423
        .iData( wIssueBus[`ISSUE_SRC1_DATA_RNG] ),
424
        .oData( wModIssueSource1              )
425
 );
426
 
427
 assign oModIssue[`MOD_ISSUE_SRC1_DATA_RNG] = (wDependencySrc1) ? {`MOD_ISSUE_SRC_SIZE'b0,wInTag1} : wModIssueSource1;
428
 assign oModIssue[`MOD_ISSUE_SRC0_DATA_RNG] = (wDependencySrc0) ? {`MOD_ISSUE_SRC_SIZE'b0,wInTag0} : wModIssueSource0;
429
 
430
 assign oModIssue[`MOD_ISSUE_SRC0RS_RNG] = wIssueBus[`ISSUE_SRC0RS_RNG];
431
 assign oModIssue[`MOD_ISSUE_SRC1RS_RNG] = wIssueBus[`ISSUE_SRC1RS_RNG];
432
 assign oModIssue[`MOD_ISSUE_WE_RNG]     = wIssueBus[`ISSUE_WE_RNG];
433
 assign oModIssue[`MOD_ISSUE_SCALE_RNG]  = wIssueBus[`ISSUE_SCALE_RNG];
434
 assign oModIssue[`MOD_ISSUE_DST_RNG]    = wIssueBus[`ISSUE_DST_RNG];
435
 assign oModIssue[`MOD_ISSUE_RSID_RNG]   = wIssueBus[`ISSUE_RSID_RNG];
436
 
437
 endmodule
438
 //-----------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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