Subversion Repositories ngs

Rev

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