Rev 737 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
826 | lvd | 1 | // ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014,2015,2016,2019 |
360 | lvd | 2 | // |
3 | // top-level |
||
4 | |||
668 | lvd | 5 | /* |
6 | This file is part of ZX-Evo Base Configuration firmware. |
||
7 | |||
8 | ZX-Evo Base Configuration firmware is free software: |
||
9 | you can redistribute it and/or modify it under the terms of |
||
10 | the GNU General Public License as published by |
||
11 | the Free Software Foundation, either version 3 of the License, or |
||
12 | (at your option) any later version. |
||
13 | |||
14 | ZX-Evo Base Configuration firmware is distributed in the hope that |
||
15 | it will be useful, but WITHOUT ANY WARRANTY; without even |
||
16 | the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
||
17 | See the GNU General Public License for more details. |
||
18 | |||
19 | You should have received a copy of the GNU General Public License |
||
20 | along with ZX-Evo Base Configuration firmware. |
||
21 | If not, see <http://www.gnu.org/licenses/>. |
||
22 | */ |
||
23 | |||
24 | `include "../include/tune.v" |
||
25 | |||
4 | lvd | 26 | module top( |
27 | |||
28 | // clocks |
||
29 | input fclk, |
||
30 | output clkz_out, |
||
31 | input clkz_in, |
||
32 | |||
33 | // z80 |
||
34 | input iorq_n, |
||
35 | input mreq_n, |
||
36 | input rd_n, |
||
37 | input wr_n, |
||
38 | input m1_n, |
||
39 | input rfsh_n, |
||
40 | output int_n, |
||
41 | output nmi_n, |
||
42 | output wait_n, |
||
43 | output res, |
||
44 | |||
45 | inout [7:0] d, |
||
46 | input [15:0] a, |
||
47 | |||
48 | // zxbus and related |
||
49 | output csrom, |
||
50 | output romoe_n, |
||
51 | output romwe_n, |
||
52 | |||
53 | output rompg0_n, |
||
54 | output dos_n, // aka rompg1 |
||
55 | output rompg2, |
||
56 | output rompg3, |
||
57 | output rompg4, |
||
58 | |||
59 | input iorqge1, |
||
60 | input iorqge2, |
||
61 | output iorq1_n, |
||
62 | output iorq2_n, |
||
63 | |||
64 | // DRAM |
||
65 | inout [15:0] rd, |
||
66 | output [9:0] ra, |
||
67 | output rwe_n, |
||
68 | output rucas_n, |
||
69 | output rlcas_n, |
||
70 | output rras0_n, |
||
71 | output rras1_n, |
||
72 | |||
73 | // video |
||
74 | output [1:0] vred, |
||
75 | output [1:0] vgrn, |
||
76 | output [1:0] vblu, |
||
77 | |||
78 | output vhsync, |
||
79 | output vvsync, |
||
80 | output vcsync, |
||
81 | |||
82 | // AY control and audio/tape |
||
83 | output ay_clk, |
||
84 | output ay_bdir, |
||
85 | output ay_bc1, |
||
86 | |||
87 | output beep, |
||
88 | |||
89 | // IDE |
||
90 | output [2:0] ide_a, |
||
91 | inout [15:0] ide_d, |
||
92 | |||
93 | output ide_dir, |
||
94 | |||
95 | input ide_rdy, |
||
96 | |||
97 | output ide_cs0_n, |
||
98 | output ide_cs1_n, |
||
99 | output ide_rs_n, |
||
100 | output ide_rd_n, |
||
101 | output ide_wr_n, |
||
102 | |||
103 | // VG93 and diskdrive |
||
104 | output vg_clk, |
||
105 | |||
106 | output vg_cs_n, |
||
107 | output vg_res_n, |
||
108 | |||
109 | output vg_hrdy, |
||
110 | output vg_rclk, |
||
111 | output vg_rawr, |
||
112 | output [1:0] vg_a, // disk drive selection |
||
113 | output vg_wrd, |
||
114 | output vg_side, |
||
115 | |||
116 | input step, |
||
117 | input vg_sl, |
||
118 | input vg_sr, |
||
119 | input vg_tr43, |
||
120 | input rdat_b_n, |
||
121 | input vg_wf_de, |
||
122 | input vg_drq, |
||
123 | input vg_irq, |
||
124 | input vg_wd, |
||
125 | |||
126 | // serial links (atmega-fpga, sdcard) |
||
127 | output sdcs_n, |
||
128 | output sddo, |
||
129 | output sdclk, |
||
130 | input sddi, |
||
131 | |||
132 | input spics_n, |
||
133 | input spick, |
||
134 | input spido, |
||
135 | output spidi, |
||
136 | output spiint_n |
||
137 | ); |
||
138 | |||
139 | wire dos; |
||
140 | |||
141 | |||
142 | wire zclk; // z80 clock for short |
||
143 | |||
200 | lvd | 144 | wire zpos,zneg; |
145 | |||
4 | lvd | 146 | wire rst_n; // global reset |
147 | |||
148 | wire rrdy; |
||
149 | wire [15:0] rddata; |
||
150 | |||
151 | wire [4:0] rompg; |
||
152 | |||
153 | wire [7:0] zports_dout; |
||
154 | wire zports_dataout; |
||
155 | wire porthit; |
||
156 | |||
699 | lvd | 157 | wire csrom_int; |
67 | lvd | 158 | |
699 | lvd | 159 | |
67 | lvd | 160 | wire [39:0] kbd_data; |
161 | wire [ 7:0] mus_data; |
||
110 | lvd | 162 | wire kbd_stb,mus_xstb,mus_ystb,mus_btnstb,kj_stb; |
67 | lvd | 163 | |
164 | wire [ 4:0] kbd_port_data; |
||
110 | lvd | 165 | wire [ 4:0] kj_port_data; |
67 | lvd | 166 | wire [ 7:0] mus_port_data; |
167 | |||
168 | |||
88 | lvd | 169 | |
170 | |||
171 | wire [7:0] wait_read,wait_write; |
||
172 | wire wait_rnw; |
||
173 | wire wait_start_gluclock; |
||
228 | lvd | 174 | wire wait_start_comport; |
88 | lvd | 175 | wire wait_end; |
176 | wire [7:0] gluclock_addr; |
||
228 | lvd | 177 | wire [2:0] comport_addr; |
88 | lvd | 178 | wire [6:0] waits; |
179 | |||
180 | |||
181 | |||
182 | |||
98 | lvd | 183 | // config signals |
826 | lvd | 184 | wire [7:0] not_used0; |
185 | wire [7:0] not_used1; |
||
98 | lvd | 186 | wire cfg_vga_on; |
684 | lvd | 187 | // |
188 | wire [1:0] modes_raster; |
||
189 | wire mode_contend_type = 1'b0; // 48/128/+2 or +2a/+3 TODO: take these signals from somewhere |
||
190 | wire mode_contend_ena = 1'b1; // contention enable |
||
191 | wire contend; |
||
826 | lvd | 192 | // |
193 | wire [3:0] fdd_mask; |
||
88 | lvd | 194 | |
425 | lvd | 195 | // nmi signals |
196 | wire gen_nmi; |
||
197 | wire clr_nmi; |
||
198 | wire in_nmi; |
||
576 | lvd | 199 | wire [1:0] set_nmi; |
200 | wire imm_nmi; |
||
737 | lvd | 201 | wire nmi_buf_clr; |
98 | lvd | 202 | |
576 | lvd | 203 | // breakpoint signals |
204 | wire brk_ena; |
||
205 | wire [15:0] brk_addr; |
||
98 | lvd | 206 | |
207 | |||
4 | lvd | 208 | wire tape_in; |
209 | |||
210 | wire [15:0] ideout; |
||
211 | wire [15:0] idein; |
||
212 | wire idedataout; |
||
213 | |||
214 | |||
215 | wire [7:0] zmem_dout; |
||
216 | wire zmem_dataout; |
||
217 | |||
218 | |||
219 | |||
220 | reg [3:0] ayclk_gen; |
||
221 | |||
222 | |||
223 | wire [7:0] received; |
||
224 | wire [7:0] tobesent; |
||
225 | |||
226 | |||
227 | wire intrq,drq; |
||
228 | wire vg_wrFF; |
||
229 | |||
230 | |||
668 | lvd | 231 | wire up_ena; |
232 | wire [ 5:0] up_paladdr; |
||
233 | wire [ 7:0] up_paldata; |
||
234 | wire up_palwr; |
||
4 | lvd | 235 | |
236 | |||
237 | |||
668 | lvd | 238 | |
4 | lvd | 239 | assign zclk = clkz_in; |
240 | |||
241 | |||
242 | // RESETTER |
||
243 | wire genrst; |
||
244 | |||
245 | resetter myrst( .clk(fclk), |
||
134 | ddp | 246 | .rst_in_n(~genrst), |
247 | .rst_out_n(rst_n) ); |
||
4 | lvd | 248 | defparam myrst.RST_CNT_SIZE = 6; |
249 | |||
250 | |||
123 | lvd | 251 | |
425 | lvd | 252 | assign nmi_n=gen_nmi ? 1'b0 : 1'bZ; |
123 | lvd | 253 | |
4 | lvd | 254 | assign res= ~rst_n; |
255 | |||
256 | |||
257 | |||
258 | |||
259 | |||
284 | lvd | 260 | |
261 | |||
262 | |||
4 | lvd | 263 | assign ide_rs_n = rst_n; |
264 | |||
265 | assign ide_d = idedataout ? ideout : 16'hZZZZ; |
||
266 | assign idein = ide_d; |
||
267 | |||
268 | assign ide_dir = ~idedataout; |
||
269 | |||
270 | |||
271 | |||
272 | |||
30 | lvd | 273 | |
274 | wire [7:0] peff7; |
||
275 | wire [7:0] p7ffd; |
||
276 | |||
277 | |||
200 | lvd | 278 | wire romrw_en; |
279 | wire cpm_n; |
||
395 | lvd | 280 | wire fnt_wr; |
30 | lvd | 281 | |
200 | lvd | 282 | |
283 | |||
30 | lvd | 284 | wire cpu_req,cpu_rnw,cpu_wrbsel,cpu_strobe; |
285 | wire [20:0] cpu_addr; |
||
286 | wire [15:0] cpu_rddata; |
||
287 | wire [7:0] cpu_wrdata; |
||
288 | |||
340 | lvd | 289 | wire cbeg,post_cbeg,pre_cend,cend; |
30 | lvd | 290 | |
340 | lvd | 291 | wire go; |
30 | lvd | 292 | |
293 | |||
543 | lvd | 294 | // AVR SDcard control |
295 | wire avr_lock_claim, |
||
296 | avr_lock_grant, |
||
297 | avr_sdcs_n, |
||
298 | avr_sd_start; |
||
299 | wire [7:0] avr_sd_datain; |
||
300 | wire [7:0] avr_sd_dataout; |
||
30 | lvd | 301 | |
543 | lvd | 302 | // ZX SDcard control |
303 | wire zx_sdcs_n_val, |
||
304 | zx_sdcs_n_stb, |
||
305 | zx_sd_start; |
||
306 | wire [7:0] zx_sd_datain; |
||
307 | wire [7:0] zx_sd_dataout; |
||
30 | lvd | 308 | |
543 | lvd | 309 | |
284 | lvd | 310 | wire tape_read; // data for tapein |
30 | lvd | 311 | |
284 | lvd | 312 | wire beeper_mux; // what is mixed to FPGA beeper output - beeper (0) or tapeout (1) |
213 | lvd | 313 | |
340 | lvd | 314 | wire [2:0] atm_scr_mode; |
284 | lvd | 315 | |
471 | lvd | 316 | wire atm_turbo; |
340 | lvd | 317 | |
471 | lvd | 318 | |
360 | lvd | 319 | wire beeper_wr, covox_wr; |
340 | lvd | 320 | |
321 | |||
284 | lvd | 322 | |
425 | lvd | 323 | wire [5:0] palcolor; // palette readback |
284 | lvd | 324 | |
325 | |||
326 | |||
425 | lvd | 327 | |
467 | lvd | 328 | wire [1:0] int_turbo; |
329 | wire cpu_next; |
||
330 | wire cpu_stall; |
||
331 | |||
332 | wire external_port; |
||
333 | |||
334 | |||
335 | |||
4 | lvd | 336 | //AY control |
337 | always @(posedge fclk) |
||
338 | begin |
||
339 | ayclk_gen <= ayclk_gen + 4'd1; |
||
340 | end |
||
341 | |||
342 | assign ay_clk = ayclk_gen[3]; |
||
343 | |||
344 | |||
345 | |||
346 | |||
347 | |||
200 | lvd | 348 | // fix ATM2-style ROM addressing for PENT-like ROM layout. |
349 | // this causes compications when writing to the flashROM from Z80 |
||
350 | // and need to split and re-build old ATM romfiles before burning in |
||
351 | // flash |
||
256 | lvd | 352 | // wire [1:0] adr_fix; |
353 | // assign adr_fix = ~{ rompg[0], rompg[1] }; |
||
354 | // assign rompg0_n = ~adr_fix[0]; |
||
355 | // assign dos_n = adr_fix[1]; |
||
356 | // assign rompg2 = 1'b0;//rompg[2]; |
||
357 | // assign rompg3 = 1'b0;//rompg[3]; |
||
358 | // assign rompg4 = 1'b0;//rompg[4]; |
||
4 | lvd | 359 | |
256 | lvd | 360 | assign rompg0_n = ~rompg[0]; |
361 | assign dos_n = rompg[1]; |
||
362 | assign rompg2 = rompg[2]; |
||
363 | assign rompg3 = rompg[3]; |
||
364 | assign rompg4 = rompg[4]; |
||
4 | lvd | 365 | |
200 | lvd | 366 | wire [3:0] zclk_stall; |
4 | lvd | 367 | |
467 | lvd | 368 | zclock zclock |
369 | ( |
||
684 | lvd | 370 | .fclk (fclk ), |
371 | .zclk (zclk ), |
||
372 | .rst_n(rst_n), |
||
373 | |||
374 | .a(a), |
||
375 | |||
376 | .mreq_n(mreq_n), |
||
377 | .iorq_n(iorq_n), |
||
378 | .m1_n (m1_n ), |
||
379 | .rfsh_n(rfsh_n), |
||
380 | |||
381 | .modes_raster (modes_raster ), |
||
382 | .mode_contend_type(mode_contend_type), |
||
383 | .mode_contend_ena (mode_contend_ena ), |
||
384 | .mode_7ffd_bits (p7ffd[2:0] ), |
||
385 | .contend (contend ), |
||
386 | |||
387 | .zclk_out(clkz_out), |
||
388 | |||
389 | .zpos(zpos), |
||
390 | .zneg(zneg), |
||
391 | |||
392 | |||
393 | .pre_cend(pre_cend), |
||
394 | .cbeg (cbeg ), |
||
395 | |||
396 | .zclk_stall( cpu_stall | (|zclk_stall) ), |
||
397 | .turbo ( {atm_turbo,~(peff7[4])} ), |
||
398 | .int_turbo (int_turbo ), |
||
399 | |||
400 | .external_port(external_port) |
||
467 | lvd | 401 | ); |
4 | lvd | 402 | |
403 | |||
404 | |||
405 | wire [7:0] dout_ram; |
||
406 | wire ena_ram; |
||
407 | wire [7:0] dout_ports; |
||
408 | wire ena_ports; |
||
409 | |||
410 | |||
287 | ddp | 411 | wire [3:0] border; |
30 | lvd | 412 | |
413 | wire drive_ff; |
||
699 | lvd | 414 | wire drive_00; |
30 | lvd | 415 | |
200 | lvd | 416 | |
340 | lvd | 417 | wire atm_palwr; |
418 | wire [5:0] atm_paldata; |
||
200 | lvd | 419 | |
543 | lvd | 420 | wire [7:0] fontrom_readback; |
421 | |||
422 | |||
423 | |||
424 | |||
340 | lvd | 425 | wire int_start; |
200 | lvd | 426 | |
427 | |||
699 | lvd | 428 | |
4 | lvd | 429 | // data bus out: either RAM data or internal ports data or 0xFF with unused ports |
722 | lvd | 430 | // assign d = ena_ram ? dout_ram : ( ena_ports ? dout_ports : ( (drive_ff|drive_00) ? {8{drive_ff}} : 8'bZZZZZZZZ ) ); |
4 | lvd | 431 | |
722 | lvd | 432 | wire [7:0] d_pre_out; |
433 | wire d_ena; |
||
434 | |||
435 | assign d_pre_out = ({8{ena_ram&(~drive_00)}} & dout_ram) | ({8{ena_ports}} & dout_ports) | {8{drive_ff}} ; |
||
436 | assign d_ena = (ena_ram|ena_ports|drive_ff|drive_00); |
||
437 | // |
||
438 | assign d = d_ena ? d_pre_out : 8'bZZZZ_ZZZZ; |
||
439 | // |
||
699 | lvd | 440 | assign csrom = csrom_int && !drive_00; |
4 | lvd | 441 | |
442 | |||
443 | zbus zxbus( .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .m1_n(m1_n), |
||
134 | ddp | 444 | .iorq1_n(iorq1_n), .iorq2_n(iorq2_n), .iorqge1(iorqge1), .iorqge2(iorqge2), |
445 | .porthit(porthit), .drive_ff(drive_ff) ); |
||
4 | lvd | 446 | |
447 | |||
448 | |||
200 | lvd | 449 | |
450 | ///////////////////////////////////// |
||
451 | // ATM memory pagers instantiation // |
||
452 | ///////////////////////////////////// |
||
453 | |||
454 | wire pager_off; |
||
455 | |||
456 | wire pent1m_ROM; |
||
457 | wire [ 5:0] pent1m_page; |
||
458 | wire pent1m_ram0_0; |
||
459 | wire pent1m_1m_on; |
||
460 | |||
461 | wire atmF7_wr_fclk; |
||
462 | |||
463 | wire [3:0] dos_turn_off, |
||
464 | dos_turn_on; |
||
465 | |||
466 | wire [ 7:0] page [0:3]; |
||
467 | wire [ 3:0] romnram; |
||
674 | lvd | 468 | wire [ 3:0] wrdisable; |
200 | lvd | 469 | |
425 | lvd | 470 | // for reading back data via xxBE port |
471 | wire [ 7:0] rd_pages [0:7]; |
||
472 | wire [ 7:0] rd_ramnrom; |
||
473 | wire [ 7:0] rd_dos7ffd; |
||
674 | lvd | 474 | wire [ 7:0] rd_wrdisables; |
425 | lvd | 475 | |
200 | lvd | 476 | generate |
477 | |||
478 | genvar i; |
||
479 | |||
480 | for(i=0;i<4;i=i+1) |
||
481 | begin : instantiate_atm_pagers |
||
674 | lvd | 482 | atm_pager #( .ADDR(i) ) atm_pager |
483 | ( |
||
484 | .rst_n(rst_n), |
||
485 | .fclk (fclk), |
||
486 | .zpos (zpos), |
||
487 | .zneg (zneg), |
||
488 | |||
489 | .za(a), |
||
490 | .zd(d), |
||
491 | .mreq_n(mreq_n), |
||
492 | .rd_n (rd_n), |
||
493 | .m1_n (m1_n), |
||
494 | |||
495 | .pager_off(pager_off), |
||
496 | |||
497 | .pent1m_ROM (pent1m_ROM), |
||
498 | .pent1m_page (pent1m_page), |
||
499 | .pent1m_ram0_0(pent1m_ram0_0), |
||
500 | .pent1m_1m_on (pent1m_1m_on), |
||
501 | |||
502 | |||
503 | .in_nmi(in_nmi), |
||
504 | |||
505 | .atmF7_wr(atmF7_wr_fclk), |
||
506 | |||
507 | .dos(dos), |
||
508 | |||
509 | .dos_turn_on (dos_turn_on[i]), |
||
510 | .dos_turn_off(dos_turn_off[i]), |
||
511 | |||
512 | .zclk_stall(zclk_stall[i]), |
||
513 | |||
514 | .page (page[i] ), |
||
515 | .romnram (romnram[i] ), |
||
684 | lvd | 516 | .wrdisable(wrdisable[i]), |
674 | lvd | 517 | |
518 | .rd_page0 (rd_pages[i ]), |
||
519 | .rd_page1 (rd_pages[i+4]), |
||
520 | |||
521 | .rd_ramnrom ( {rd_ramnrom [i+4], rd_ramnrom [i]} ), |
||
522 | .rd_dos7ffd ( {rd_dos7ffd [i+4], rd_dos7ffd [i]} ), |
||
523 | .rd_wrdisables( {rd_wrdisables[i+4], rd_wrdisables[i]} ) |
||
524 | ); |
||
684 | lvd | 525 | |
200 | lvd | 526 | end |
527 | |||
528 | endgenerate |
||
529 | |||
530 | |||
531 | /////////////////////////// |
||
532 | // DOS signal controller // |
||
533 | /////////////////////////// |
||
534 | |||
535 | zdos zdos( .rst_n(rst_n), |
||
536 | |||
537 | .fclk(fclk), |
||
538 | |||
539 | .dos_turn_on ( |dos_turn_on ), |
||
540 | .dos_turn_off( |dos_turn_off ), |
||
541 | |||
542 | .cpm_n(cpm_n), |
||
543 | |||
544 | .dos(dos) |
||
545 | ); |
||
546 | |||
547 | |||
548 | |||
549 | |||
550 | /////////////////////////// |
||
551 | // Z80 memory controller // |
||
552 | /////////////////////////// |
||
553 | |||
467 | lvd | 554 | zmem z80mem |
555 | ( |
||
556 | .fclk (fclk ), |
||
557 | .rst_n(rst_n), |
||
558 | |||
559 | .zpos(zpos), |
||
560 | .zneg(zneg), |
||
4 | lvd | 561 | |
467 | lvd | 562 | .cbeg (cbeg ), |
563 | .post_cbeg(post_cbeg), |
||
564 | .pre_cend (pre_cend ), |
||
565 | .cend (cend ), |
||
566 | |||
567 | .za (a ), |
||
568 | .zd_in (d ), |
||
569 | .zd_out(dout_ram), |
||
570 | .zd_ena(ena_ram ), |
||
571 | .m1_n (m1_n ), |
||
572 | .rfsh_n(rfsh_n ), |
||
573 | .iorq_n(iorq_n ), |
||
574 | .mreq_n(mreq_n ), |
||
575 | .rd_n (rd_n ), |
||
576 | .wr_n (wr_n ), |
||
4 | lvd | 577 | |
467 | lvd | 578 | .win0_romnram(romnram[0]), |
579 | .win1_romnram(romnram[1]), |
||
580 | .win2_romnram(romnram[2]), |
||
581 | .win3_romnram(romnram[3]), |
||
4 | lvd | 582 | |
467 | lvd | 583 | .win0_page(page[0]), |
584 | .win1_page(page[1]), |
||
585 | .win2_page(page[2]), |
||
586 | .win3_page(page[3]), |
||
4 | lvd | 587 | |
674 | lvd | 588 | .win0_wrdisable(wrdisable[0]), |
589 | .win1_wrdisable(wrdisable[1]), |
||
590 | .win2_wrdisable(wrdisable[2]), |
||
591 | .win3_wrdisable(wrdisable[3]), |
||
592 | |||
467 | lvd | 593 | .romrw_en(romrw_en), |
4 | lvd | 594 | |
467 | lvd | 595 | .rompg (rompg ), |
596 | .romoe_n(romoe_n), |
||
597 | .romwe_n(romwe_n), |
||
699 | lvd | 598 | .csrom (csrom_int), |
4 | lvd | 599 | |
467 | lvd | 600 | .cpu_req (cpu_req ), |
601 | .cpu_rnw (cpu_rnw ), |
||
602 | .cpu_wrbsel(cpu_wrbsel), |
||
603 | .cpu_strobe(cpu_strobe), |
||
604 | .cpu_addr (cpu_addr ), |
||
605 | .cpu_wrdata(cpu_wrdata), |
||
606 | .cpu_rddata(cpu_rddata), |
||
607 | .cpu_stall (cpu_stall ), |
||
608 | .cpu_next (cpu_next ), |
||
4 | lvd | 609 | |
737 | lvd | 610 | .int_turbo(int_turbo), |
611 | .nmi_buf_clr(nmi_buf_clr) |
||
467 | lvd | 612 | ); |
4 | lvd | 613 | |
614 | |||
467 | lvd | 615 | |
616 | |||
4 | lvd | 617 | wire [20:0] daddr; |
618 | wire dreq; |
||
619 | wire drnw; |
||
620 | wire [15:0] drddata; |
||
621 | wire [15:0] dwrdata; |
||
622 | wire [1:0] dbsel; |
||
623 | |||
30 | lvd | 624 | |
625 | |||
626 | |||
200 | lvd | 627 | dram dram( .clk(fclk), |
628 | .rst_n(rst_n), |
||
4 | lvd | 629 | |
200 | lvd | 630 | .addr(daddr), |
631 | .req(dreq), |
||
632 | .rnw(drnw), |
||
633 | .cbeg(cbeg), |
||
634 | .rrdy(drrdy), |
||
635 | .rddata(drddata), |
||
636 | .wrdata(dwrdata), |
||
637 | .bsel(dbsel), |
||
4 | lvd | 638 | |
200 | lvd | 639 | .ra(ra), |
640 | .rd(rd), |
||
641 | .rwe_n(rwe_n), |
||
642 | .rucas_n(rucas_n), |
||
643 | .rlcas_n(rlcas_n), |
||
644 | .rras0_n(rras0_n), |
||
645 | .rras1_n(rras1_n) |
||
646 | ); |
||
4 | lvd | 647 | |
648 | |||
649 | wire [1:0] bw; |
||
650 | |||
651 | wire [20:0] video_addr; |
||
652 | wire [15:0] video_data; |
||
653 | wire video_strobe; |
||
654 | wire video_next; |
||
655 | |||
656 | arbiter dramarb( .clk(fclk), |
||
134 | ddp | 657 | .rst_n(rst_n), |
4 | lvd | 658 | |
134 | ddp | 659 | .dram_addr(daddr), |
660 | .dram_req(dreq), |
||
661 | .dram_rnw(drnw), |
||
662 | .dram_cbeg(cbeg), |
||
663 | .dram_rrdy(drrdy), |
||
664 | .dram_bsel(dbsel), |
||
665 | .dram_rddata(drddata), |
||
666 | .dram_wrdata(dwrdata), |
||
4 | lvd | 667 | |
340 | lvd | 668 | .post_cbeg(post_cbeg), |
669 | .pre_cend (pre_cend ), |
||
670 | .cend (cend ), |
||
4 | lvd | 671 | |
134 | ddp | 672 | .go(go), |
673 | .bw(bw), |
||
4 | lvd | 674 | |
134 | ddp | 675 | .video_addr(video_addr), |
676 | .video_data(video_data), |
||
677 | .video_strobe(video_strobe), |
||
678 | .video_next(video_next), |
||
4 | lvd | 679 | |
134 | ddp | 680 | //.cpu_waitcyc(cpu_waitcyc), |
467 | lvd | 681 | .cpu_next (cpu_next), |
134 | ddp | 682 | .cpu_req(cpu_req), |
683 | .cpu_rnw(cpu_rnw), |
||
684 | .cpu_addr(cpu_addr), |
||
685 | .cpu_wrbsel(cpu_wrbsel), |
||
686 | .cpu_wrdata(cpu_wrdata), |
||
687 | .cpu_rddata(cpu_rddata), |
||
688 | .cpu_strobe(cpu_strobe) ); |
||
4 | lvd | 689 | |
684 | lvd | 690 | video_top video_top |
691 | ( |
||
340 | lvd | 692 | .clk(fclk), |
134 | ddp | 693 | |
340 | lvd | 694 | .vred(vred), |
695 | .vgrn(vgrn), |
||
696 | .vblu(vblu), |
||
697 | .vhsync(vhsync), |
||
698 | .vvsync(vvsync), |
||
699 | .vcsync(vcsync), |
||
134 | ddp | 700 | |
340 | lvd | 701 | .zxborder(border), |
134 | ddp | 702 | |
340 | lvd | 703 | .pent_vmode( {peff7[0],peff7[5]} ), |
704 | .atm_vmode (atm_scr_mode), |
||
705 | |||
706 | .scr_page(p7ffd[3]), |
||
707 | |||
708 | .vga_on(cfg_vga_on), |
||
709 | |||
684 | lvd | 710 | .modes_raster (modes_raster ), |
711 | .mode_contend_type(mode_contend_type), |
||
712 | |||
713 | .contend(contend), |
||
714 | |||
340 | lvd | 715 | .cbeg (cbeg ), |
716 | .post_cbeg(post_cbeg), |
||
717 | .pre_cend (pre_cend ), |
||
718 | .cend (cend ), |
||
719 | |||
720 | .video_go (go ), |
||
721 | .video_bw (bw ), |
||
722 | .video_addr (video_addr ), |
||
723 | .video_data (video_data ), |
||
724 | .video_strobe(video_strobe), |
||
725 | .video_next (video_next ), |
||
726 | |||
727 | .atm_palwr (atm_palwr ), |
||
728 | .atm_paldata(atm_paldata), |
||
668 | lvd | 729 | |
730 | .up_ena (up_ena ), |
||
731 | .up_paladdr(up_paladdr), |
||
732 | .up_paldata(up_paldata), |
||
733 | .up_palwr (up_palwr ), |
||
340 | lvd | 734 | |
394 | tsl | 735 | .int_start(int_start), |
736 | |||
395 | lvd | 737 | .fnt_a (a[10:0]), |
738 | .fnt_d (d ), |
||
425 | lvd | 739 | .fnt_wr(fnt_wr ), |
740 | |||
543 | lvd | 741 | .palcolor(palcolor), |
742 | |||
743 | .fontrom_readback(fontrom_readback) |
||
340 | lvd | 744 | ); |
745 | |||
746 | |||
284 | lvd | 747 | slavespi slavespi( |
748 | .fclk(fclk), .rst_n(rst_n), |
||
4 | lvd | 749 | |
284 | lvd | 750 | .spics_n(spics_n), .spidi(spidi), |
751 | .spido(spido), .spick(spick), |
||
372 | lvd | 752 | .status_in({/* wait_rnw */ wr_n, waits[6:0]}), .genrst(genrst), |
543 | lvd | 753 | .kbd_out(kbd_data), |
284 | lvd | 754 | .kbd_stb(kbd_stb), .mus_out(mus_data), |
755 | .mus_xstb(mus_xstb), .mus_ystb(mus_ystb), |
||
756 | .mus_btnstb(mus_btnstb), .kj_stb(kj_stb), |
||
757 | .gluclock_addr(gluclock_addr), |
||
758 | .comport_addr (comport_addr), |
||
759 | .wait_write(wait_write), |
||
760 | .wait_read(wait_read), |
||
761 | .wait_rnw(wait_rnw), |
||
762 | .wait_end(wait_end), |
||
826 | lvd | 763 | .config0( {not_used0[7:6], modes_raster, beeper_mux, tape_read, set_nmi[0], cfg_vga_on} ), |
764 | .config1( {not_used0[7:4], fdd_mask} ), |
||
543 | lvd | 765 | |
766 | .sd_lock_out(avr_lock_claim), |
||
767 | .sd_lock_in (avr_lock_grant), |
||
768 | .sd_cs_n (avr_sdcs_n ), |
||
769 | .sd_start (avr_sd_start ), |
||
770 | .sd_datain (avr_sd_datain ), |
||
771 | .sd_dataout (avr_sd_dataout) |
||
284 | lvd | 772 | ); |
773 | |||
67 | lvd | 774 | zkbdmus zkbdmus( .fclk(fclk), .rst_n(rst_n), |
134 | ddp | 775 | .kbd_in(kbd_data), .kbd_stb(kbd_stb), |
776 | .mus_in(mus_data), .mus_xstb(mus_xstb), |
||
777 | .mus_ystb(mus_ystb), .mus_btnstb(mus_btnstb), |
||
778 | .kj_stb(kj_stb), .kj_data(kj_port_data), |
||
779 | .zah(a[15:8]), .kbd_data(kbd_port_data), |
||
780 | .mus_data(mus_port_data) |
||
781 | ); |
||
4 | lvd | 782 | |
783 | |||
200 | lvd | 784 | zports zports( .zclk(zclk), .fclk(fclk), .rst_n(rst_n), .zpos(zpos), .zneg(zneg), |
785 | .din(d), .dout(dout_ports), .dataout(ena_ports), |
||
786 | .a(a), .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .porthit(porthit), |
||
360 | lvd | 787 | .ay_bdir(ay_bdir), .ay_bc1(ay_bc1), .border(border), |
200 | lvd | 788 | .p7ffd(p7ffd), .peff7(peff7), .mreq_n(mreq_n), .m1_n(m1_n), .dos(dos), |
543 | lvd | 789 | .vg_intrq(intrq), .vg_drq(drq), .vg_wrFF(vg_wrFF), .vg_cs_n(vg_cs_n), |
200 | lvd | 790 | .idein(idein), .ideout(ideout), .idedataout(idedataout), |
791 | .ide_a(ide_a), .ide_cs0_n(ide_cs0_n), .ide_cs1_n(ide_cs1_n), |
||
792 | .ide_wr_n(ide_wr_n), .ide_rd_n(ide_rd_n), |
||
67 | lvd | 793 | |
543 | lvd | 794 | .sd_cs_n_val(zx_sdcs_n_val), |
795 | .sd_cs_n_stb(zx_sdcs_n_stb), |
||
796 | .sd_start (zx_sd_start ), |
||
797 | .sd_datain (zx_sd_datain ), |
||
798 | .sd_dataout (zx_sd_dataout), |
||
799 | |||
200 | lvd | 800 | .keys_in(kbd_port_data), |
340 | lvd | 801 | .mus_in (mus_port_data), |
802 | .kj_in (kj_port_data ), |
||
88 | lvd | 803 | |
213 | lvd | 804 | .tape_read(tape_read), |
805 | |||
200 | lvd | 806 | .gluclock_addr(gluclock_addr), |
340 | lvd | 807 | .comport_addr (comport_addr ), |
200 | lvd | 808 | .wait_start_gluclock(wait_start_gluclock), |
340 | lvd | 809 | .wait_start_comport (wait_start_comport ), |
810 | .wait_rnw (wait_rnw ), |
||
200 | lvd | 811 | .wait_write(wait_write), |
340 | lvd | 812 | .wait_read (wait_read ), |
684 | lvd | 813 | |
476 | lvd | 814 | .atmF7_wr_fclk(atmF7_wr_fclk), |
4 | lvd | 815 | |
476 | lvd | 816 | .atm_scr_mode(atm_scr_mode), |
817 | .atm_turbo (atm_turbo), |
||
818 | .atm_pen (pager_off), |
||
819 | .atm_cpm_n (cpm_n), |
||
820 | .atm_pen2 (atm_pen2), |
||
200 | lvd | 821 | |
476 | lvd | 822 | .romrw_en(romrw_en), |
200 | lvd | 823 | |
476 | lvd | 824 | .pent1m_ram0_0(pent1m_ram0_0), |
825 | .pent1m_1m_on (pent1m_1m_on), |
||
826 | .pent1m_page (pent1m_page), |
||
827 | .pent1m_ROM (pent1m_ROM), |
||
200 | lvd | 828 | |
476 | lvd | 829 | .atm_palwr (atm_palwr ), |
830 | .atm_paldata(atm_paldata), |
||
340 | lvd | 831 | |
476 | lvd | 832 | .beeper_wr(beeper_wr), |
833 | .covox_wr (covox_wr ), |
||
360 | lvd | 834 | |
467 | lvd | 835 | .fnt_wr(fnt_wr), |
836 | .clr_nmi(clr_nmi), |
||
425 | lvd | 837 | |
838 | |||
467 | lvd | 839 | .pages(~{ rd_pages[7], rd_pages[6], |
840 | rd_pages[5], rd_pages[4], |
||
841 | rd_pages[3], rd_pages[2], |
||
842 | rd_pages[1], rd_pages[0] }), |
||
425 | lvd | 843 | |
674 | lvd | 844 | .ramnroms ( rd_ramnrom ), |
845 | .dos7ffds ( rd_dos7ffd ), |
||
846 | .wrdisables( rd_wrdisables ), |
||
425 | lvd | 847 | |
467 | lvd | 848 | .palcolor(palcolor), |
543 | lvd | 849 | .fontrom_readback(fontrom_readback), |
668 | lvd | 850 | |
851 | .up_ena (up_ena ), |
||
852 | .up_paladdr(up_paladdr), |
||
853 | .up_paldata(up_paldata), |
||
854 | .up_palwr (up_palwr ), |
||
425 | lvd | 855 | |
476 | lvd | 856 | .external_port(external_port), |
200 | lvd | 857 | |
576 | lvd | 858 | .set_nmi(set_nmi[1]), |
476 | lvd | 859 | |
576 | lvd | 860 | .brk_ena (brk_ena ), |
861 | .brk_addr(brk_addr) |
||
467 | lvd | 862 | ); |
200 | lvd | 863 | |
467 | lvd | 864 | |
425 | lvd | 865 | zint zint( |
866 | .fclk(fclk), |
||
867 | .zpos(zpos), |
||
868 | .zneg(zneg), |
||
4 | lvd | 869 | |
425 | lvd | 870 | .int_start(int_start), |
4 | lvd | 871 | |
425 | lvd | 872 | .iorq_n(iorq_n), |
873 | .m1_n (m1_n ), |
||
4 | lvd | 874 | |
651 | lvd | 875 | .wait_n(spiint_n), // spiint_n is 1-0 signal, wait_n is Z-0 |
876 | |||
425 | lvd | 877 | .int_n(int_n) |
878 | ); |
||
879 | |||
880 | znmi znmi |
||
881 | ( |
||
882 | .rst_n(rst_n), |
||
883 | .fclk(fclk), |
||
884 | .zpos(zpos), |
||
885 | .zneg(zneg), |
||
886 | |||
887 | .rfsh_n(rfsh_n), |
||
518 | lvd | 888 | .m1_n (m1_n ), |
889 | .mreq_n(mreq_n), |
||
890 | .csrom (csrom ), |
||
891 | .a (a ), |
||
425 | lvd | 892 | |
893 | .int_start(int_start), |
||
894 | |||
895 | .set_nmi(set_nmi), |
||
576 | lvd | 896 | .imm_nmi(imm_nmi), |
425 | lvd | 897 | .clr_nmi(clr_nmi), |
898 | |||
699 | lvd | 899 | .drive_00(drive_00), |
900 | |||
425 | lvd | 901 | .in_nmi (in_nmi ), |
737 | lvd | 902 | .gen_nmi(gen_nmi), |
903 | .nmi_buf_clr(nmi_buf_clr) |
||
425 | lvd | 904 | ); |
905 | |||
906 | |||
576 | lvd | 907 | zbreak zbreak |
908 | ( |
||
909 | .rst_n(rst_n), |
||
910 | .fclk(fclk), |
||
911 | .zpos(zpos), |
||
912 | .zneg(zneg), |
||
425 | lvd | 913 | |
576 | lvd | 914 | .m1_n (m1_n ), |
915 | .mreq_n(mreq_n), |
||
916 | .a (a ), |
||
425 | lvd | 917 | |
576 | lvd | 918 | .imm_nmi(imm_nmi), |
919 | |||
920 | .brk_ena (brk_ena ), |
||
921 | .brk_addr(brk_addr) |
||
922 | ); |
||
923 | |||
924 | |||
925 | |||
926 | |||
927 | |||
928 | |||
88 | lvd | 929 | zwait zwait( .wait_start_gluclock(wait_start_gluclock), |
228 | lvd | 930 | .wait_start_comport (wait_start_comport), |
134 | ddp | 931 | .wait_end(wait_end), |
932 | .rst_n(rst_n), |
||
933 | .wait_n(wait_n), |
||
934 | .waits(waits), |
||
935 | .spiint_n(spiint_n) ); |
||
88 | lvd | 936 | |
937 | |||
938 | |||
939 | |||
4 | lvd | 940 | wire [1:0] vg_ddrv; |
941 | assign vg_a[0] = vg_ddrv[0] ? 1'b1 : 1'b0; // possibly open drain? |
||
942 | assign vg_a[1] = vg_ddrv[1] ? 1'b1 : 1'b0; |
||
943 | |||
944 | vg93 vgshka( .zclk(zclk), .rst_n(rst_n), .fclk(fclk), .vg_clk(vg_clk), |
||
134 | ddp | 945 | .vg_res_n(vg_res_n), .din(d), .intrq(intrq), .drq(drq), .vg_wrFF(vg_wrFF), |
946 | .vg_hrdy(vg_hrdy), .vg_rclk(vg_rclk), .vg_rawr(vg_rawr), .vg_a(vg_ddrv), |
||
947 | .vg_wrd(vg_wrd), .vg_side(vg_side), .step(step), .vg_sl(vg_sl), .vg_sr(vg_sr), |
||
948 | .vg_tr43(vg_tr43), .rdat_n(rdat_b_n), .vg_wf_de(vg_wf_de), .vg_drq(vg_drq), |
||
949 | .vg_irq(vg_irq), .vg_wd(vg_wd) ); |
||
4 | lvd | 950 | |
951 | |||
952 | |||
953 | |||
543 | lvd | 954 | // spi2 zspi( .clock(fclk), .sck(sdclk), .sdo(sddo), .sdi(sddi), .start(sd_start), |
955 | // .speed(2'b00), .din(sd_datain), .dout(sd_dataout) ); |
||
956 | spihub spihub( |
||
4 | lvd | 957 | |
543 | lvd | 958 | .fclk (fclk ), |
959 | .rst_n(rst_n), |
||
360 | lvd | 960 | |
543 | lvd | 961 | .sdcs_n(sdcs_n), |
962 | .sdclk (sdclk ), |
||
963 | .sddo (sddo ), |
||
964 | .sddi (sddi ), |
||
360 | lvd | 965 | |
543 | lvd | 966 | .zx_sdcs_n_val(zx_sdcs_n_val), |
967 | .zx_sdcs_n_stb(zx_sdcs_n_stb), |
||
968 | .zx_sd_start (zx_sd_start ), |
||
969 | .zx_sd_datain (zx_sd_datain ), |
||
970 | .zx_sd_dataout(zx_sd_dataout), |
||
360 | lvd | 971 | |
543 | lvd | 972 | .avr_lock_in (avr_lock_claim), |
973 | .avr_lock_out (avr_lock_grant), |
||
974 | .avr_sdcs_n (avr_sdcs_n ), |
||
975 | .avr_sd_start (avr_sd_start ), |
||
976 | .avr_sd_datain (avr_sd_datain ), |
||
977 | .avr_sd_dataout(avr_sd_dataout) |
||
360 | lvd | 978 | |
543 | lvd | 979 | |
980 | ); |
||
981 | |||
982 | |||
983 | |||
984 | |||
985 | |||
360 | lvd | 986 | ////////////////////////////////////// |
987 | // sound: beeper, tapeout and covox // |
||
988 | ////////////////////////////////////// |
||
989 | |||
990 | sound sound( |
||
991 | |||
992 | .clk(fclk), |
||
993 | |||
994 | .din(d), |
||
995 | |||
996 | .beeper_wr(beeper_wr), |
||
997 | .covox_wr (covox_wr ), |
||
998 | |||
999 | .beeper_mux(beeper_mux), |
||
1000 | |||
1001 | .sound_bit(beep) |
||
1002 | ); |
||
1003 | |||
1004 | |||
4 | lvd | 1005 | endmodule |
1006 |