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

Subversion Repositories rtf68ksys

[/] [rtf68ksys/] [trunk/] [rtl/] [verilog/] [rtf68kSys.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 robfinch
// ============================================================================
2
// rtf68kSys.v
3
//  - 68k Test System
4
//
5
//
6
//      2010-2011  Robert Finch
7
//      robfinch<remove>@FPGAfield.ca
8
//
9
//
10
//  This source code is available for evaluation and validation purposes
11
//  only. This copyright statement and disclaimer must remain present in
12
//  the file.
13
//
14
//
15
//      NO WARRANTY.
16
//  THIS Work, IS PROVIDEDED "AS IS" WITH NO WARRANTIES OF ANY KIND, WHETHER
17
//  EXPRESS OR IMPLIED. The user must assume the entire risk of using the
18
//  Work.
19
//
20
//  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
21
//  INCIDENTAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES WHATSOEVER RELATING TO
22
//  THE USE OF THIS WORK, OR YOUR RELATIONSHIP WITH THE AUTHOR.
23
//
24
//  IN ADDITION, IN NO EVENT DOES THE AUTHOR AUTHORIZE YOU TO USE THE WORK
25
//  IN APPLICATIONS OR SYSTEMS WHERE THE WORK'S FAILURE TO PERFORM CAN
26
//  REASONABLY BE EXPECTED TO RESULT IN A SIGNIFICANT PHYSICAL INJURY, OR IN
27
//  LOSS OF LIFE. ANY SUCH USE BY YOU IS ENTIRELY AT YOUR OWN RISK, AND YOU
28
//  AGREE TO HOLD THE AUTHOR AND CONTRIBUTORS HARMLESS FROM ANY CLAIMS OR
29
//  LOSSES RELATING TO SUCH UNAUTHORIZED USE.
30
//
31
// ============================================================================
32
 
33
module rtf68kSys
34
(
35
        xclk,
36
//      ifclk,
37
        gclk1,
38
        btn,
39
        swt,
40
        kclk, kd,
41
        an, ssg,
42
        led,
43
        ram_a, ram_d, ram_oe, ram_we, ram_lb, ram_ub, ram_clk, ram_adv, ram_ce, ram_cre, ram_wait,
44
        flash_ce, flash_st, flash_rp,
45
        hSync,vSync,red,green,blue,
46
        dac_sclk, dac_sync, dac_d,
47
        rst1626,clk1626,dq1626,
48
        eppAstb, eppDstb, eppWr, eppRst, eppDB, eppWait,
49
        rxd, txd
50
);
51
input xclk;
52
//input ifclk;
53
input gclk1;
54
input [3:0] btn;
55
input [7:0] swt;
56
inout kclk;
57
tri kclk;
58
inout kd;
59
tri kd;
60
output [3:0] an;
61
output [7:0] ssg;
62
output [7:0] led;
63
 
64
output tri [23:1] ram_a;
65
inout tri [15:0] ram_d;
66
output tri ram_lb;
67
output tri ram_ub;
68
output tri ram_clk;
69
output tri ram_adv;
70
output tri ram_cre;
71
input ram_wait;
72
output tri ram_oe;
73
output tri ram_ce;
74
output tri ram_we;
75
output tri flash_ce;
76
input flash_st;
77
output tri flash_rp;
78
 
79
output tri hSync;
80
output tri vSync;
81
output [2:0] red;
82
output [2:0] green;
83
output [1:0] blue;
84
 
85
output dac_sclk;
86
output dac_sync;
87
output dac_d;
88
 
89
output rst1626;
90
output clk1626;
91
inout dq1626;
92
 
93
input eppAstb;
94
input eppDstb;
95
input eppWr;
96
input eppRst;
97
inout [7:0] eppDB;
98
output eppWait;
99
 
100
input rxd;
101
output txd;
102
 
103
reg [31:0] adr;
104
reg [15:0] dbi;
105
wire [15:0] dbo;
106
wire as,uds,lds;
107
wire rw;
108
wire ulds = uds&lds;
109
wire sys_cyc = !as;
110
wire sys_stb = !ulds;
111
wire sys_we = !rw;
112
wire [1:0] sys_sel = ~{uds,lds};
113
wire [31:0] cpu_adr;
114
reg [15:0] valreg;
115
wire clk50;
116
wire video_clk;
117
wire vclk5x;
118
wire [2:0] vcti;
119
wire vcyc_o;
120
wire vstb_o;
121
wire vack_i;
122
wire [43:0] vadr_o;
123
wire [15:0] vdat_i;
124
wire [23:0] rgbo;
125
 
126
//assign red = rgbo[7:5];
127
//assign green = rgbo[4:2];
128
//assign blue = rgbo[1:0];
129
 
130
wire rom_dtack;
131
wire vec_dtack;
132
wire dtack;
133
 
134
wire pulse1000Hz;
135
wire blank,eol,eof;
136
 
137
wire [7:0] busEppOut;
138
reg [7:0] busEppIn;
139
wire ctlEppDwrOut;
140
wire ctlEppRdCycleOut;
141
wire [7:0] regEppAdrOut;
142
wire HandShakeReqIn,HandShakeReqIn2;
143
wire ctlEppStartOut;
144
wire ctlEppDoneIn,ctlEppDoneIn2;
145
 
146
wire [7:0] busMemDB,busMemDB2;
147
wire csMemctrl;
148
 
149
wire [15:0] mcDB;
150
wire [23:1] mcAD;
151
wire mcRamCS;
152
wire mcFlashCS;
153
wire mcMemWr;
154
wire mcMemOe;
155
wire mcMemUb;
156
wire mcMemLb;
157
wire mcMemCRE;
158
wire mcRamAdv;
159
wire mcRamClk;
160
wire mcRamWait;
161
wire mcFlashRp;
162
wire mcFlashStSts;
163
wire mcMemCtrlEnabled;
164
 
165
wire ffRamCRE;
166
wire ffRamAdv;
167
wire ffRamClk;
168
wire [15:0] ffRamDB;
169
wire [23:1] ffRamAD;
170
wire ffRamWe;
171
wire ffRamWeh;
172
wire ffRamCe;
173
wire ffRamOe;
174
wire ffRamUb;
175
wire ffRamLb;
176
wire ffFlashCe;
177
wire ffFlashRp;
178
wire ram_dtack;
179
wire ram_ack;
180
wire [15:0] ram_dat;
181
 
182
wire mysa;
183
wire [47:0] startAddress;
184
wire [7:0] mysaout;
185
wire saTrigger;
186
 
187
wire kbd_ack;
188
wire [15:0] kbd_dbo;
189
wire kbd_irq;
190
wire kbd_rst;
191
 
192
wire tc_ack;
193
wire [15:0] tc_dbo;
194
 
195
wire [15:0] dsc_rgbo;
196
wire dsc_ack;
197
wire [15:0] dsc_dbo;
198
 
199
wire [7:0] bm_rgbo;
200
wire [23:0] tx_rgbo;
201
wire bmc_ack;
202
wire [15:0] bmc_dbo;
203
 
204
wire sc_ack;
205
wire [15:0] sc_dat_o;
206
wire [23:0] sc_rgbo;
207
 
208
wire psg_ack;
209
wire [15:0] psg_dbo;
210
wire [11:0] psg_o;
211
wire psg_cyc;
212
wire psg_stb;
213
wire psg_we;
214
wire [1:0] psg_sel;
215
 
216
wire [7:0] uart_dbo;
217
wire uart_ack;
218
 
219
wire [15:0] rnd_dbo;
220
wire rnd_ack;
221
 
222
wire [15:0] tmp_dbo;
223
wire tmp_ack;
224
 
225
wire gra_ack;
226
wire gr_cyc_o;
227
wire gr_stb_o;
228
wire gr_we_o;
229
wire gr_ack_i;
230
wire [1:0] gr_sel_o;
231
wire [31:0] gr_adr_o;
232
wire [15:0] gr_dat_i;
233
wire [15:0] gr_dat_o;
234
 
235
wire sp_cyc_o;
236
wire sp_stb_o;
237
wire sp_we_o;
238
wire sp_ack_i;
239
wire [1:0] sp_sel_o;
240
wire [31:0] sp_adr_o;
241
wire [15:0] sp_dat_i;
242
wire [15:0] sp_dat_o;
243
 
244
// system clock generator
245
rtf68kSysClkgen u1
246
(
247
        .xreset(btn[0]), // external reset
248
        .xclk(xclk),                            // external clock source (100MHz)
249
        .rst(rst),                                      // system reset
250
        .clk50(clk50),                          // system clock - 60.000 MHz
251
        .clk25(clk25),                          // system clock - 10.000 MHz
252
        .vclk(video_clk),                       // video clock  - 73.529 MHz
253
        .vclk5(vclk5x),
254
        .pulse1000Hz(pulse1000Hz)       // 1000 Hz timing pulse
255
);
256
 
257
assign red = rgbo[23:21];
258
assign green = rgbo[15:13];
259
assign blue = rgbo[7:6];
260
 
261
// XGA Timing generator
262
WXGASyncGen1680x1050_60Hz u2
263
(
264
        .rst(rst),
265
        .clk(video_clk),
266
        .hSync(hSync),
267
        .vSync(vSync),
268
        .blank(blank),
269
        .border(),
270
        .eol(eol),
271
        .eof(eof)
272
);
273
 
274
FF_PS2KbdToAscii kbd1
275
(
276
        .rst_i(rst),
277
        .clk_i(clk25),
278
        .cyc_i(sys_cyc),
279
        .stb_i(sys_stb),
280
        .ack_o(kbd_ack),
281
        .adr_i({12'hFFF,cpu_adr}),      // FFF_FFDC_000x
282
        .dat_o(kbd_dbo),
283
//      .vol_o(),
284
        .kclk(kclk),
285
        .kd(kd),
286
        .irq(kbd_irq),
287
        .rst_o(kbd_rst)
288
);
289
 
290
rtfSimpleUart #(16666667) uuart
291
(
292
        // WISHBONE Slave interface
293
        .rst_i(rst),                    // reset
294
        .clk_i(clk25),                  // eg 100.7MHz
295
        .cyc_i(sys_cyc),                // cycle valid
296
        .stb_i(sys_stb),                // strobe
297
        .we_i(sys_we),                  // 1 = write
298
        .adr_i(cpu_adr),        // register address
299
        .dat_i(dbo[7:0]),                // data input bus
300
        .dat_o(uart_dbo),               // data output bus
301
        .ack_o(uart_ack),               // transfer acknowledge
302
        .vol_o(),                               // volatile register selected
303
        .irq_o(),                               // interrupt request
304
        //----------------
305
        .cts_ni(1'b0),          // clear to send - active low - (flow control)
306
        .rts_no(),                      // request to send - active low - (flow control)
307
        .dsr_ni(1'b0),          // data set ready - active low
308
        .dcd_ni(1'b0),          // data carrier detect - active low
309
        .dtr_no(),                      // data terminal ready - active low
310
        .rxd_i(rxd),                    // serial data in
311
        .txd_o(txd),                    // serial data out
312
        .data_present_o()
313
);
314
 
315
//reg [7:0] led;
316
assign led = eppDB;     // Have to set it to something....
317
 
318
// Epp interface circuit courtesy Diligent
319
//
320
EppCtrl ueppctrl (
321
        .clk(clk25),
322
        .EppAstb(eppAstb),
323
        .EppDstb(eppDstb),
324
        .EppWr(eppWr),
325
        .EppRst(!rst),
326
        .EppDB(eppDB),
327
        .EppWait(eppWait),
328
 
329
        .busEppOut(busEppOut),
330
        .busEppIn(busEppIn),
331
        .ctlEppDwrOut(ctlEppDwrOut),
332
        .ctlEppRdCycleOut(ctlEppRdCycleOut),
333
        .regEppAdrOut(regEppAdrOut),
334
        .HandShakeReqIn(HandShakeReqIn|HandShakeReqIn2),
335
        .ctlEppStartOut(ctlEppStartOut),
336
        .ctlEppDoneIn(ctlEppDoneIn|ctlEppDoneIn2)
337
);
338
always @(regEppAdrOut or busMemDB or busMemDB2 or mysaout)
339
        casex(regEppAdrOut)
340
        8'b00000xxx:    busEppIn <= busMemDB;
341
        8'b00001xxx:    busEppIn <= busMemDB2;
342
        8'b10000xxx:    busEppIn <= mysaout;
343
        default:                busEppIn <= 8'hFF;
344
        endcase
345
 
346
 
347
CompSel ucs1
348
(
349
        .regEppAdrIn(regEppAdrOut),
350
        .CS0_7(csMemctrl)
351
);
352
 
353
// Responds to epp register address range 0x80-0x86
354
//
355
/*
356
EppStartAddress usa1
357
(
358
        .rst(rst),
359
        .clk(clk25),
360
        .wr(ctlEppDwrOut),
361
        .ad(regEppAdrOut),
362
        .dbi(busEppOut),
363
        .dbo(mysaout),
364
        .myad(mysa),
365
        .trigger(saTrigger),
366
        .startAddress(startAddress)
367
);
368
*/
369
wire ackLoadedBit = sys_cyc && sys_stb && (cpu_adr[31:8]==24'hFFDD_00);
370
 
371
 
372
// Epp source memory controller - courtesy Diligent
373
//
374
NexysOnBoardMemCtrl  umemctrl1
375
(
376
        .clk(clk25),
377
        .HandShakeReqOut(HandShakeReqIn),
378
        .ctlMsmStartIn(ctlEppStartOut),
379
        .ctlMsmDoneOut(ctlEppDoneIn),
380
        .ctlMsmDwrIn(ctlEppDwrOut),
381
        .ctlEppRdCycleIn(ctlEppRdCycleOut),
382
        .EppRdDataOut(busMemDB),
383
        .EppWrDataIn(busEppOut),
384
        .regEppAdrIn(regEppAdrOut),
385
        .ComponentSelect(csMemctrl),
386
 
387
        .MemDB(mcDB),
388
        .MemAdr(mcAD),
389
        .FlashByte(mcFB),
390
        .RamCS(mcRamCS),
391
        .FlashCS(mcFlashCS),
392
        .MemWR(mcMemWr),
393
        .MemOE(mcMemOe),
394
        .RamUB(mcMemUb),
395
        .RamLB(mcMemLb),
396
        .RamCRE(mcMemCRE),
397
        .RamAdv(mcRamAdv),
398
        .RamClk(mcRamClk),
399
        .RamWait(mcRamWait),
400
        .FlashRp(mcFlashRp),
401
        .FlashStSts(mcFlashStSts),
402
        .MemCtrlEnabled(mcMemCtrlEnabled)
403
);
404
 
405
 
406
reg bm_owns;
407
reg [3:0] tcnt;
408
reg [15:0] cdat_i;
409
 
410
wire cs_vec = !as && ((cpu_adr[31:0] <  32'h00000008) || (cpu_adr[31:4]==28'hFFFFFFF));
411
wire cs_ram = !as && (cpu_adr[31:0] >= 32'h00000008 && cpu_adr[31:16] < 16'hFFD0);
412
wire cs_rom = !as && (cpu_adr[31:16]==16'hFFFF);
413
wire cs_stk = !as && (cpu_adr[31:12]==20'hFFFE_0);
414
wire csThreadNdx = !ulds && (cpu_adr[31:0]==32'hFFDD_0008);
415
 
416
//input ram_wait;
417
 
418
assign ram_cre  = mcMemCtrlEnabled ? mcMemCRE : ffRamCRE;
419
assign ram_adv  = mcMemCtrlEnabled ? mcRamAdv : ffRamAdv;
420
assign ram_clk  = mcMemCtrlEnabled ? mcRamClk : ffRamClk;
421
assign ram_d    = mcMemCtrlEnabled ? (!mcMemWr ? mcDB : 16'hZZZZ) : (!ffRamWeh ? ffRamDB : 16'hZZZZ);
422
assign mcDB     = !mcMemWr ? 16'hZZZZ : ram_d;
423
assign ffRamDB  = !ffRamWe ? 16'hZZZZ : ram_d;
424
assign ram_a    = mcMemCtrlEnabled ? mcAD : ffRamAD;
425
assign ram_we   = mcMemCtrlEnabled ? mcMemWr : ffRamWe;
426
assign ram_oe   = mcMemCtrlEnabled ? mcMemOe : ffRamOe;
427
assign ram_ce   = mcMemCtrlEnabled ? mcRamCS : ffRamCe;
428
assign ram_lb   = mcMemCtrlEnabled ? mcMemLb : ffRamLb;
429
assign ram_ub   = mcMemCtrlEnabled ? mcMemUb : ffRamUb;
430
assign flash_ce = mcMemCtrlEnabled ? mcFlashCS : ffFlashCe;
431
assign flash_rp = mcMemCtrlEnabled ? mcFlashRp : ffFlashRp;
432
assign mcFlashStSts = flash_st;
433
 
434
// Responds to epp register address range 0x08-0x0F
435
//
436
rtf68kSysRAMCtrl #(16666667) u20
437
(
438
        .rst_i(rst),
439
        .clk_i(clk25),
440
        .gblen(!mcMemCtrlEnabled),
441
 
442
        // CPU port
443
        .as(!cs_ram),
444
        .dtack(ram_dtack),
445
        .rw(rw),
446
        .uds(uds),
447
        .lds(lds),
448
        .adr({12'h000,adr}),
449
        .dat_i(dbo),
450
        .dat_o(ram_dat),
451
 
452
        // Graphics Accelerator
453
        .gr_cyc_i(gr_cyc_o),
454
        .gr_stb_i(gr_stb_o),
455
        .gr_ack_o(gr_ack_i),
456
        .gr_we_i(gr_we_o),
457
        .gr_sel_i(gr_sel_o),
458
        .gr_adr_i(gr_adr_o),
459
        .gr_dat_i(gr_dat_o),
460
        .gr_dat_o(gr_dat_i),
461
 
462
        // Sprite
463
        .sp_cyc_i(sp_cyc_o),
464
        .sp_stb_i(sp_stb_o),
465
        .sp_ack_o(sp_ack_i),
466
        .sp_we_i(sp_we_o),
467
        .sp_sel_i(sp_sel_o),
468
        .sp_adr_i(sp_adr_o),
469
        .sp_dat_i(sp_dat_o),
470
        .sp_dat_o(sp_dat_i),
471
 
472
        // Epp Port
473
        .eppRd(ctlEppEdCycleOut),
474
        .eppWr(ctlEppDwrOut),
475
        .eppAdr(regEppAdrOut),
476
        .eppDati(busEppOut),
477
        .eppDato(busMemDB2),
478
        .eppHSreq(HandShakeReqIn2),
479
        .eppStart(ctlEppStartOut),
480
        .eppDone(ctlEppDoneIn2),
481
 
482
        // Video Port
483
        .vcti_i(vcti),
484
        .vcyc_i(vcyc_o),
485
        .vack_o(vack_i),
486
        .vadr_i(vadr_o),
487
        .vdat_o(vdat_i),
488
 
489
        // Audio Port
490
        .ar_cyc_i(),
491
        .ar_stb_i(),
492
        .ar_ack_o(),
493
        .ar_we_i(),
494
        .ar_sel_i(),
495
        .ar_adr_i(),
496
        .ar_dat_i(),
497
        .ar_dat_o(),
498
 
499
        // Audio Port
500
        .ap_cyc_i(psg_cyc),
501
        .ap_stb_i(psg_stb),
502
        .ap_ack_o(),
503
        .ap_we_i(psg_we),
504
        .ap_sel_i(psg_sel),
505
        .ap_adr_i(),
506
        .ap_dat_i(),
507
        .ap_dat_o(),
508
 
509
        // PSRam connections
510
        .ram_clk(ffRamClk),
511
        .ram_adv(ffRamAdv),
512
        .ram_cre(ffRamCRE),
513
        .ram_ce(ffRamCe),
514
        .ram_we(ffRamWe),
515
        .ram_oe(ffRamOe),
516
        .ram_lb(ffRamLb),
517
        .ram_ub(ffRamUb),
518
        .ram_a(ffRamAD),
519
        .ram_d(ffRamDB),
520
 
521
        .ram_weh(ffRamWeh),
522
 
523
        // Flash connections
524
        .flash_ce(ffFlashCe),
525
        .flash_rp(ffFlashRp),
526
        .flash_st(flash_st)
527
);
528
 
529
// Bitmap controller
530
// 416 x 262 - 8bpp
531
//
532
// Responds to address range:   
533
//      FFF_FFDA_B0xx
534
// Uses memory in the range
535
//  000_0002_0000 to 000_0003_FFFF
536
// for the bitmap display
537
//
538
 
539
rtfBitmapController u4
540
(
541
        .rst_i(rst),
542
        .clk_i(clk25),
543
 
544
        .bte_o(),
545
        .cti_o(vcti),
546
        .cyc_o(vcyc_o),
547
        .stb_o(vstb_o),
548
        .ack_i(vack_i),
549
        .adr_o(vadr_o),
550
        .dat_i(vdat_i),
551
 
552
        .vclk(video_clk),
553
        .eol(eol),
554
        .eof(eof),
555
        .blank(blank),
556
        .rgbo(bm_rgbo),
557
        .page(1'b0)
558
);
559
 
560
// Text controller overlays bitmap controller output
561
 
562
rtfTextController tc1
563
(
564
        .rst_i(rst),
565
        .clk_i(clk25),
566
 
567
        .cyc_i(sys_cyc),
568
        .stb_i(sys_stb),
569
        .ack_o(tc_ack),
570
        .we_i(sys_we),
571
        .sel_i(sys_sel),
572
        .adr_i({12'hFFF,cpu_adr}),
573
        .dat_i(dbo),
574
        .dat_o(tc_dbo),
575
 
576
        .lp(),
577
        .curpos(),
578
        .vclk(video_clk),
579
        .eol(eol),
580
        .eof(eof),
581
        .blank(blank),
582
        .border(),
583
        .rgbIn({bm_rgbo[7:5],5'd0,bm_rgbo[4:2],5'd0,bm_rgbo[1:0],6'b0}),
584
        .rgbOut(tx_rgbo)
585
);
586
 
587
rtfSpriteController sc1
588
(
589
    // Bus Slave interface
590
    //------------------------------
591
    // Slave signals
592
        .rst_i(rst),
593
        .clk_i(clk25),
594
        .s_cyc_i(sys_cyc),
595
        .s_stb_i(sys_stb),
596
        .s_ack_o(sc_ack),
597
        .s_we_i(sys_we),
598
        .s_sel_i(sys_sel),
599
        .s_adr_i({12'hFFF,adr}),
600
        .s_dat_i(dbo),
601
        .s_dat_o(sc_dat_o),
602
        .vol_o(),                       // volatile register
603
        //------------------------------
604
        // Bus Master Signals
605
        .m_soc_o(),     // start of cycle
606
        .m_cyc_o(sp_cyc_o),     // cycle is valid
607
        .m_stb_o(sp_stb_o),     // strobe output
608
        .m_ack_i(sp_ack_i),     // input data is ready
609
        .m_we_o(sp_we_o),               // write (always inactive)
610
        .m_sel_o(sp_sel_o),     // byte select
611
        .m_adr_o(sp_adr_o),     // DMA address
612
        .m_dat_i(sp_dat_i),     // data input
613
        .m_dat_o(sp_dat_o),     // data output (always zero)
614
        //--------------------------
615
        .vclk(video_clk),
616
        .hSync(eol),
617
        .vSync(eof),
618
        .blank(blank),
619
        .rgbIn(tx_rgbo),
620
        .rgbOut(sc_rgbo),
621
        .irq()
622
);
623
 
624
assign rgbo =
625
        swt[0] ? {dsc_rgbo[14:10],3'b100,dsc_rgbo[9:5],3'b100,dsc_rgbo[4:0],3'b100} :
626
        swt[1] ? {tx_rgbo[23:0]} :
627
        swt[2] ? {sc_rgbo[23:0]} :
628
                     {bm_rgbo[7:5],5'd0,bm_rgbo[4:2],5'd0,bm_rgbo[1:0],6'b0};
629
 
630
wire [7:0] ds1307dbo;
631
 
632
wire cs_ds1307 = sys_cyc && sys_stb && (cpu_adr==24'hFFD8_03);
633
wire ds1307ack;
634
 
635
reg [3:0] dp;
636
// Seven segment LED driver
637
seven_seg #(16666667) ssd0
638
(
639
        .rst(rst),                              // reset
640
        .clk(clk25),            // clock
641
        .dp(dp),
642
        .val(valreg),
643
//      .val(ssval),
644
        .ssLedAnode(an),
645
        .ssLedSeg(ssg)
646
);
647
 
648
// ADSR Sound generator
649
// 
650
PSG16 #(17) upsg1
651
(
652
        .rst_i(rst),
653
        .clk_i(clk25),
654
        .cyc_i(sys_cyc),
655
        .stb_i(sys_stb),
656
        .ack_o(psg_ack),
657
        .we_i(sys_we),
658
        .sel_i(sys_sel),
659
        .adr_i({12'hFFF,cpu_adr}),
660
        .dat_i(dbo),
661
        .dat_o(psg_dbo),
662
        .vol_o(),
663
 
664
        .bg(),
665
        .m_cyc_o(psg_cyc),
666
        .m_stb_o(psg_stb),
667
        .m_ack_i(),
668
        .m_we_o(psg_we),
669
        .m_sel_o(psg_sel),
670
        .m_adr_o(),
671
        .m_dat_i(),
672
 
673
        .o(psg_o)
674
);
675
 
676
dac121s101 udac1
677
(
678
        .rst_i(rst),
679
        .clk_i(clk25),
680
        .cyc_i(1'b1),
681
        .stb_i(1'b1),
682
        .ack_o(),
683
        .we_i(1'b1),
684
        .dat_i(psg_o),
685
        .sclk(dac_sclk),
686
        .sync(dac_sync),
687
        .d(dac_d)
688
);
689
 
690
 
691
rtfRandom u13
692
(
693
        .rst_i(rst),
694
        .clk_i(clk25),
695
        .cyc_i(sys_cyc),
696
        .stb_i(sys_stb),
697
        .ack_o(rnd_ack),
698
        .we_i(sys_we),
699
        .adr_i({12'hFFF,cpu_adr}),
700
        .dat_i(dbo),
701
        .dat_o(rnd_dbo),
702
        .vol_o()
703
);
704
 
705
rtfGraphicsAccelerator u14
706
(
707
        .rst_i(rst),
708
        .clk_i(clk25),
709
 
710
        .s_cyc_i(sys_cyc),
711
        .s_stb_i(sys_stb),
712
        .s_we_i(sys_we),
713
        .s_ack_o(gra_ack),
714
        .s_sel_i(sys_sel),
715
        .s_adr_i(cpu_adr),
716
        .s_dat_i(dbo),
717
        .s_dat_o(),
718
 
719
        .m_cyc_o(gr_cyc_o),
720
        .m_stb_o(gr_stb_o),
721
        .m_we_o(gr_we_o),
722
        .m_ack_i(gr_ack_i),
723
        .m_sel_o(gr_sel_o),
724
        .m_adr_o(gr_adr_o),
725
        .m_dat_i(gr_dat_i),
726
        .m_dat_o(gr_dat_o)
727
);
728
 
729
// dtack
730
// for high whenever address strobe goes inactive
731
//
732
reg [4:0] stkdt;
733
always @(posedge clk25)
734
        if (rst) begin
735
                stkdt <= 5'b00000;
736
        end
737
        else begin
738
                if (cs_stk & !ulds)
739
                        stkdt <= {stkdt,1'b1};
740
                else
741
                        stkdt <= 5'd0;
742
        end
743
wire stk_dtack = !stkdt[3] | ulds;
744
 
745
assign rom_dtack = !cs_rom;
746
assign vec_dtack = !cs_vec;
747
 
748
assign dtack = ulds | (
749
          rom_dtack
750
        & vec_dtack
751
        & ram_dtack
752
        & !tc_ack
753
        & !ackLoadedBit
754
//      & !dsc_ack
755
        & !kbd_ack
756
        & !uart_ack
757
        & !psg_ack
758
        & !rnd_ack
759
//      & !tmp_ack
760
        & !gra_ack
761
        & !sc_ack
762
        & stk_dtack
763
//      & !ds1307ack
764
        );
765
 
766
reg pulse1000HzB;
767
always @(posedge clk25)
768
if (rst) begin
769
        pulse1000HzB <= 1'b0;
770
end
771
else begin
772
        if (pulse1000Hz)
773
                pulse1000HzB <= 1'b1;
774
        else begin
775
        if (cpu_adr==32'hFFFF0000)
776
                pulse1000HzB <= 1'b0;
777
        end
778
end
779
 
780
wire [2:0] ipl;
781
 
782
VT148 u11
783
(
784
        .en(1'b0),
785
        .i0(1'b1),
786
        .i1(1'b1),
787
        .i2(1'b1),
788
        .i3(1'b1),
789
        .i4(1'b1),
790
        .i5(1'b1),
791
        .i6(!pulse1000HzB),
792
        .i7(!kbd_rst),
793
        .o(ipl),
794
        .gs(),
795
        .eo()
796
);
797
 
798
 
799
reg [7:0] ThreadNdx;
800
always @(posedge clk25)
801
if (rst)
802
        ThreadNdx <= 8'h00;
803
else begin
804
        if (csThreadNdx && !rw)
805
                ThreadNdx <= dbi[7:0];
806
end
807
always @(cpu_adr)
808
if (cpu_adr[31:8]==24'h000100)
809
        adr <= {16'h0001,ThreadNdx,cpu_adr[7:0]};
810
else
811
        adr <= cpu_adr;
812
 
813
//always @(cpu_adr) adr <= cpu_adr;
814
 
815
TG68 u10
816
(
817
        .clk(clk25),
818
        .reset(!rst),
819
        .clkena_in(1'b1),
820
        .IPL(ipl),
821
        .dtack(dtack),
822
        .addr(cpu_adr),
823
        .data_in(dbi),
824
        .data_out(dbo),
825
        .as(as),
826
        .uds(uds),
827
        .lds(lds),
828
        .rw(rw),
829
        .drive_data()
830
);
831
 
832
wire [15:0] bootromo;
833
wire [15:0] sysstko;
834
 
835
bootrom ubootrom
836
(
837
        .clk(clk25),
838
        .adr(adr),
839
        .romo(bootromo)
840
);
841
 
842
RAMB16_S18 SYSSTACK0
843
(
844
        .CLK(clk25),
845
        .ADDR(adr[10:1]),
846
        .DI(dbo),
847
        .DIP(2'b11),
848
        .DO(sysstko),
849
        .EN(cs_stk & !ulds),
850
        .WE(!rw),
851
        .SSR(1'b0)
852
);
853
 
854
always @(adr or kbd_dbo or tc_dbo or cdat_i or
855
        cs_rom or cs_vec or uart_dbo or rnd_dbo or tc_dbo or psg_dbo or
856
        bootromo or ram_dat or bmc_dbo or saTrigger or startAddress)
857
        if (cs_rom) begin
858
                casex(adr[15:0])
859
                16'b0001_xxxx_xxxx_xxxx:        dbi <= bootromo;
860
                16'b0010_xxxx_xxxx_xxxx:        dbi <= bootromo;
861
                16'b0011_xxxx_xxxx_xxxx:        dbi <= bootromo;
862
                default:        dbi <= 16'h4e71;
863
                endcase
864
        end
865
        else if (cs_vec) begin
866
                case(adr[15:0])
867
                16'h0000:       dbi <= 16'hFFFE;        // Reset SSP
868
                16'h0002:       dbi <= 16'h07FC;
869
                16'h0004:       dbi <= 16'hFFFF;        // Reset PC
870
                16'h0006:       dbi <= 16'h1100;
871
                // vectors
872
                16'hFFF0:       dbi <= 16'd31;
873
                16'hFFF2:       dbi <= 16'd30;
874
                16'hFFF4:       dbi <= 16'd29;
875
                16'hFFF6:       dbi <= 16'd28;
876
                16'hFFF8:       dbi <= 16'd28;
877
                16'hFFFA:       dbi <= 16'd29;
878
                16'hFFFC:       dbi <= 16'd30;
879
                16'hFFFE:       dbi <= 16'd31;
880
                default:        dbi <= 16'h3000;
881
                endcase
882
        end
883
        else begin
884
                casex(adr & 32'hFFFFFFFE)
885
                32'h00xx_xxxx:  dbi <= ram_dat;
886
                32'hFFDC_000x:  dbi <= kbd_dbo;
887
                32'hFFDC_0A0x:  dbi <= {2{uart_dbo}};
888
                32'hFFDC_0C0x:  dbi <= rnd_dbo;
889
                32'hFFD0_xxxx:  dbi <= tc_dbo;
890
                32'hFFD1_xxxx:  dbi <= tc_dbo;
891
                32'hFFD2_xxxx:  dbi <= tc_dbo;
892
//              32'hFFD8_xxxx:  dbi <= sc_dat_o;
893
                32'hFFDA_00xx:  dbi <= tc_dbo;
894
                32'hFFD4_00xx:  dbi <= psg_dbo;
895
                32'hFFDD_0000:  dbi <= {16{saTrigger}};
896
                32'hFFDD_0004:  dbi <= startAddress[31:16];
897
                32'hFFDD_0006:  dbi <= startAddress[15:0];
898
                32'hFFDD_0008:  dbi <= {2{ThreadNdx}};
899
                32'hFFFE_0xxx:  dbi <= sysstko;
900
                default:        dbi <= 16'h4e71;
901
                endcase
902
        end
903
 
904
always @(posedge clk25 or posedge rst)
905
        if (rst) valreg <= 16'h8765;
906
        else begin
907
        if (1'b1) begin
908
                dp <= {cs_rom,cs_vec};
909
                valreg <= btn[1] ? adr[31:16] : adr[15:0];
910
        end
911
        end
912
 
913
endmodule

powered by: WebSVN 2.1.0

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