Subversion Repositories ngs

Rev

Rev 61 | Rev 91 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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