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

Subversion Repositories dbg_interface

[/] [dbg_interface/] [trunk/] [rtl/] [verilog/] [dbg_cpu.v] - Blame information for rev 121

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

Line No. Rev Author Line
1 100 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  dbg_cpu.v                                                   ////
4
////                                                              ////
5
////                                                              ////
6
////  This file is part of the SoC/OpenRISC Development Interface ////
7
////  http://www.opencores.org/projects/DebugInterface/           ////
8
////                                                              ////
9
////  Author(s):                                                  ////
10
////       Igor Mohor (igorm@opencores.org)                       ////
11
////                                                              ////
12
////                                                              ////
13
////  All additional information is avaliable in the README.txt   ////
14
////  file.                                                       ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18
//// Copyright (C) 2000 - 2004 Authors                            ////
19
////                                                              ////
20
//// This source file may be used and distributed without         ////
21
//// restriction provided that this copyright statement is not    ////
22
//// removed from the file and that any derivative work contains  ////
23
//// the original copyright notice and the associated disclaimer. ////
24
////                                                              ////
25
//// This source file is free software; you can redistribute it   ////
26
//// and/or modify it under the terms of the GNU Lesser General   ////
27
//// Public License as published by the Free Software Foundation; ////
28
//// either version 2.1 of the License, or (at your option) any   ////
29
//// later version.                                               ////
30
////                                                              ////
31
//// This source is distributed in the hope that it will be       ////
32
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
33
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
34
//// PURPOSE.  See the GNU Lesser General Public License for more ////
35
//// details.                                                     ////
36
////                                                              ////
37
//// You should have received a copy of the GNU Lesser General    ////
38
//// Public License along with this source; if not, download it   ////
39
//// from http://www.opencores.org/lgpl.shtml                     ////
40
////                                                              ////
41
//////////////////////////////////////////////////////////////////////
42
//
43
// CVS Revision History
44
//
45
// $Log: not supported by cvs2svn $
46 121 mohor
// Revision 1.5  2004/01/19 07:32:41  simons
47
// Reset values width added because of FV, a good sentence changed because some tools can not handle it.
48
//
49 108 simons
// Revision 1.4  2004/01/17 18:38:11  mohor
50
// cpu_tall_o is set with cpu_stb_o or register.
51
//
52 104 mohor
// Revision 1.3  2004/01/17 18:01:24  mohor
53
// New version.
54
//
55 102 mohor
// Revision 1.2  2004/01/17 17:01:14  mohor
56
// Almost finished.
57
//
58 101 mohor
// Revision 1.1  2004/01/16 14:53:31  mohor
59
// *** empty log message ***
60 100 mohor
//
61
//
62 101 mohor
//
63 100 mohor
 
64
// synopsys translate_off
65
`include "timescale.v"
66
// synopsys translate_on
67
`include "dbg_cpu_defines.v"
68
 
69
// Top module
70
module dbg_cpu(
71
                // JTAG signals
72
                tck_i,
73
                tdi_i,
74
                tdo_o,
75
 
76
                // TAP states
77
                shift_dr_i,
78
                pause_dr_i,
79
                update_dr_i,
80
 
81
                cpu_ce_i,
82
                crc_match_i,
83
                crc_en_o,
84
                shift_crc_o,
85
                rst_i,
86
 
87 101 mohor
                // CPU signals
88
                cpu_clk_i,
89
                cpu_addr_o,
90
                cpu_data_i,
91
                cpu_data_o,
92
                cpu_bp_i,
93
                cpu_stall_o,
94
                cpu_stall_all_o,
95
                cpu_stb_o,
96
                cpu_sel_o,          // Not synchronized
97
                cpu_we_o,
98
                cpu_ack_i,
99
                cpu_rst_o
100 100 mohor
 
101 101 mohor
 
102 100 mohor
              );
103
 
104
// JTAG signals
105
input         tck_i;
106
input         tdi_i;
107
output        tdo_o;
108
 
109
// TAP states
110
input         shift_dr_i;
111
input         pause_dr_i;
112
input         update_dr_i;
113
 
114
input         cpu_ce_i;
115
input         crc_match_i;
116
output        crc_en_o;
117
output        shift_crc_o;
118
input         rst_i;
119 101 mohor
 
120
 
121
// CPU signals
122
input         cpu_clk_i;
123
output [31:0] cpu_addr_o;
124
input  [31:0] cpu_data_i;
125
output [31:0] cpu_data_o;
126
input         cpu_bp_i;
127
output        cpu_stall_o;
128
output        cpu_stall_all_o;
129
output        cpu_stb_o;
130
output [`CPU_NUM -1:0]  cpu_sel_o;
131
output        cpu_we_o;
132
input         cpu_ack_i;
133
output        cpu_rst_o;
134
 
135
 
136 100 mohor
 
137
reg           tdo_o;
138
 
139
wire          cmd_cnt_en;
140
reg     [1:0] cmd_cnt;
141
wire          cmd_cnt_end;
142
reg           cmd_cnt_end_q;
143
wire          addr_cnt_en;
144
reg     [5:0] addr_cnt;
145
reg     [5:0] addr_cnt_limit;
146
wire          addr_cnt_end;
147
wire          crc_cnt_en;
148
reg     [5:0] crc_cnt;
149
wire          crc_cnt_end;
150
reg           crc_cnt_end_q;
151
wire          data_cnt_en;
152
reg     [5:0] data_cnt;
153
reg     [5:0] data_cnt_limit;
154
wire          data_cnt_end;
155
reg           data_cnt_end_q;
156
wire          status_cnt_end;
157
reg           status_cnt1, status_cnt2, status_cnt3, status_cnt4;
158
reg     [3:0] status;
159
 
160 102 mohor
reg           crc_match_reg;
161 100 mohor
wire          enable;
162
 
163
reg           read_cycle_reg;
164 101 mohor
reg           read_cycle_reg_q;
165 100 mohor
reg           read_cycle_cpu;
166 101 mohor
reg           read_cycle_cpu_q;
167 100 mohor
reg           write_cycle_reg;
168
reg           write_cycle_cpu;
169
wire          read_cycle;
170
wire          write_cycle;
171
 
172 121 mohor
reg    [31:0] dr;
173 101 mohor
wire    [7:0] reg_data_out;
174 100 mohor
 
175
wire          dr_read_reg;
176
wire          dr_write_reg;
177
wire          dr_read_cpu8;
178
wire          dr_read_cpu32;
179
wire          dr_write_cpu8;
180
wire          dr_write_cpu32;
181
wire          dr_go;
182
 
183
reg           dr_read_reg_latched;
184
reg           dr_write_reg_latched;
185
reg           dr_read_cpu8_latched;
186
reg           dr_read_cpu32_latched;
187
reg           dr_write_cpu8_latched;
188
reg           dr_write_cpu32_latched;
189
reg           dr_go_latched;
190
 
191
reg           cmd_read_reg;
192
reg           cmd_read_cpu;
193
reg           cmd_write_reg;
194
reg           cmd_write_cpu;
195 101 mohor
reg           cycle_32_bit;
196
reg           reg_access;
197 100 mohor
 
198 104 mohor
reg    [31:0] adr;
199
reg           cpu_ack_sync;
200
reg           cpu_ack_tck;
201
reg           cpu_ack_tck_q;
202
reg           cpu_stb;
203
reg           cpu_stb_sync;
204
reg           cpu_stb_o;
205
wire          cpu_stall_tmp;
206 101 mohor
 
207 100 mohor
wire          go_prelim;
208
wire          crc_cnt_31;
209
 
210
 
211 101 mohor
 
212 100 mohor
assign enable = cpu_ce_i & shift_dr_i;
213
assign crc_en_o = enable & crc_cnt_end & (~status_cnt_end);
214
assign shift_crc_o = enable & status_cnt_end;  // Signals dbg module to shift out the CRC
215
 
216
 
217
assign cmd_cnt_en = enable & (~cmd_cnt_end);
218
 
219
 
220
// Command counter
221
always @ (posedge tck_i or posedge rst_i)
222
begin
223
  if (rst_i)
224 108 simons
    cmd_cnt <= #1 2'h0;
225 100 mohor
  else if (update_dr_i)
226 108 simons
    cmd_cnt <= #1 2'h0;
227 100 mohor
  else if (cmd_cnt_en)
228
    cmd_cnt <= #1 cmd_cnt + 1'b1;
229
end
230
 
231
 
232
assign addr_cnt_en = enable & cmd_cnt_end & (~addr_cnt_end);
233
 
234
 
235
// Address/length counter
236
always @ (posedge tck_i or posedge rst_i)
237
begin
238
  if (rst_i)
239 108 simons
    addr_cnt <= #1 6'h0;
240 100 mohor
  else if (update_dr_i)
241 108 simons
    addr_cnt <= #1 6'h0;
242 100 mohor
  else if (addr_cnt_en)
243
    addr_cnt <= #1 addr_cnt + 1'b1;
244
end
245
 
246
 
247
assign data_cnt_en = enable & (~data_cnt_end) & (cmd_cnt_end & write_cycle | crc_cnt_end & read_cycle);
248
 
249
 
250
// Data counter
251
always @ (posedge tck_i or posedge rst_i)
252
begin
253
  if (rst_i)
254 108 simons
    data_cnt <= #1 6'h0;
255 100 mohor
  else if (update_dr_i)
256 108 simons
    data_cnt <= #1 6'h0;
257 100 mohor
  else if (data_cnt_en)
258
    data_cnt <= #1 data_cnt + 1'b1;
259
end
260
 
261
 
262
assign crc_cnt_en = enable & (~crc_cnt_end) & (cmd_cnt_end & addr_cnt_end  & (~write_cycle) | (data_cnt_end & write_cycle));
263
 
264
 
265
// crc counter
266
always @ (posedge tck_i or posedge rst_i)
267
begin
268
  if (rst_i)
269 108 simons
    crc_cnt <= #1 6'h0;
270 100 mohor
  else if(crc_cnt_en)
271
    crc_cnt <= #1 crc_cnt + 1'b1;
272
  else if (update_dr_i)
273 108 simons
    crc_cnt <= #1 6'h0;
274 100 mohor
end
275
 
276
 
277
// Upper limit. Address/length counter counts until this value is reached
278
always @ (posedge tck_i)
279
begin
280
  if (cmd_cnt == 2'h2)
281
    begin
282
      if ((~dr[0])  & (~tdi_i))                                   // (current command is WB_STATUS or WB_GO)
283
        addr_cnt_limit = 6'd0;
284
      else                                                        // (current command is WB_WRITEx or WB_READx)
285
        addr_cnt_limit = 6'd32;
286
    end
287
end
288
 
289
 
290
assign cmd_cnt_end  = cmd_cnt  == 2'h3;
291
assign addr_cnt_end = addr_cnt == addr_cnt_limit;
292
assign crc_cnt_end  = crc_cnt  == 6'd32;
293
assign crc_cnt_31 = crc_cnt  == 6'd31;
294
assign data_cnt_end = (data_cnt == data_cnt_limit);
295
 
296
always @ (posedge tck_i)
297
begin
298
  crc_cnt_end_q  <= #1 crc_cnt_end;
299
  cmd_cnt_end_q  <= #1 cmd_cnt_end;
300
  data_cnt_end_q <= #1 data_cnt_end;
301
end
302
 
303
 
304
// Status counter is made of 4 serialy connected registers
305
always @ (posedge tck_i or posedge rst_i)
306
begin
307
  if (rst_i)
308
    status_cnt1 <= #1 1'b0;
309
  else if (update_dr_i)
310
    status_cnt1 <= #1 1'b0;
311
  else if (data_cnt_end & read_cycle |
312
           crc_cnt_end & (~read_cycle)
313
          )
314
    status_cnt1 <= #1 1'b1;
315
end
316
 
317
 
318
always @ (posedge tck_i or posedge rst_i)
319
begin
320
  if (rst_i)
321
    begin
322
      status_cnt2 <= #1 1'b0;
323
      status_cnt3 <= #1 1'b0;
324
      status_cnt4 <= #1 1'b0;
325
    end
326
  else if (update_dr_i)
327
    begin
328
      status_cnt2 <= #1 1'b0;
329
      status_cnt3 <= #1 1'b0;
330
      status_cnt4 <= #1 1'b0;
331
    end
332
  else
333
    begin
334
      status_cnt2 <= #1 status_cnt1;
335
      status_cnt3 <= #1 status_cnt2;
336
      status_cnt4 <= #1 status_cnt3;
337
    end
338
end
339
 
340
 
341
assign status_cnt_end = status_cnt4;
342
 
343
 
344
 
345
 
346
// Latching address
347 121 mohor
always @ (posedge tck_i or posedge rst_i)
348 100 mohor
begin
349 121 mohor
  if (rst_i)
350
    adr <= #1 32'h0;
351
  else if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i & (~dr_go_latched))
352
    adr <= #1 dr[31:0];
353 100 mohor
end
354
 
355
 
356 101 mohor
assign cpu_addr_o = adr;
357 100 mohor
 
358 101 mohor
 
359 100 mohor
// Shift register for shifting in and out the data
360 121 mohor
always @ (posedge tck_i or posedge rst_i)
361 100 mohor
begin
362 121 mohor
  if (rst_i)
363
    dr <= #1 32'h0;
364
  else if (reg_access)
365
    dr[31:24] <= #1 reg_data_out;
366 101 mohor
  else if (cpu_ack_tck & (~cpu_ack_tck_q) & read_cycle_cpu)
367
    begin
368
      if (cycle_32_bit)
369
        dr[31:0] <= #1 cpu_data_i;
370
      else
371
        dr[31:24] <= #1 cpu_data_i[7:0];
372
    end
373
  else if (enable & ((~addr_cnt_end) | (~cmd_cnt_end) | ((~data_cnt_end) & write_cycle) | (crc_cnt_end & (~data_cnt_end) & read_cycle)))
374
    begin
375 121 mohor
      dr <= #1 {dr[30:0], tdi_i};
376 100 mohor
    end
377
end
378
 
379
 
380
assign dr_read_reg    = dr[2:0] == `CPU_READ_REG;
381
assign dr_write_reg   = dr[2:0] == `CPU_WRITE_REG;
382
assign dr_read_cpu8   = dr[2:0] == `CPU_READ8;
383
assign dr_read_cpu32  = dr[2:0] == `CPU_READ32;
384
assign dr_write_cpu8  = dr[2:0] == `CPU_WRITE8;
385
assign dr_write_cpu32 = dr[2:0] == `CPU_WRITE32;
386
assign dr_go          = dr[2:0] == `CPU_GO;
387
 
388
 
389
// Latching instruction
390
always @ (posedge tck_i)
391
begin
392
  if (update_dr_i)
393
    begin
394
      dr_read_reg_latched  <= #1 1'b0;
395
      dr_read_cpu8_latched  <= #1 1'b0;
396
      dr_read_cpu32_latched  <= #1 1'b0;
397
      dr_write_reg_latched  <= #1 1'b0;
398
      dr_write_cpu8_latched  <= #1 1'b0;
399
      dr_write_cpu32_latched  <= #1 1'b0;
400
      dr_go_latched  <= #1 1'b0;
401
    end
402
  else if (cmd_cnt_end & (~cmd_cnt_end_q))
403
    begin
404
      dr_read_reg_latched <= #1 dr_read_reg;
405
      dr_read_cpu8_latched <= #1 dr_read_cpu8;
406
      dr_read_cpu32_latched <= #1 dr_read_cpu32;
407
      dr_write_reg_latched <= #1 dr_write_reg;
408
      dr_write_cpu8_latched <= #1 dr_write_cpu8;
409
      dr_write_cpu32_latched <= #1 dr_write_cpu32;
410
      dr_go_latched <= #1 dr_go;
411
    end
412
end
413
 
414
// Latching instruction
415
always @ (posedge tck_i or posedge rst_i)
416
begin
417
  if (rst_i)
418
    begin
419
      cmd_read_reg    <= #1 1'b0;
420
      cmd_read_cpu    <= #1 1'b0;
421
      cmd_write_reg   <= #1 1'b0;
422 101 mohor
      cmd_write_cpu   <= #1 1'b0;
423
      cycle_32_bit    <= #1 1'b0;
424 100 mohor
    end
425
  else if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i)
426
    begin
427
      cmd_read_reg    <= #1 dr_read_reg_latched;
428
      cmd_read_cpu    <= #1 dr_read_cpu8_latched | dr_read_cpu32_latched;
429
      cmd_write_reg   <= #1 dr_write_reg_latched;
430
      cmd_write_cpu   <= #1 dr_write_cpu8_latched | dr_write_cpu32_latched;
431 101 mohor
      cycle_32_bit    <= #1 dr_read_cpu32_latched | dr_write_cpu32_latched;
432 100 mohor
    end
433
end
434
 
435
 
436
// Upper limit. Data counter counts until this value is reached.
437
always @ (posedge tck_i or posedge rst_i)
438
begin
439
  if (rst_i)
440
    data_cnt_limit <= #1 6'h0;
441 101 mohor
  else if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i & (~dr_go_latched))
442 100 mohor
    begin
443
      if (dr_read_cpu32_latched | dr_write_cpu32_latched)
444
        data_cnt_limit <= #1 6'd32;
445
      else
446
        data_cnt_limit <= #1 6'd8;
447
    end
448
end
449
 
450
 
451
assign go_prelim = (cmd_cnt == 2'h2) & dr[1] & (~dr[0]) & (~tdi_i);
452
 
453
 
454
always @ (posedge tck_i)
455
begin
456
  if (update_dr_i)
457
    read_cycle_reg <= #1 1'b0;
458
  else if (cmd_read_reg & go_prelim)
459
    read_cycle_reg <= #1 1'b1;
460
end
461
 
462
 
463
always @ (posedge tck_i)
464
begin
465
  if (update_dr_i)
466
    read_cycle_cpu <= #1 1'b0;
467
  else if (cmd_read_cpu & go_prelim)
468
    read_cycle_cpu <= #1 1'b1;
469
end
470
 
471
 
472
always @ (posedge tck_i)
473
begin
474 101 mohor
  read_cycle_reg_q <= #1 read_cycle_reg;
475
  read_cycle_cpu_q <= #1 read_cycle_cpu;
476
end
477
 
478
 
479
always @ (posedge tck_i)
480
begin
481 100 mohor
  if (update_dr_i)
482
    write_cycle_reg <= #1 1'b0;
483
  else if (cmd_write_reg & go_prelim)
484
    write_cycle_reg <= #1 1'b1;
485
end
486
 
487
 
488 121 mohor
always @ (posedge tck_i or posedge rst_i)
489 100 mohor
begin
490 121 mohor
  if (rst_i)
491 100 mohor
    write_cycle_cpu <= #1 1'b0;
492 121 mohor
  else if (update_dr_i)
493
    write_cycle_cpu <= #1 1'b0;
494 100 mohor
  else if (cmd_write_cpu & go_prelim)
495
    write_cycle_cpu <= #1 1'b1;
496
end
497
 
498
 
499
assign read_cycle = read_cycle_reg | read_cycle_cpu;
500
assign write_cycle = write_cycle_reg | write_cycle_cpu;
501
 
502
 
503 101 mohor
 
504
// Start register access cycle
505 100 mohor
always @ (posedge tck_i)
506
begin
507 101 mohor
  if (write_cycle_reg & data_cnt_end & (~data_cnt_end_q) | read_cycle_reg & (~read_cycle_reg_q))
508 100 mohor
    begin
509
      reg_access <= #1 1'b1;
510
    end
511
  else
512
    reg_access <= #1 1'b0;
513
end
514
 
515
 
516
 
517
// Connecting dbg_cpu_registers
518
dbg_cpu_registers i_dbg_cpu_registers
519
     (
520 101 mohor
      .data_i           (dr[7:0]),
521
      .data_o           (reg_data_out),
522
      .addr_i           (adr[1:0]),
523
      .we_i             (write_cycle_reg),
524
      .en_i             (reg_access),
525
      .clk_i            (tck_i),
526
      .bp_i             (cpu_bp_i),
527
      .rst_i            (rst_i),
528
      .cpu_clk_i        (cpu_clk_i),
529 104 mohor
      .cpu_stall_o      (cpu_stall_tmp),
530 101 mohor
      .cpu_stall_all_o  (cpu_stall_all_o),
531
      .cpu_sel_o        (cpu_sel_o),
532
      .cpu_rst_o        (cpu_rst_o)
533 100 mohor
     );
534
 
535
 
536
 
537 101 mohor
assign cpu_we_o   = write_cycle_cpu;
538
assign cpu_data_o = dr[31:0];
539 104 mohor
assign cpu_stall_o = cpu_stb_o | cpu_stall_tmp;
540 100 mohor
 
541
 
542 101 mohor
 
543
// Synchronizing ack signal from cpu
544
always @ (posedge tck_i)
545
begin
546
  cpu_ack_sync      <= #1 cpu_ack_i;
547
  cpu_ack_tck       <= #1 cpu_ack_sync;
548
  cpu_ack_tck_q     <= #1 cpu_ack_tck;
549
end
550
 
551
 
552
 
553
// Start cpu access cycle
554 121 mohor
always @ (posedge tck_i or posedge rst_i)
555 101 mohor
begin
556 121 mohor
  if (rst_i)
557 101 mohor
    cpu_stb <= #1 1'b0;
558 121 mohor
  else if (update_dr_i | cpu_ack_tck)
559 101 mohor
    cpu_stb <= #1 1'b0;
560
  else if (write_cycle_cpu & data_cnt_end & (~data_cnt_end_q) | read_cycle_cpu & (~read_cycle_cpu_q))
561
    cpu_stb <= #1 1'b1;
562
end
563
 
564
 
565
 
566 102 mohor
// Synchronizing cpu_stb to cpu_clk_i clock
567
always @ (posedge cpu_clk_i)
568 101 mohor
begin
569
  cpu_stb_sync  <= #1 cpu_stb;
570
  cpu_stb_o     <= #1 cpu_stb_sync;
571
end
572
 
573
 
574 102 mohor
// Latching crc
575
always @ (posedge tck_i)
576
begin
577
  if(crc_cnt_end & (~crc_cnt_end_q))
578
    crc_match_reg <= #1 crc_match_i;
579
end
580 101 mohor
 
581
 
582
 
583 102 mohor
// Status register
584
always @ (posedge tck_i or posedge rst_i)
585
begin
586
  if (rst_i)
587
    begin
588 108 simons
    status <= #1 4'h0;
589 102 mohor
    end
590
  else if(crc_cnt_end & (~crc_cnt_end_q) & (~read_cycle))
591
    begin
592
    status <= #1 {crc_match_i, 1'b0, 1'b1, 1'b0};
593
    end
594
  else if (data_cnt_end & (~data_cnt_end_q) & read_cycle)
595
    begin
596
    status <= #1 {crc_match_reg, 1'b0, 1'b1, 1'b0};
597
    end
598
  else if (shift_dr_i & (~status_cnt_end))
599
    begin
600
    status <= #1 {status[0], status[3:1]};
601
    end
602
end
603
// Following status is shifted out:
604
// 1. bit:          1 if crc is OK, else 0
605
// 2. bit:          1'b0
606
// 3. bit:          1'b1
607
// 4. bit:          1'b0
608 101 mohor
 
609 102 mohor
 
610
 
611
// TDO multiplexer
612
always @ (crc_cnt_end or crc_cnt_end_q or crc_match_i or data_cnt_end or data_cnt_end_q or
613
          read_cycle or crc_match_reg or status or dr)
614
begin
615
  if (crc_cnt_end & (~crc_cnt_end_q) & (~(read_cycle)))
616
    begin
617
      tdo_o = crc_match_i;
618
    end
619
  else if (read_cycle & crc_cnt_end & (~data_cnt_end))
620
    begin
621
    tdo_o = dr[31];
622
    end
623
  else if (read_cycle & data_cnt_end & (~data_cnt_end_q))     // cmd is already updated
624
    begin
625
      tdo_o = crc_match_reg;
626
    end
627
  else if (crc_cnt_end)
628
    begin
629
      tdo_o = status[0];
630
    end
631
  else
632
    begin
633
      tdo_o = 1'b0;
634
    end
635
end
636
 
637
 
638
 
639
 
640
 
641
 
642
 
643 100 mohor
endmodule
644
 

powered by: WebSVN 2.1.0

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