Subversion Repositories ngs

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 lvd 1
// part of NeoGS project (c) 2007-2008 NedoPC
2
//
3
// main top-level module
4
 
5
module main(
6
 
7
        clk_fpga,  // clocks
8
        clk_24mhz, //
9
 
10
        clksel0, // clock selection
11
        clksel1, //
12
 
13
        warmres_n, // warm reset
14
 
15
 
16
        d, // Z80 data bus
17
        a, // Z80 address bus
18
 
19
        iorq_n,   // Z80 control signals
20
        mreq_n,   //
21
        rd_n,     //
22
        wr_n,     //
23
        m1_n,     //
24
        int_n,    //
25
        nmi_n,    //
26
        busrq_n,  //
27
        busak_n,  //
28
        z80res_n, //
29
 
30
 
31
        mema14,   // memory control
32
        mema15,   //
33
        mema16,   //
34
        mema17,   //
35
        mema18,   //
36
        ram0cs_n, //
37
        ram1cs_n, //
38
        ram2cs_n, //
39
        ram3cs_n, //
40
        romcs_n,  //
41
        memoe_n,  //
42
        memwe_n,  //
43
 
44
 
45
        zxid,        // zxbus signals
46
        zxa,         //
47
        zxa14,       //
48
        zxa15,       //
49
        zxiorq_n,    //
50
        zxmreq_n,    //
51
        zxrd_n,      //
52
        zxwr_n,      //
53
        zxcsrom_n,   //
54
        zxblkiorq_n, //
55
        zxblkrom_n,  //
56
        zxgenwait_n, //
57
        zxbusin,     //
58
        zxbusena_n,  //
59
 
60
 
61
        dac_bitck, // audio-DAC signals
62
        dac_lrck,  //
63
        dac_dat,  //
64
 
65
 
66
        sd_clk, // SD card interface
67
        sd_cs,  //
68
        sd_do,  //
69
        sd_di,  //
70
        sd_wp,  //
71
        sd_det, //
72
 
73
 
74
        ma_clk, // control interface of MP3 chip
75
        ma_cs,
76
        ma_do,
77
        ma_di,
78
 
79
        mp3_xreset, // data interface of MP3 chip
80
        mp3_req,    //
81
        mp3_clk,    //
82
        mp3_dat,    //
83
        mp3_sync,   //
84
 
85
        led_diag // LED driver
86
 
87
);
88
 
89
 
90
// input-output description
91
 
92
        input clk_fpga;
93
        input clk_24mhz;
94
 
95
        output clksel0;
96
        output clksel1;
97
 
98
 
99
        input warmres_n;
100
 
101
        inout reg [7:0] d;
102
 
103
        inout reg [15:0]  a;
104
 
105
        input iorq_n;
106
        input mreq_n;
107
        input rd_n;
108
        input wr_n;
109
        input m1_n;
110
        output int_n;
111
        output nmi_n;
112
        output busrq_n;
113
        input busak_n;
114
        output reg z80res_n;
115
 
116
 
117
        output reg mema14;
118
        output reg mema15;
119
        output reg mema16;
120
        output reg mema17;
121
        output reg mema18;
122
        output reg ram0cs_n;
123
        output reg ram1cs_n;
124
        output reg ram2cs_n;
125
        output reg ram3cs_n;
126
        output reg romcs_n;
127
        output reg memoe_n;
128
        output reg memwe_n;
129
 
130
 
131
        inout [7:0] zxid;
132
        input [7:0] zxa;
133
        input zxa14;
134
        input zxa15;
135
        input zxiorq_n;
136
        input zxmreq_n;
137
        input zxrd_n;
138
        input zxwr_n;
139
        input zxcsrom_n;
140
        output zxblkiorq_n;
141
        output zxblkrom_n;
142
        output zxgenwait_n;
143
        output zxbusin;
144
        output zxbusena_n;
145
 
146
 
147
        output dac_bitck;
148
        output dac_lrck;
149
        output dac_dat;
150
 
151
 
152
        output sd_clk;
153
        output sd_cs;
154
        output sd_do;
155
        input sd_di;
156
        input sd_wp;
157
        input sd_det;
158
 
159
 
160
        output ma_clk;
161
        output ma_cs;
162
        output ma_do;
163
        input ma_di;
164
 
165
        output mp3_xreset;
166
        input mp3_req;
167
        output mp3_clk;
168
        output mp3_dat;
169
        output mp3_sync;
170
 
171
        output led_diag;
172
 
173
 
174
// global signals
175
 
176
        wire internal_reset_n; // internal reset for everything
177
 
178
 
179
// zxbus-ports interconnection
180
 
181
        wire rst_from_zx_n; // internal z80 reset
182
 
183
        wire [7:0] command_zx2gs;
184
        wire [7:0] data_zx2gs;
185
        wire [7:0] data_gs2zx;
186
        wire command_bit_2gs;
187
        wire command_bit_2zx;
188
        wire command_bit_wr;
189
        wire data_bit_2gs;
190
        wire data_bit_2zx;
191
        wire data_bit_wr;
192
 
193
// memmap-bus interconnection
194
        wire [18:14] memmap_a;
195
        wire [3:0] memmap_ramcs_n;
196
        wire memmap_romcs_n;
197
        wire memmap_memoe_n;
198
        wire memmap_memwe_n;
199
 
200
// dma-bus interconnection
201
        wire [20:0] mem_dma_addr;
202
        wire [7:0]  mem_dma_wd;
203
 
204
        wire mem_dma_bus;
205
        wire mem_dma_rnw;
206
        wire mem_dma_oe;
207
        wire mem_dma_we;
208
 
209
        wire dma_takeover_enabled;
210
 
211
        wire        dma_ack;
212
        wire        dma_end;
213
        wire        dma_req;
214
        wire [20:0] dma_addr;
215
        wire        dma_rnw;
216
        wire [7:0]  dma_rd;
217
        wire [7:0]  dma_wd;
218
 
219
        wire zx_dmaread,zx_dmawrite;
220
        wire zx_wait_ena;
221
 
222
        wire [7:0] dma_zxrd_data;
223
        wire [7:0] dma_zxwr_data;
224
 
225
 
226
        wire [7:0] dma_dout_zx;
227
        wire       dma_on_zx;
228
        wire       dma_select_zx;
229
 
230
        wire [7:0] dma_din_modules;
231
 
232
        wire [1:0] dma_regsel;
233
        wire       dma_wrstb;
234
 
235
 
236
// ports-memmap interconnection
237
        wire mode_ramro,mode_norom;
238
        wire [6:0] mode_pg0,mode_pg1;
239
 
240
// ports databus
241
        wire [7:0] ports_dout;
242
        wire ports_busin;
243
 
244
// ports-sound interconnection
245
        wire snd_wrtoggle;
246
        wire snd_datnvol;
247
        wire [2:0] snd_addr;
248
        wire [7:0] snd_data;
249
 
6 lvd 250
        wire mode_8chans,mode_pan4ch,mode_inv7b;
2 lvd 251
 
252
// ports-SPIs interconnection
253
 
254
        wire [7:0] md_din;
255
        wire [7:0] mc_din;
256
        wire [7:0] mc_dout;
257
        wire [7:0] sd_din;
258
        wire [7:0] sd_dout;
259
 
260
        wire mc_start;
261
        wire [1:0] mc_speed;
262
        wire mc_rdy;
263
 
264
        wire md_start;
265
        wire md_halfspeed;
266
 
267
        wire sd_start;
268
 
269
 
270
// LED related
271
 
272
        wire led_toggle;
273
 
274
 
275
 
276
 
277
 
278
 
279
// CODE STARTS
280
 
281
// reset handling
282
 
283
        resetter my_rst( .clk(clk_fpga),
284
                         .rst_in1_n( warmres_n ), .rst_in2_n( rst_from_zx_n ),
285
                         .rst_out_n( internal_reset_n ) );
286
 
287
        always @* // reset for Z80
288
        begin
289
                if( internal_reset_n == 1'b0 )
290
                        z80res_n <= 1'b0;
291
                else
292
                        z80res_n <= 1'bZ;
293
        end
294
 
295
 
296
 
297
 
298
// control Z80 busses & memory signals
299
 
300
 
301
//  data bus:
302
 
303
        assign dma_takeover_enabled = (~busak_n) & mem_dma_bus;
304
 
305
        always @*
306
        begin
307
                if( dma_takeover_enabled )
308
                begin
309
                        if( mem_dma_rnw )
310
                                d <= 8'bZZZZZZZZ;
311
                        else
312
                                d <= mem_dma_wd;
313
                end
314
                else if( (!m1_n) && (!iorq_n) )
315
                begin
316
                        d <= 8'hFF;
317
                end
318
                else
319
                begin
320
                        if( ports_busin==1'b1 ) // FPGA inputs on data bus
321
                                d <= 8'bZZZZZZZZ;
322
                        else // FPGA outputs
323
                                d <= ports_dout;
324
                end
325
        end
326
 
327
//  address bus (both Z80 and memmap module)
328
 
329
        always @*
330
        begin
331
                a[15:14] <= 2'bZZ;
332
 
333
                if( dma_takeover_enabled )
334
                begin
335
                        a[13:0] <= mem_dma_addr[13:0];
336
 
337
                        {mema18,mema17,mema16,mema15,mema14} <= mem_dma_addr[18:14];
338
 
339
                        {ram3cs_n,ram2cs_n,ram1cs_n,ram0cs_n} <= ~( 4'b0001<<mem_dma_addr[20:19] );
340
 
341
                        romcs_n <= 1'b1;
342
 
343
                        memoe_n <= mem_dma_oe;
344
                        memwe_n <= mem_dma_we;
345
                end
346
                else
347
                begin
348
                        a[13:0] <= 14'bZZ_ZZZZ_ZZZZ_ZZZZ;
349
 
350
                        {mema18,mema17,mema16,mema15,mema14} <= memmap_a[18:14];
351
 
352
                        ram0cs_n <= memmap_ramcs_n[0];
353
                        ram1cs_n <= memmap_ramcs_n[1];
354
                        ram2cs_n <= memmap_ramcs_n[2];
355
                        ram3cs_n <= memmap_ramcs_n[3];
356
 
357
                        romcs_n <= memmap_romcs_n;
358
 
359
                        memoe_n <= memmap_memoe_n;
360
                        memwe_n <= memmap_memwe_n;
361
                end
362
        end
363
 
364
 
365
 
366
 
367
// ZXBUS module
368
 
369
        zxbus my_zxbus( .cpu_clock(clk_fpga),
370
                        .rst_n(internal_reset_n),
371
                        .rst_from_zx_n(rst_from_zx_n),
372
 
373
                        .nmi_n(nmi_n),
374
 
375
                        .zxid(zxid),
376
                        .zxa(zxa),
377
                        .zxa14(zxa14),
378
                        .zxa15(zxa15),
379
                        .zxiorq_n(zxiorq_n),
380
                        .zxmreq_n(zxmreq_n),
381
                        .zxrd_n(zxrd_n),
382
                        .zxwr_n(zxwr_n),
383
                        .zxblkiorq_n(zxblkiorq_n),
384
                        .zxblkrom_n(zxblkrom_n),
385
                        .zxcsrom_n(zxcsrom_n),
386
                        .zxgenwait_n(zxgenwait_n),
387
                        .zxbusin(zxbusin),
388
                        .zxbusena_n(zxbusena_n),
389
 
390
                        .command_reg_out(command_zx2gs),
391
                        .data_reg_out(data_zx2gs),
392
                        .data_reg_in(data_gs2zx),
393
                        .command_bit(command_bit_2gs),
394
                        .command_bit_in(command_bit_2zx),
395
                        .command_bit_wr(command_bit_wr),
396
                        .data_bit(data_bit_2gs),
397
                        .data_bit_in(data_bit_2zx),
398
                        .data_bit_wr(data_bit_wr),
399
 
400
                        .wait_ena(zx_wait_ena),
401
                        .dma_on(dma_on_zx),
402
                        .dmaread(zx_dmaread),
403
                        .dmawrite(zx_dmawrite),
404
                        .dma_data_written(dma_zxwr_data),
405
                        .dma_data_toberead(dma_zxrd_data),
406
 
407
                        .led_toggle(led_toggle) );
408
 
409
 
410
 
411
 
412
// DMA modules
413
 
414
        dma_access my_dma( .clk(clk_fpga),
415
                           .rst_n(internal_reset_n),
416
 
417
                           .busrq_n(busrq_n),
418
                           .busak_n(busak_n),
419
 
420
                           .mem_dma_addr(mem_dma_addr),
421
                           .mem_dma_wd(mem_dma_wd),
422
                           .mem_dma_rd(d),
423
                           .mem_dma_bus(mem_dma_bus),
424
                           .mem_dma_rnw(mem_dma_rnw),
425
                           .mem_dma_oe(mem_dma_oe),
426
                           .mem_dma_we(mem_dma_we),
427
 
428
                           .dma_req(dma_req),
429
                           .dma_ack(dma_ack),
430
                           .dma_end(dma_end),
431
                           .dma_rnw(dma_rnw),
432
                           .dma_rd(dma_rd),
433
                           .dma_wd(dma_wd),
434
                           .dma_addr(dma_addr) );
435
 
436
        dma_zx zxdma( .clk(clk_fpga),
437
                      .rst_n(internal_reset_n),
438
 
439
                      .module_select(dma_select_zx),
440
                      .write_strobe(dma_wrstb),
441
                      .regsel(dma_regsel),
442
 
443
                      .din(dma_din_modules),
444
                      .dout(dma_dout_zx),
445
 
446
                      .wait_ena(zx_wait_ena),
447
                      .dma_on(dma_on_zx),
448
                      .zxdmaread(zx_dmaread),
449
                      .zxdmawrite(zx_dmawrite),
450
                      .dma_wr_data(dma_zxwr_data),
451
                      .dma_rd_data(dma_zxrd_data),
452
 
453
                      .dma_req(dma_req),
454
                      .dma_ack(dma_ack),
455
                      .dma_end(dma_end),
456
                      .dma_rnw(dma_rnw),
457
                      .dma_rd(dma_rd),
458
                      .dma_wd(dma_wd),
459
                      .dma_addr(dma_addr) );
460
 
461
 
462
 
463
 
464
// MEMMAP module
465
 
466
        memmap my_memmap( .a14(a[14]),
467
                          .a15(a[15]),
468
                          .mreq_n(mreq_n),
469
                          .rd_n(rd_n),
470
                          .wr_n(wr_n),
471
                          .mema14(memmap_a[14]),
472
                          .mema15(memmap_a[15]),
473
                          .mema16(memmap_a[16]),
474
                          .mema17(memmap_a[17]),
475
                          .mema18(memmap_a[18]),
476
 
477
                          .ram0cs_n(memmap_ramcs_n[0]),
478
                          .ram1cs_n(memmap_ramcs_n[1]),
479
                          .ram2cs_n(memmap_ramcs_n[2]),
480
                          .ram3cs_n(memmap_ramcs_n[3]),
481
                          .romcs_n(memmap_romcs_n),
482
                          .memoe_n(memmap_memoe_n),
483
                          .memwe_n(memmap_memwe_n),
484
 
485
                          .mode_ramro(mode_ramro),
486
                          .mode_norom(mode_norom),
487
                          .mode_pg0(mode_pg0),
488
                          .mode_pg1(mode_pg1) );
489
 
490
 
491
 
492
// PORTS module
493
 
494
        ports my_ports( .dout(ports_dout),
495
                        .din(d),
496
                        .busin(ports_busin),
497
                        .a(a),
498
                        .iorq_n(iorq_n),
499
                        .mreq_n(mreq_n),
500
                        .rd_n(rd_n),
501
                        .wr_n(wr_n),
502
 
503
                        .rst_n(internal_reset_n),
504
 
505
                        .cpu_clock(clk_fpga),
506
 
507
                        .clksel0(clksel0),
508
                        .clksel1(clksel1),
509
 
510
                        .snd_wrtoggle(snd_wrtoggle),
511
                        .snd_datnvol(snd_datnvol),
512
                        .snd_addr(snd_addr),
513
                        .snd_data(snd_data),
514
                        .mode_8chans(mode_8chans),
515
                        .mode_pan4ch(mode_pan4ch),
6 lvd 516
                        .mode_inv7b(mode_inv7b),
2 lvd 517
 
518
                        .command_port_input(command_zx2gs),
519
                        .command_bit_input(command_bit_2gs),
520
                        .command_bit_output(command_bit_2zx),
521
                        .command_bit_wr(command_bit_wr),
522
                        .data_port_input(data_zx2gs),
523
                        .data_port_output(data_gs2zx),
524
                        .data_bit_input(data_bit_2gs),
525
                        .data_bit_output(data_bit_2zx),
526
                        .data_bit_wr(data_bit_wr),
527
 
528
                        .mode_ramro(mode_ramro),
529
                        .mode_norom(mode_norom),
530
                        .mode_pg0(mode_pg0),
531
                        .mode_pg1(mode_pg1),
532
 
533
                        .md_din(md_din),
534
                        .md_start(md_start),
535
                        .md_dreq(mp3_req),
536
                        .md_halfspeed(md_halfspeed),
537
 
538
                        .mc_ncs(ma_cs),
539
                        .mc_xrst(mp3_xreset),
540
                        .mc_dout(mc_dout),
541
                        .mc_din(mc_din),
542
                        .mc_start(mc_start),
543
                        .mc_speed(mc_speed),
544
                        .mc_rdy(mc_rdy),
545
 
546
                        .sd_ncs(sd_cs),
547
                        .sd_wp(sd_wp),
548
                        .sd_det(sd_det),
549
                        .sd_din(sd_din),
550
                        .sd_dout(sd_dout),
551
                        .sd_start(sd_start),
552
 
553
 
554
                        .dma_din_modules(dma_din_modules),
555
                        .dma_regsel(dma_regsel),
556
                        .dma_wrstb(dma_wrstb),
557
                        //
558
                        .dma_dout_zx(dma_dout_zx),
559
                        .dma_select_zx(dma_select_zx),
560
 
561
 
562
                        .led(led_diag),
563
                        .led_toggle(led_toggle)
564
 
565
                        );
566
 
567
 
568
 
569
// SOUND_MAIN module
570
 
571
        sound_main my_sound_main( .clock(clk_24mhz),
572
 
573
                                  .mode_8chans(mode_8chans),
574
                                  .mode_pan4ch(mode_pan4ch),
6 lvd 575
                                  .mode_inv7b(mode_inv7b),
2 lvd 576
 
577
                                  .in_wrtoggle(snd_wrtoggle),
578
                                  .in_datnvol(snd_datnvol),
579
                                  .in_wraddr(snd_addr),
580
                                  .in_data(snd_data),
581
 
582
                                  .dac_clock(dac_bitck),
583
                                  .dac_leftright(dac_lrck),
584
                                  .dac_data(dac_dat) );
585
 
586
 
587
 
588
// INTERRUPTS module
589
 
590
        interrupts my_interrupts( .clk_24mhz(clk_24mhz),
591
                                  .clk_z80(clk_fpga),
592
 
593
                                  .m1_n(m1_n),
594
                                  .iorq_n(iorq_n),
595
 
596
                                  .int_n(int_n) );
597
 
598
 
599
 
600
 
601
 
602
 
603
 
604
// MP3, SDcard spi modules
605
 
606
 
607
        spi2 spi_mp3_data( .clock(clk_fpga),
608
                           .sck(mp3_clk),
609
                           .sdo(mp3_dat),
610
                           .bsync(mp3_sync),
611
                           .din(md_din),
612
                           .start(md_start),
613
                           .speed( {1'b0,md_halfspeed} ),
614
                           .sdi(1'b0) );
615
 
616
        spi2 spi_mp3_control( .clock(clk_fpga),
617
                              .sck(ma_clk),
618
                              .sdo(ma_do),
619
                              .sdi(ma_di),
620
                              .din(mc_din),
621
                              .dout(mc_dout),
622
                              .start(mc_start),
623
                              .rdy(mc_rdy),
624
                              .speed(mc_speed) );
625
 
626
        spi2 spi_sd( .clock(clk_fpga),
627
                     .sck(sd_clk),
628
                     .sdo(sd_do),
629
                     .sdi(sd_di),
630
                     .din(sd_din),
631
                     .dout(sd_dout),
632
                     .start(sd_start),
633
                     .speed(2'b00) );
634
 
635
 
636
 
637
 
638
endmodule
639