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

Subversion Repositories rtftextcontroller

[/] [rtftextcontroller/] [trunk/] [rtl/] [verilog/] [rtfTextController3.v] - Blame information for rev 22

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

Line No. Rev Author Line
1 22 robfinch
`timescale 1ns / 1ps
2
// ============================================================================
3
//        __
4
//   \\__/ o\    (C) 2006-2014  Robert Finch, Stratford
5
//    \  __ /    All rights reserved.
6
//     \/_//     robfinch<remove>@finitron.ca
7
//       ||
8
//
9
//      rtfTextController3.v
10
//              text controller
11
//
12
// This source file is free software: you can redistribute it and/or modify 
13
// it under the terms of the GNU Lesser General Public License as published 
14
// by the Free Software Foundation, either version 3 of the License, or     
15
// (at your option) any later version.                                      
16
//                                                                          
17
// This source file is distributed in the hope that it will be useful,      
18
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
19
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
20
// GNU General Public License for more details.                             
21
//                                                                          
22
// You should have received a copy of the GNU General Public License        
23
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
24
//                                                                          
25
//
26
//      Text Controller
27
//
28
//      FEATURES
29
//
30
//      This core requires an external timing generator to provide horizontal
31
//      and vertical sync signals, but otherwise can be used as a display
32
//  controller on it's own. However, this core may also be embedded within
33
//  another core such as a VGA controller.
34
//
35
//      Window positions are referenced to the rising edge of the vertical and
36
//      horizontal sync pulses.
37
//
38
//      The core includes an embedded dual port RAM to hold the screen
39
//      characters.
40
//
41
//
42
//--------------------------------------------------------------------
43
// Registers
44
//
45
//      00 -         nnnnnnnn  number of columns (horizontal displayed number of characters)
46
//      01 -         nnnnnnnn  number of rows    (vertical displayed number of characters)
47
//      02 -       n nnnnnnnn  window left       (horizontal sync position - reference for left edge of displayed)
48
//      03 -       n nnnnnnnn  window top        (vertical sync position - reference for the top edge of displayed)
49
//      04 -         ---nnnnn  maximum scan line (char ROM max value is 7)
50
//              05 -         hhhhwwww  pixel size, hhhh=height,wwww=width
51
//      07 -       n nnnnnnnn  color code for transparent background
52
//      08 -         -BPnnnnn  cursor start / blink control
53
//                             BP: 00=no blink
54
//                             BP: 01=no display
55
//                             BP: 10=1/16 field rate blink
56
//                             BP: 11=1/32 field rate blink
57
//      09 -        ----nnnnn  cursor end
58
//      10 - aaaaaaaa aaaaaaaaa  start address (index into display memory)
59
//      11 - aaaaaaaa aaaaaaaaa  cursor position
60
//      12 - aaaaaaaa aaaaaaaaa  light pen position
61
//--------------------------------------------------------------------
62
//
63
// ============================================================================
64
 
65
module rtfTextController3(
66
        rst_i, clk_i,
67
        cyc_i, stb_i, ack_o, we_i, adr_i, dat_i, dat_o,
68
        lp, curpos,
69
        vclk, hsync, vsync, blank, border, rgbIn, rgbOut
70
);
71
parameter COLS = 12'd56;
72
parameter ROWS = 12'd31;
73
parameter pTextAddress = 32'hFFD00000;
74
parameter pBitmapAddress = 32'hFFD20000;
75
parameter pRegAddress = 32'hFFDA0000;
76
 
77
// Syscon
78
input  rst_i;                   // reset
79
input  clk_i;                   // clock
80
 
81
// Slave signals
82
input  cyc_i;                   // cycle valid
83
input  stb_i;                   // data strobe
84
output ack_o;                   // transfer acknowledge
85
input  we_i;                    // write
86
input  [31:0] adr_i;     // address
87
input  [31:0] dat_i;     // data input
88
output [31:0] dat_o;     // data output
89
reg    [31:0] dat_o;
90
 
91
//
92
input lp;                               // light pen
93
input [15:0] curpos;     // cursor position
94
 
95
// Video signals
96
input vclk;                             // video dot clock
97
input hsync;                    // end of scan line
98
input vsync;                    // end of frame
99
input blank;                    // blanking signal
100
input border;                   // border area
101
input [24:0] rgbIn;              // input pixel stream
102
output reg [24:0] rgbOut;        // output pixel stream
103
 
104
 
105
reg [23:0] bkColor24;    // background color
106
reg [23:0] fgColor24;    // foreground color
107
wire [23:0] tcColor24;   // transparent color
108
 
109
wire pix;                               // pixel value from character generator 1=on,0=off
110
 
111
reg [15:0] rego;
112
reg [11:0] windowTop;
113
reg [11:0] windowLeft;
114
reg [11:0] numCols;
115
reg [11:0] numRows;
116
reg [11:0] charOutDelay;
117
reg [ 1:0] mode;
118
reg [ 4:0] maxScanline;
119
reg [ 4:0] maxScanpix;
120
reg [ 4:0] cursorStart, cursorEnd;
121
reg [15:0] cursorPos;
122
reg [1:0] cursorType;
123
reg [15:0] startAddress;
124
reg [ 2:0] rBlink;
125
reg [ 3:0] bdrColorReg;
126
reg [ 3:0] pixelWidth;   // horizontal pixel width in clock cycles
127
reg [ 3:0] pixelHeight;  // vertical pixel height in scan lines
128
 
129
wire [11:0] hctr;                // horizontal reference counter (counts clocks since hSync)
130
wire [11:0] scanline;    // scan line
131
wire [11:0] row;         // vertical reference counter (counts rows since vSync)
132
wire [11:0] col;         // horizontal column
133
reg  [ 4:0] rowscan;     // scan line within row
134
wire nxt_row;                   // when to increment the row counter
135
wire nxt_col;                   // when to increment the column counter
136
wire [ 5:0] bcnt;                // blink timing counter
137
wire blink;
138
reg  iblank;
139
 
140
wire nhp;                               // next horizontal pixel
141
wire ld_shft = nxt_col & nhp;
142
 
143
 
144
// display and timing signals
145
reg [15:0] txtAddr;              // index into memory
146
reg [15:0] penAddr;
147
wire [8:0] txtOut;               // character code
148
wire [8:0] charOut;              // character ROM output
149
wire [8:0] txtBkColor;   // background color code
150
wire [8:0] txtFgColor;   // foreground color code
151
reg  [8:0] txtTcCode;    // transparent color code
152
reg  bgt;
153
 
154
wire [27:0] tdat_o;
155
wire [8:0] chdat_o;
156
 
157
wire [2:0] scanindex = scanline[2:0];
158
 
159
 
160
//--------------------------------------------------------------------
161
// Address Decoding
162
// I/O range Dx
163
//--------------------------------------------------------------------
164
wire cs_text = cyc_i && stb_i && (adr_i[31:16]==pTextAddress[31:16]);
165
wire cs_rom  = cyc_i && stb_i && (adr_i[31:16]==pBitmapAddress[31:16]);
166
wire cs_reg  = cyc_i && stb_i && (adr_i[31: 8]==pRegAddress[31:8]);
167
wire cs_any = cs_text|cs_rom|cs_reg;
168
 
169
// Register outputs
170
always @(posedge clk_i)
171
        if (cs_text) dat_o <= {4'd0,tdat_o};
172
        else if (cs_rom) dat_o <= {23'd0,chdat_o};
173
        else if (cs_reg) dat_o <= {16'd0,rego};
174
        else dat_o <= 32'h0000;
175
 
176
//always @(posedge clk_i)
177
//      if (cs_text) begin
178
//              $display("TC WRite: %h %h", adr_i, dat_i);
179
//              $stop;
180
//      end
181
 
182
//--------------------------------------------------------------------
183
// Video Memory
184
//--------------------------------------------------------------------
185
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
186
// Address Calculation:
187
//  - Simple: the row times the number of  cols plus the col plus the
188
//    base screen address
189
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
190
 
191
wire [17:0] rowcol = row * numCols;
192
always @(posedge vclk)
193
        txtAddr <= startAddress + rowcol[15:0] + col;
194
 
195
// text screen RAM
196
syncRam4kx9_1rw1r textRam0
197
(
198
        .wclk(clk_i),
199
        .wadr(adr_i[13:2]),
200
        .i(dat_i[8:0]),
201
        .wo(tdat_o[8:0]),
202
        .wce(cs_text),
203
        .we(we_i),
204
        .wrst(1'b0),
205
 
206
        .rclk(vclk),
207
        .radr(txtAddr[11:0]),
208
        .o(txtOut),
209
        .rce(ld_shft),
210
        .rrst(1'b0)
211
);
212
 
213
// screen attribute RAM
214
syncRam4kx9_1rw1r fgColorRam
215
(
216
        .wclk(clk_i),
217
        .wadr(adr_i[13:2]),
218
        .i(dat_i[18:10]),
219
        .wo(tdat_o[18:10]),
220
        .wce(cs_text),
221
        .we(we_i),
222
        .wrst(1'b0),
223
 
224
        .rclk(vclk),
225
        .radr(txtAddr[11:0]),
226
        .o(txtFgColor),
227
        .rce(ld_shft),
228
        .rrst(1'b0)
229
);
230
 
231
// screen attribute RAM
232
syncRam4kx9_1rw1r bkColorRam
233
(
234
        .wclk(clk_i),
235
        .wadr(adr_i[13:2]),
236
        .i(dat_i[27:19]),
237
        .wo(tdat_o[27:19]),
238
        .wce(cs_text),
239
        .we(we_i),
240
        .wrst(1'b0),
241
 
242
        .rclk(vclk),
243
        .radr(txtAddr[11:0]),
244
        .o(txtBkColor),
245
        .rce(ld_shft),
246
        .rrst(1'b0)
247
);
248
 
249
 
250
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
251
// Character bitmap ROM
252
// - room for 512 characters
253
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
254
syncRam4kx9_1rw1r charRam0
255
(
256
        .wclk(clk_i),
257
        .wadr(adr_i[13:2]),
258
        .i(dat_i),
259
        .wo(chdat_o),
260
        .wce(cs_rom),
261
        .we(1'b0),//we_i),
262
        .wrst(1'b0),
263
 
264
        .rclk(vclk),
265
        .radr({txtOut,rowscan[2:0]}),
266
        .o(charOut),
267
        .rce(ld_shft),
268
        .rrst(1'b0)
269
);
270
 
271
 
272
// pipeline delay - sync color with character bitmap output
273
reg [8:0] txtBkCode1;
274
reg [8:0] txtFgCode1;
275
always @(posedge vclk)
276
        if (nhp & ld_shft) txtBkCode1 <= txtBkColor;
277
always @(posedge vclk)
278
        if (nhp & ld_shft) txtFgCode1 <= txtFgColor;
279
 
280
//--------------------------------------------------------------------
281
// bus interfacing
282
// - there is a two cycle latency for reads, an ack is generated
283
//   after the synchronous RAM read
284
// - writes can be acknowledged right away.
285
//--------------------------------------------------------------------
286
reg ramRdy,ramRdy1;
287
always @(posedge clk_i)
288
begin
289
        ramRdy1 <= cs_any;
290
        ramRdy <= ramRdy1 & cs_any;
291
end
292
 
293
assign ack_o = cs_any ? (we_i ? 1'b1 : ramRdy) : 1'b0;
294
 
295
 
296
//--------------------------------------------------------------------
297
// Registers
298
//
299
// RW   00 -         nnnnnnnn  number of columns (horizontal displayed number of characters)
300
// RW   01 -         nnnnnnnn  number of rows    (vertical displayed number of characters)
301
//  W   02 -       n nnnnnnnn  window left       (horizontal sync position - reference for left edge of displayed)
302
//  W   03 -       n nnnnnnnn  window top        (vertical sync position - reference for the top edge of displayed)
303
//  W   04 -         ---nnnnn  maximum scan line (char ROM max value is 7)
304
//      W       05 -         hhhhwwww  pixel size, hhhh=height,wwww=width
305
//  W   07 -       n nnnnnnnn  transparent color
306
//  W   08 -         -BPnnnnn  cursor start / blink control
307
//                             BP: 00=no blink
308
//                             BP: 01=no display
309
//                             BP: 10=1/16 field rate blink
310
//                             BP: 11=1/32 field rate blink
311
//  W   09 -        ----nnnnn  cursor end
312
//  W   10 - aaaaaaaa aaaaaaaaa  start address (index into display memory)
313
//  W   11 - aaaaaaaa aaaaaaaaa  cursor position
314
//  R   12 - aaaaaaaa aaaaaaaaa  light pen position
315
//--------------------------------------------------------------------
316
 
317
//--------------------------------------------------------------------
318
// Light Pen
319
//--------------------------------------------------------------------
320
wire lpe;
321
edge_det u1 (.rst(rst_i), .clk(clk_i), .ce(1'b1), .i(lp), .pe(lpe), .ne(), .ee() );
322
 
323
always @(posedge clk_i)
324
        if (rst_i)
325
                penAddr <= 32'h0000_0000;
326
        else begin
327
                if (lpe)
328
                        penAddr <= txtAddr;
329
        end
330
 
331
 
332
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
333
// Register read port
334
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
335
always @(cs_reg or cursorPos or penAddr or adr_i or numCols or numRows)
336
        if (cs_reg) begin
337
                case(adr_i[5:2])
338
                4'd0:           rego <= numCols;
339
                4'd1:           rego <= numRows;
340
                4'd11:          rego <= cursorPos;
341
                4'd12:          rego <= penAddr;
342
                default:        rego <= 16'h0000;
343
                endcase
344
        end
345
        else
346
                rego <= 16'h0000;
347
 
348
 
349
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
350
// Register write port
351
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
352
 
353
reg interlace;
354
always @(posedge clk_i)
355
        if (rst_i) begin
356
// 104x63
357
/*
358
                windowTop    <= 12'd26;
359
                windowLeft   <= 12'd260;
360
                pixelWidth   <= 4'd0;
361
                pixelHeight  <= 4'd1;           // 525 pixels (408 with border)
362
*/
363
// 52x31
364
/*
365
                // 84x47
366
                windowTop    <= 12'd16;
367
                windowLeft   <= 12'd90;
368
                pixelWidth   <= 4'd1;           // 681 pixels
369
                pixelHeight  <= 4'd1;           // 384 pixels
370
*/
371
                // 56x31
372
                windowTop    <= 12'd16;
373
                windowLeft   <= 12'd56;
374
                pixelWidth   <= 4'd2;           // 455 pixels
375
                pixelHeight  <= 4'd2;           // 256 pixels
376
                numCols      <= COLS;
377
                numRows      <= ROWS;
378
                maxScanline  <= 5'd7;
379
                maxScanpix   <= 5'd7;
380
                rBlink       <= 3'b111;         // 01 = non display
381
                startAddress <= 16'h0000;
382
                cursorStart  <= 5'd00;
383
                cursorEnd    <= 5'd31;
384
                cursorPos    <= 16'h0003;
385
                cursorType       <= 2'b00;
386
                txtTcCode    <= 9'h1ff;
387
                charOutDelay <= 12'd2;
388
        end
389
        else begin
390
 
391
                if (cs_reg & we_i) begin        // register write ?
392
 
393
                        case(adr_i[5:2])
394
                        4'd00:  begin
395
                                        numCols    <= dat_i[15:0];               // horizontal displayed
396
                                        charOutDelay <= dat_i[31:16];
397
                                        end
398
                        4'd01:  numRows    <= dat_i;
399
                        4'd02:  windowLeft <= dat_i[11:0];
400
                        4'd03:  windowTop  <= dat_i[11:0];               // vertical sync position
401
                        4'd04:  maxScanline <= dat_i[4:0];
402
                        4'd05:  begin
403
                                        pixelHeight <= dat_i[7:4];
404
                                        pixelWidth  <= dat_i[3:0];       // horizontal pixel width
405
                                        end
406
                        4'd07:  txtTcCode   <= dat_i[4:0];
407
                        4'd08:  begin
408
                                        cursorStart <= dat_i[4:0];       // scan line sursor starts on
409
                                        rBlink      <= dat_i[7:5];
410
                                        cursorType  <= dat_i[9:8];
411
                                        end
412
                        4'd09:  cursorEnd   <= dat_i[4:0];       // scan line cursor ends on
413
                        4'd10:  startAddress <= dat_i;
414
                        4'd11:  cursorPos <= dat_i;
415
                        endcase
416
                end
417
        end
418
 
419
 
420
//--------------------------------------------------------------------
421
//--------------------------------------------------------------------
422
 
423
// "Box" cursor bitmap
424
reg [7:0] curout;
425
always @(scanindex or cursorType)
426
        case({cursorType,scanindex})
427
        // Box cursor
428
        5'b00_000:      curout = 8'b11111111;
429
        5'b00_001:      curout = 8'b10000001;
430
        5'b00_010:      curout = 8'b10000001;
431
        5'b00_011:      curout = 8'b10000001;
432
        5'b00_100:      curout = 8'b10000001;
433
        5'b00_101:      curout = 8'b10000001;
434
        5'b00_110:      curout = 8'b10011001;
435
        5'b00_111:      curout = 8'b11111111;
436
        // vertical bar cursor
437
        5'b01_000:      curout = 8'b11000000;
438
        5'b01_001:      curout = 8'b10000000;
439
        5'b01_010:      curout = 8'b10000000;
440
        5'b01_011:      curout = 8'b10000000;
441
        5'b01_100:      curout = 8'b10000000;
442
        5'b01_101:      curout = 8'b10000000;
443
        5'b01_110:      curout = 8'b10000000;
444
        5'b01_111:      curout = 8'b11000000;
445
        // underline cursor
446
        5'b10_000:      curout = 8'b00000000;
447
        5'b10_001:      curout = 8'b00000000;
448
        5'b10_010:      curout = 8'b00000000;
449
        5'b10_011:      curout = 8'b00000000;
450
        5'b10_100:      curout = 8'b00000000;
451
        5'b10_101:      curout = 8'b00000000;
452
        5'b10_110:      curout = 8'b00000000;
453
        5'b10_111:      curout = 8'b11111111;
454
        // Asterisk
455
        5'b11_000:      curout = 8'b00000000;
456
        5'b11_001:      curout = 8'b00000000;
457
        5'b11_010:      curout = 8'b00100100;
458
        5'b11_011:      curout = 8'b00011000;
459
        5'b11_100:      curout = 8'b01111110;
460
        5'b11_101:      curout = 8'b00011000;
461
        5'b11_110:      curout = 8'b00100100;
462
        5'b11_111:      curout = 8'b00000000;
463
        endcase
464
 
465
 
466
//-------------------------------------------------------------
467
// Video Stuff
468
//-------------------------------------------------------------
469
 
470
wire pe_hsync;
471
wire pe_vsync;
472
edge_det edh1
473
(
474
        .rst(rst_i),
475
        .clk(vclk),
476
        .ce(1'b1),
477
        .i(hsync),
478
        .pe(pe_hsync),
479
        .ne(),
480
        .ee()
481
);
482
 
483
edge_det edv1
484
(
485
        .rst(rst_i),
486
        .clk(vclk),
487
        .ce(1'b1),
488
        .i(vsync),
489
        .pe(pe_vsync),
490
        .ne(),
491
        .ee()
492
);
493
 
494
// Horizontal counter:
495
//
496
HVCounter uhv1
497
(
498
        .rst(rst_i),
499
        .vclk(vclk),
500
        .pixcce(1'b1),
501
        .sync(hsync),
502
        .cnt_offs(windowLeft),
503
        .pixsz(pixelWidth),
504
        .maxpix(maxScanpix),
505
        .nxt_pix(nhp),
506
        .pos(col),
507
        .nxt_pos(nxt_col),
508
        .ctr(hctr)
509
);
510
 
511
 
512
// Vertical counter:
513
//
514
HVCounter uhv2
515
(
516
        .rst(rst_i),
517
        .vclk(vclk),
518
        .pixcce(pe_hsync),
519
        .sync(vsync),
520
        .cnt_offs(windowTop),
521
        .pixsz(pixelHeight),
522
        .maxpix(maxScanline),
523
        .nxt_pix(nvp),
524
        .pos(row),
525
        .nxt_pos(nxt_row),
526
        .ctr(scanline)
527
);
528
 
529
always @(posedge vclk)
530
        rowscan <= scanline - row * (maxScanline+1);
531
 
532
 
533
// Blink counter
534
//
535
VT163 #(6) ub1
536
(
537
        .clk(vclk),
538
        .clr_n(!rst_i),
539
        .ent(pe_vsync),
540
        .enp(1'b1),
541
        .ld_n(1'b1),
542
        .d(6'd0),
543
        .q(bcnt),
544
        .rco()
545
);
546
 
547
wire blink_en = (cursorPos+2==txtAddr) && (scanline[4:0] >= cursorStart) && (scanline[4:0] <= cursorEnd);
548
 
549
VT151 ub2
550
(
551
        .e_n(!blink_en),
552
        .s(rBlink),
553
        .i0(1'b1), .i1(1'b0), .i2(bcnt[4]), .i3(bcnt[5]),
554
        .i4(1'b1), .i5(1'b0), .i6(bcnt[4]), .i7(bcnt[5]),
555
        .z(blink),
556
        .z_n()
557
);
558
 
559
always @(posedge vclk)
560
        if (nhp & ld_shft)
561
                bkColor24 <= {txtBkCode1[8:6],5'h10,txtBkCode1[5:3],5'h10,txtBkCode1[2:0],5'h10};
562
always @(posedge vclk)
563
        if (nhp & ld_shft)
564
                fgColor24 <= {txtFgCode1[8:6],5'h10,txtFgCode1[5:3],5'h10,txtFgCode1[2:0],5'h10};
565
 
566
always @(posedge vclk)
567
        if (nhp & ld_shft)
568
                bgt <= txtBkCode1==txtTcCode;
569
 
570
 
571
// Convert character bitmap to pixels
572
// For convenience, the character bitmap data in the ROM is in the
573
// opposite bit order to what's needed for the display. The following
574
// just alters the order without adding any hardware.
575
//
576
wire [7:0] charRev = {
577
        charOut[0],
578
        charOut[1],
579
        charOut[2],
580
        charOut[3],
581
        charOut[4],
582
        charOut[5],
583
        charOut[6],
584
        charOut[7]
585
};
586
 
587
wire [7:0] charout1 = blink ? (charRev ^ curout) : charRev;
588
 
589
// Convert parallel to serial
590
ParallelToSerial ups1
591
(
592
        .rst(rst_i),
593
        .clk(vclk),
594
        .ce(nhp),
595
        .ld(ld_shft),
596
        .qin(1'b0),
597
        .d(charout1),
598
        .qh(pix)
599
);
600
 
601
 
602
// Pipelining Effect:
603
// - character output is delayed by 2 or 3 character times relative to the video counters
604
//   depending on the resolution selected
605
// - this means we must adapt the blanking signal by shifting the blanking window
606
//   two or three character times.
607
wire bpix = hctr[1] ^ scanline[4];// ^ blink;
608
always @(posedge vclk)
609
        if (nhp)
610
                iblank <= (row >= numRows) || (col >= numCols + charOutDelay) || (col < charOutDelay);
611
 
612
 
613
// Choose between input RGB and controller generated RGB
614
// Select between foreground and background colours.
615
always @(posedge vclk)
616
        if (nhp) begin
617
                casex({blank,iblank,border,bpix,pix})
618
                5'b1xxxx:       rgbOut <= 25'h0000000;
619
                5'b01xxx:       rgbOut <= rgbIn;
620
                5'b0010x:       rgbOut <= 24'hBF2020;
621
                5'b0011x:       rgbOut <= 24'hDFDFDF;
622
                5'b000x0:       rgbOut <= bgt ? rgbIn : bkColor24;
623
                5'b000x1:       rgbOut <= fgColor24;
624
                default:        rgbOut <= rgbIn;
625
                endcase
626
        end
627
 
628
endmodule
629
 

powered by: WebSVN 2.1.0

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