Top secrets sources NedoPC pentevo

Rev

Rev 737 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

// ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014,2015,2016,2019
//
// top-level

/*
    This file is part of ZX-Evo Base Configuration firmware.

    ZX-Evo Base Configuration firmware is free software:
    you can redistribute it and/or modify it under the terms of
    the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    ZX-Evo Base Configuration firmware is distributed in the hope that
    it will be useful, but WITHOUT ANY WARRANTY; without even
    the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    See the GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with ZX-Evo Base Configuration firmware.
    If not, see <http://www.gnu.org/licenses/>.
*/


`include "../include/tune.v"

module top(

        // clocks
        input fclk,
        output clkz_out,
        input clkz_in,

        // z80
        input iorq_n,
        input mreq_n,
        input rd_n,
        input wr_n,
        input m1_n,
        input rfsh_n,
        output int_n,
        output nmi_n,
        output wait_n,
        output res,

        inout [7:0] d,
        input [15:0] a,

        // zxbus and related
        output csrom,
        output romoe_n,
        output romwe_n,

        output rompg0_n,
        output dos_n, // aka rompg1
        output rompg2,
        output rompg3,
        output rompg4,

        input iorqge1,
        input iorqge2,
        output iorq1_n,
        output iorq2_n,

        // DRAM
        inout [15:0] rd,
        output [9:0] ra,
        output rwe_n,
        output rucas_n,
        output rlcas_n,
        output rras0_n,
        output rras1_n,

        // video
        output [1:0] vred,
        output [1:0] vgrn,
        output [1:0] vblu,

        output vhsync,
        output vvsync,
        output vcsync,

        // AY control and audio/tape
        output ay_clk,
        output ay_bdir,
        output ay_bc1,

        output beep,

        // IDE
        output [2:0] ide_a,
        inout [15:0] ide_d,

        output ide_dir,

        input ide_rdy,

        output ide_cs0_n,
        output ide_cs1_n,
        output ide_rs_n,
        output ide_rd_n,
        output ide_wr_n,

        // VG93 and diskdrive
        output vg_clk,

        output vg_cs_n,
        output vg_res_n,

        output vg_hrdy,
        output vg_rclk,
        output vg_rawr,
        output [1:0] vg_a, // disk drive selection
        output vg_wrd,
        output vg_side,

        input step,
        input vg_sl,
        input vg_sr,
        input vg_tr43,
        input rdat_b_n,
        input vg_wf_de,
        input vg_drq,
        input vg_irq,
        input vg_wd,

        // serial links (atmega-fpga, sdcard)
        output sdcs_n,
        output sddo,
        output sdclk,
        input sddi,

        input spics_n,
        input spick,
        input spido,
        output spidi,
        output spiint_n
);

        wire dos;


        wire zclk; // z80 clock for short

        wire zpos,zneg;

        wire rst_n; // global reset

        wire rrdy;
        wire [15:0] rddata;

        wire [4:0] rompg;

        wire [7:0] zports_dout;
        wire zports_dataout;
        wire porthit;

        wire csrom_int;


        wire [39:0] kbd_data;
        wire [ 7:0] mus_data;
        wire kbd_stb,mus_xstb,mus_ystb,mus_btnstb,kj_stb;

        wire [ 4:0] kbd_port_data;
        wire [ 4:0] kj_port_data;
        wire [ 7:0] mus_port_data;




        wire [7:0] wait_read,wait_write;
        wire wait_rnw;
        wire wait_start_gluclock;
        wire wait_start_comport;
        wire wait_end;
        wire [7:0] gluclock_addr;
        wire [2:0] comport_addr;
        wire [6:0] waits;




        // config signals
        wire [7:0] not_used0;
        wire [7:0] not_used1;
        wire cfg_vga_on;
        //
        wire [1:0] modes_raster;
        wire       mode_contend_type = 1'b0; // 48/128/+2 or +2a/+3 TODO: take these signals from somewhere
        wire       mode_contend_ena  = 1'b1; // contention enable
        wire       contend;
        //
        wire [3:0] fdd_mask;

        // nmi signals
        wire gen_nmi;
        wire clr_nmi;
        wire in_nmi;
        wire [1:0] set_nmi;
        wire imm_nmi;
        wire nmi_buf_clr;

        // breakpoint signals
        wire brk_ena;
        wire [15:0] brk_addr;


        wire tape_in;

        wire [15:0] ideout;
        wire [15:0] idein;
        wire idedataout;


        wire [7:0] zmem_dout;
        wire zmem_dataout;



        reg [3:0] ayclk_gen;


        wire [7:0] received;
        wire [7:0] tobesent;


        wire intrq,drq;
        wire vg_wrFF;


        wire        up_ena;
        wire [ 5:0] up_paladdr;
        wire [ 7:0] up_paldata;
        wire        up_palwr;




        assign zclk = clkz_in;


        // RESETTER
        wire genrst;

        resetter myrst( .clk(fclk),
                        .rst_in_n(~genrst),
                        .rst_out_n(rst_n) );
        defparam myrst.RST_CNT_SIZE = 6;



        assign nmi_n=gen_nmi ? 1'b0 : 1'bZ;

        assign res= ~rst_n;








        assign ide_rs_n = rst_n;

        assign ide_d = idedataout ? ideout : 16'hZZZZ;
        assign idein = ide_d;

        assign ide_dir = ~idedataout;





        wire [7:0] peff7;
        wire [7:0] p7ffd;


        wire romrw_en;
        wire cpm_n;
        wire fnt_wr;



        wire cpu_req,cpu_rnw,cpu_wrbsel,cpu_strobe;
        wire [20:0] cpu_addr;
        wire [15:0] cpu_rddata;
        wire [7:0] cpu_wrdata;

        wire cbeg,post_cbeg,pre_cend,cend;

        wire go;


        // AVR SDcard control
        wire       avr_lock_claim,
                   avr_lock_grant,
                   avr_sdcs_n,
                   avr_sd_start;
        wire [7:0] avr_sd_datain;
        wire [7:0] avr_sd_dataout;

        // ZX SDcard control
        wire       zx_sdcs_n_val,
                   zx_sdcs_n_stb,
                   zx_sd_start;
        wire [7:0] zx_sd_datain;
        wire [7:0] zx_sd_dataout;


        wire tape_read; // data for tapein

        wire beeper_mux; // what is mixed to FPGA beeper output - beeper (0) or tapeout (1)

        wire [2:0] atm_scr_mode;

        wire atm_turbo;


        wire beeper_wr, covox_wr;



        wire [5:0] palcolor; // palette readback




        wire [1:0] int_turbo;
        wire cpu_next;
        wire cpu_stall;

        wire external_port;



//AY control
        always @(posedge fclk)
        begin
                ayclk_gen <= ayclk_gen + 4'd1;
        end

        assign ay_clk = ayclk_gen[3];





        // fix ATM2-style ROM addressing for PENT-like ROM layout.
        // this causes compications when writing to the flashROM from Z80
        // and need to split and re-build old ATM romfiles before burning in
        // flash
//      wire [1:0] adr_fix;
//      assign adr_fix = ~{ rompg[0], rompg[1] };
//      assign rompg0_n = ~adr_fix[0];
//      assign dos_n    =  adr_fix[1];
//      assign rompg2   =  1'b0;//rompg[2];
//      assign rompg3   =  1'b0;//rompg[3];
//      assign rompg4   =  1'b0;//rompg[4];

        assign rompg0_n = ~rompg[0];
        assign dos_n    =  rompg[1];
        assign rompg2   =  rompg[2];
        assign rompg3   =  rompg[3];
        assign rompg4   =  rompg[4];

        wire [3:0] zclk_stall;

        zclock zclock
        (
                .fclk (fclk ),
                .zclk (zclk ),
                .rst_n(rst_n),

                .a(a),

                .mreq_n(mreq_n),
                .iorq_n(iorq_n),
                .m1_n  (m1_n  ),
                .rfsh_n(rfsh_n),

                .modes_raster     (modes_raster     ),
                .mode_contend_type(mode_contend_type),
                .mode_contend_ena (mode_contend_ena ),
                .mode_7ffd_bits   (p7ffd[2:0]       ),
                .contend          (contend          ),

                .zclk_out(clkz_out),

                .zpos(zpos),
                .zneg(zneg),


                .pre_cend(pre_cend),
                .cbeg    (cbeg    ),

                .zclk_stall( cpu_stall | (|zclk_stall) ),
                .turbo     ( {atm_turbo,~(peff7[4])}   ),
                .int_turbo (int_turbo                  ),
               
                .external_port(external_port)
        );



        wire [7:0] dout_ram;
        wire ena_ram;
        wire [7:0] dout_ports;
        wire ena_ports;


        wire [3:0] border;

        wire drive_ff;
        wire drive_00;


        wire       atm_palwr;
        wire [5:0] atm_paldata;

        wire [7:0] fontrom_readback;




        wire int_start;



        // data bus out: either RAM data or internal ports data or 0xFF with unused ports
//      assign d = ena_ram ? dout_ram : ( ena_ports ? dout_ports : ( (drive_ff|drive_00) ? {8{drive_ff}} : 8'bZZZZZZZZ ) );

        wire [7:0] d_pre_out;
        wire d_ena;

        assign d_pre_out = ({8{ena_ram&(~drive_00)}} & dout_ram) | ({8{ena_ports}} & dout_ports) | {8{drive_ff}} ;
        assign d_ena = (ena_ram|ena_ports|drive_ff|drive_00);
        //
        assign d = d_ena ? d_pre_out : 8'bZZZZ_ZZZZ;
        //
        assign csrom = csrom_int && !drive_00;


        zbus zxbus( .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .m1_n(m1_n),
                    .iorq1_n(iorq1_n), .iorq2_n(iorq2_n), .iorqge1(iorqge1), .iorqge2(iorqge2),
                    .porthit(porthit), .drive_ff(drive_ff) );




        /////////////////////////////////////
        // ATM memory pagers instantiation //
        /////////////////////////////////////

        wire pager_off;

        wire        pent1m_ROM;
        wire [ 5:0] pent1m_page;
        wire        pent1m_ram0_0;
        wire        pent1m_1m_on;

        wire atmF7_wr_fclk;

        wire [3:0] dos_turn_off,
                   dos_turn_on;

        wire [ 7:0] page [0:3];
        wire [ 3:0] romnram;
        wire [ 3:0] wrdisable;

        // for reading back data via xxBE port
        wire [ 7:0] rd_pages [0:7];
        wire [ 7:0] rd_ramnrom;
        wire [ 7:0] rd_dos7ffd;
        wire [ 7:0] rd_wrdisables;

        generate

                genvar i;

                for(i=0;i<4;i=i+1)
                begin : instantiate_atm_pagers
                        atm_pager #( .ADDR(i) ) atm_pager
                        (
                                .rst_n(rst_n),
                                .fclk (fclk),
                                .zpos (zpos),
                                .zneg (zneg),
                               
                                .za(a),
                                .zd(d),
                                .mreq_n(mreq_n),
                                .rd_n  (rd_n),
                                .m1_n  (m1_n),
                               
                                .pager_off(pager_off),
                               
                                .pent1m_ROM   (pent1m_ROM),
                                .pent1m_page  (pent1m_page),
                                .pent1m_ram0_0(pent1m_ram0_0),
                                .pent1m_1m_on (pent1m_1m_on),
                               
                               
                                .in_nmi(in_nmi),
                               
                                .atmF7_wr(atmF7_wr_fclk),
                               
                                .dos(dos),
                               
                                .dos_turn_on (dos_turn_on[i]),
                                .dos_turn_off(dos_turn_off[i]),
                               
                                .zclk_stall(zclk_stall[i]),
                               
                                .page     (page[i]     ),
                                .romnram  (romnram[i]  ),
                                .wrdisable(wrdisable[i]),
                               
                                .rd_page0  (rd_pages[i  ]),
                                .rd_page1  (rd_pages[i+4]),
                               
                                .rd_ramnrom   ( {rd_ramnrom   [i+4], rd_ramnrom   [i]} ),
                                .rd_dos7ffd   ( {rd_dos7ffd   [i+4], rd_dos7ffd   [i]} ),
                                .rd_wrdisables( {rd_wrdisables[i+4], rd_wrdisables[i]} )
                        );

                end

        endgenerate


        ///////////////////////////
        // DOS signal controller //
        ///////////////////////////

        zdos zdos( .rst_n(rst_n),

                   .fclk(fclk),

                   .dos_turn_on ( |dos_turn_on  ),
                   .dos_turn_off( |dos_turn_off ),

                   .cpm_n(cpm_n),

                   .dos(dos)
                 );




        ///////////////////////////
        // Z80 memory controller //
        ///////////////////////////

        zmem z80mem
        (
                .fclk (fclk ),
                .rst_n(rst_n),
               
                .zpos(zpos),
                .zneg(zneg),

                .cbeg     (cbeg     ),
                .post_cbeg(post_cbeg),
                .pre_cend (pre_cend ),
                .cend     (cend     ),
               
                .za    (a       ),
                .zd_in (d       ),
                .zd_out(dout_ram),
                .zd_ena(ena_ram ),
                .m1_n  (m1_n    ),
                .rfsh_n(rfsh_n  ),
                .iorq_n(iorq_n  ),
                .mreq_n(mreq_n  ),
                .rd_n  (rd_n    ),
                .wr_n  (wr_n    ),

                .win0_romnram(romnram[0]),
                .win1_romnram(romnram[1]),
                .win2_romnram(romnram[2]),
                .win3_romnram(romnram[3]),

                .win0_page(page[0]),
                .win1_page(page[1]),
                .win2_page(page[2]),
                .win3_page(page[3]),

                .win0_wrdisable(wrdisable[0]),
                .win1_wrdisable(wrdisable[1]),
                .win2_wrdisable(wrdisable[2]),
                .win3_wrdisable(wrdisable[3]),

                .romrw_en(romrw_en),

                .rompg  (rompg  ),
                .romoe_n(romoe_n),
                .romwe_n(romwe_n),
                .csrom  (csrom_int),

                .cpu_req   (cpu_req   ),
                .cpu_rnw   (cpu_rnw   ),
                .cpu_wrbsel(cpu_wrbsel),
                .cpu_strobe(cpu_strobe),
                .cpu_addr  (cpu_addr  ),
                .cpu_wrdata(cpu_wrdata),
                .cpu_rddata(cpu_rddata),
                .cpu_stall (cpu_stall ),
                .cpu_next  (cpu_next  ),

                .int_turbo(int_turbo),
                .nmi_buf_clr(nmi_buf_clr)
        );




        wire [20:0] daddr;
        wire dreq;
        wire drnw;
        wire [15:0] drddata;
        wire [15:0] dwrdata;
        wire [1:0] dbsel;




        dram dram( .clk(fclk),
                   .rst_n(rst_n),

                   .addr(daddr),
                   .req(dreq),
                   .rnw(drnw),
                   .cbeg(cbeg),
                   .rrdy(drrdy),
                   .rddata(drddata),
                   .wrdata(dwrdata),
                   .bsel(dbsel),

                   .ra(ra),
                   .rd(rd),
                   .rwe_n(rwe_n),
                   .rucas_n(rucas_n),
                   .rlcas_n(rlcas_n),
                   .rras0_n(rras0_n),
                   .rras1_n(rras1_n)
                 );


        wire [1:0] bw;

        wire [20:0] video_addr;
        wire [15:0] video_data;
        wire video_strobe;
        wire video_next;

        arbiter dramarb( .clk(fclk),
                         .rst_n(rst_n),

                         .dram_addr(daddr),
                         .dram_req(dreq),
                         .dram_rnw(drnw),
                         .dram_cbeg(cbeg),
                         .dram_rrdy(drrdy),
                         .dram_bsel(dbsel),
                         .dram_rddata(drddata),
                         .dram_wrdata(dwrdata),

                         .post_cbeg(post_cbeg),
                         .pre_cend (pre_cend ),
                         .cend     (cend     ),

                         .go(go),
                         .bw(bw),

                         .video_addr(video_addr),
                         .video_data(video_data),
                         .video_strobe(video_strobe),
                         .video_next(video_next),

                         //.cpu_waitcyc(cpu_waitcyc),
                         .cpu_next (cpu_next),
                         .cpu_req(cpu_req),
                         .cpu_rnw(cpu_rnw),
                         .cpu_addr(cpu_addr),
                         .cpu_wrbsel(cpu_wrbsel),
                         .cpu_wrdata(cpu_wrdata),
                         .cpu_rddata(cpu_rddata),
                         .cpu_strobe(cpu_strobe) );

        video_top video_top
        (
                .clk(fclk),

                .vred(vred),
                .vgrn(vgrn),
                .vblu(vblu),
                .vhsync(vhsync),
                .vvsync(vvsync),
                .vcsync(vcsync),

                .zxborder(border),

                .pent_vmode( {peff7[0],peff7[5]} ),
                .atm_vmode (atm_scr_mode),

                .scr_page(p7ffd[3]),

                .vga_on(cfg_vga_on),

                .modes_raster     (modes_raster     ),
                .mode_contend_type(mode_contend_type),
               
                .contend(contend),

                .cbeg     (cbeg     ),
                .post_cbeg(post_cbeg),
                .pre_cend (pre_cend ),
                .cend     (cend     ),

                .video_go    (go          ),
                .video_bw    (bw          ),
                .video_addr  (video_addr  ),
                .video_data  (video_data  ),
                .video_strobe(video_strobe),
                .video_next  (video_next  ),

                .atm_palwr  (atm_palwr  ),
                .atm_paldata(atm_paldata),
               
                .up_ena    (up_ena    ),
                .up_paladdr(up_paladdr),
                .up_paldata(up_paldata),
                .up_palwr  (up_palwr  ),

                .int_start(int_start),

                .fnt_a (a[10:0]),
                .fnt_d (d      ),
                .fnt_wr(fnt_wr ),

                .palcolor(palcolor),

                .fontrom_readback(fontrom_readback)
        );


        slavespi slavespi(
                .fclk(fclk), .rst_n(rst_n),

                .spics_n(spics_n), .spidi(spidi),
                .spido(spido), .spick(spick),
                .status_in({/* wait_rnw */ wr_n, waits[6:0]}), .genrst(genrst),
                .kbd_out(kbd_data),
                .kbd_stb(kbd_stb), .mus_out(mus_data),
                .mus_xstb(mus_xstb), .mus_ystb(mus_ystb),
                .mus_btnstb(mus_btnstb), .kj_stb(kj_stb),
                .gluclock_addr(gluclock_addr),
                .comport_addr (comport_addr),
                .wait_write(wait_write),
                .wait_read(wait_read),
                .wait_rnw(wait_rnw),
                .wait_end(wait_end),
                .config0( {not_used0[7:6], modes_raster, beeper_mux, tape_read, set_nmi[0], cfg_vga_on} ),
                .config1( {not_used0[7:4], fdd_mask} ),

                .sd_lock_out(avr_lock_claim),
                .sd_lock_in (avr_lock_grant),
                .sd_cs_n    (avr_sdcs_n    ),
                .sd_start   (avr_sd_start  ),
                .sd_datain  (avr_sd_datain ),
                .sd_dataout (avr_sd_dataout)
        );

        zkbdmus zkbdmus( .fclk(fclk), .rst_n(rst_n),
                         .kbd_in(kbd_data), .kbd_stb(kbd_stb),
                         .mus_in(mus_data), .mus_xstb(mus_xstb),
                         .mus_ystb(mus_ystb), .mus_btnstb(mus_btnstb),
                         .kj_stb(kj_stb), .kj_data(kj_port_data),
                         .zah(a[15:8]), .kbd_data(kbd_port_data),
                         .mus_data(mus_port_data)
                       );


        zports zports( .zclk(zclk), .fclk(fclk), .rst_n(rst_n), .zpos(zpos), .zneg(zneg),
                       .din(d), .dout(dout_ports), .dataout(ena_ports),
                       .a(a), .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .porthit(porthit),
                       .ay_bdir(ay_bdir), .ay_bc1(ay_bc1), .border(border),
                       .p7ffd(p7ffd), .peff7(peff7), .mreq_n(mreq_n), .m1_n(m1_n), .dos(dos),
                       .vg_intrq(intrq), .vg_drq(drq), .vg_wrFF(vg_wrFF), .vg_cs_n(vg_cs_n),
                       .idein(idein), .ideout(ideout), .idedataout(idedataout),
                       .ide_a(ide_a), .ide_cs0_n(ide_cs0_n), .ide_cs1_n(ide_cs1_n),
                       .ide_wr_n(ide_wr_n), .ide_rd_n(ide_rd_n),

                       .sd_cs_n_val(zx_sdcs_n_val),
                       .sd_cs_n_stb(zx_sdcs_n_stb),
                       .sd_start   (zx_sd_start  ),
                       .sd_datain  (zx_sd_datain ),
                       .sd_dataout (zx_sd_dataout),

                       .keys_in(kbd_port_data),
                       .mus_in (mus_port_data),
                       .kj_in  (kj_port_data ),

                       .tape_read(tape_read),

                       .gluclock_addr(gluclock_addr),
                       .comport_addr (comport_addr ),
                       .wait_start_gluclock(wait_start_gluclock),
                       .wait_start_comport (wait_start_comport ),
                       .wait_rnw  (wait_rnw  ),
                       .wait_write(wait_write),
                       .wait_read (wait_read ),
               
                .atmF7_wr_fclk(atmF7_wr_fclk),

                .atm_scr_mode(atm_scr_mode),
                .atm_turbo   (atm_turbo),
                .atm_pen     (pager_off),
                .atm_cpm_n   (cpm_n),
                .atm_pen2    (atm_pen2),

                .romrw_en(romrw_en),

                .pent1m_ram0_0(pent1m_ram0_0),
                .pent1m_1m_on (pent1m_1m_on),
                .pent1m_page  (pent1m_page),
                .pent1m_ROM   (pent1m_ROM),

                .atm_palwr  (atm_palwr  ),
                .atm_paldata(atm_paldata),

                .beeper_wr(beeper_wr),
                .covox_wr (covox_wr ),

                .fnt_wr(fnt_wr),
                .clr_nmi(clr_nmi),


                .pages(~{ rd_pages[7], rd_pages[6],
                          rd_pages[5], rd_pages[4],
                          rd_pages[3], rd_pages[2],
                          rd_pages[1], rd_pages[0] }),

                .ramnroms  ( rd_ramnrom    ),
                .dos7ffds  ( rd_dos7ffd    ),
                .wrdisables( rd_wrdisables ),

                .palcolor(palcolor),
                .fontrom_readback(fontrom_readback),
       
                .up_ena    (up_ena    ),
                .up_paladdr(up_paladdr),
                .up_paldata(up_paldata),
                .up_palwr  (up_palwr  ),

                .external_port(external_port),

                .set_nmi(set_nmi[1]),

                .brk_ena (brk_ena ),
                .brk_addr(brk_addr)
        );


        zint zint(
                .fclk(fclk),
                .zpos(zpos),
                .zneg(zneg),

                .int_start(int_start),

                .iorq_n(iorq_n),
                .m1_n  (m1_n  ),

                .wait_n(spiint_n), // spiint_n is 1-0 signal, wait_n is Z-0

                .int_n(int_n)
        );

        znmi znmi
        (
                .rst_n(rst_n),
                .fclk(fclk),
                .zpos(zpos),
                .zneg(zneg),

                .rfsh_n(rfsh_n),
                .m1_n  (m1_n  ),
                .mreq_n(mreq_n),
                .csrom (csrom ),
                .a     (a     ),

                .int_start(int_start),

                .set_nmi(set_nmi),
                .imm_nmi(imm_nmi),
                .clr_nmi(clr_nmi),

                .drive_00(drive_00),

                .in_nmi (in_nmi ),
                .gen_nmi(gen_nmi),
                .nmi_buf_clr(nmi_buf_clr)
        );


        zbreak zbreak
        (
                .rst_n(rst_n),
                .fclk(fclk),
                .zpos(zpos),
                .zneg(zneg),

                .m1_n  (m1_n  ),
                .mreq_n(mreq_n),
                .a     (a     ),

                .imm_nmi(imm_nmi),

                .brk_ena (brk_ena ),
                .brk_addr(brk_addr)
        );






        zwait zwait( .wait_start_gluclock(wait_start_gluclock),
                     .wait_start_comport (wait_start_comport),
                     .wait_end(wait_end),
                     .rst_n(rst_n),
                     .wait_n(wait_n),
                     .waits(waits),
                     .spiint_n(spiint_n) );




        wire [1:0] vg_ddrv;
        assign vg_a[0] = vg_ddrv[0] ? 1'b1 : 1'b0; // possibly open drain?
        assign vg_a[1] = vg_ddrv[1] ? 1'b1 : 1'b0;

        vg93 vgshka( .zclk(zclk), .rst_n(rst_n), .fclk(fclk), .vg_clk(vg_clk),
                     .vg_res_n(vg_res_n), .din(d), .intrq(intrq), .drq(drq), .vg_wrFF(vg_wrFF),
                     .vg_hrdy(vg_hrdy), .vg_rclk(vg_rclk), .vg_rawr(vg_rawr), .vg_a(vg_ddrv),
                     .vg_wrd(vg_wrd), .vg_side(vg_side), .step(step), .vg_sl(vg_sl), .vg_sr(vg_sr),
                     .vg_tr43(vg_tr43), .rdat_n(rdat_b_n), .vg_wf_de(vg_wf_de), .vg_drq(vg_drq),
                     .vg_irq(vg_irq), .vg_wd(vg_wd) );




//      spi2 zspi( .clock(fclk), .sck(sdclk), .sdo(sddo), .sdi(sddi), .start(sd_start),
//                 .speed(2'b00), .din(sd_datain), .dout(sd_dataout) );
        spihub spihub(

                .fclk (fclk ),
                .rst_n(rst_n),

                .sdcs_n(sdcs_n),
                .sdclk (sdclk ),
                .sddo  (sddo  ),
                .sddi  (sddi  ),

                .zx_sdcs_n_val(zx_sdcs_n_val),
                .zx_sdcs_n_stb(zx_sdcs_n_stb),
                .zx_sd_start  (zx_sd_start  ),
                .zx_sd_datain (zx_sd_datain ),
                .zx_sd_dataout(zx_sd_dataout),

                .avr_lock_in   (avr_lock_claim),
                .avr_lock_out  (avr_lock_grant),
                .avr_sdcs_n    (avr_sdcs_n    ),
                .avr_sd_start  (avr_sd_start  ),
                .avr_sd_datain (avr_sd_datain ),
                .avr_sd_dataout(avr_sd_dataout)


        );





          //////////////////////////////////////
         // sound: beeper, tapeout and covox //
        //////////////////////////////////////

        sound sound(

                .clk(fclk),

                .din(d),

                .beeper_wr(beeper_wr),
                .covox_wr (covox_wr ),

                .beeper_mux(beeper_mux),

                .sound_bit(beep)
        );


endmodule