Subversion Repositories ngs

Rev

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

  1. // part of NeoGS project (c) 2007-2008 NedoPC
  2. //
  3. // main top-level module
  4.  
  5. module main(
  6.  
  7.         clk_fpga,  // clocks
  8.         clk_24mhz, //
  9.  
  10.         clksel0, // clock selection
  11.         clksel1, //
  12.  
  13.         warmres_n, // warm reset
  14.  
  15.  
  16.         d, // Z80 data bus
  17.         a, // Z80 address bus
  18.  
  19.         iorq_n,   // Z80 control signals
  20.         mreq_n,   //
  21.         rd_n,     //
  22.         wr_n,     //
  23.         m1_n,     //
  24.         int_n,    //
  25.         nmi_n,    //
  26.         busrq_n,  //
  27.         busak_n,  //
  28.         z80res_n, //
  29.  
  30.  
  31.         mema14,   // memory control
  32.         mema15,   //
  33.         mema16,   //
  34.         mema17,   //
  35.         mema18,   //
  36.         ram0cs_n, //
  37.         ram1cs_n, //
  38.         ram2cs_n, //
  39.         ram3cs_n, //
  40.         romcs_n,  //
  41.         memoe_n,  //
  42.         memwe_n,  //
  43.  
  44.  
  45.         zxid,        // zxbus signals
  46.         zxa,         //
  47.         zxa14,       //
  48.         zxa15,       //
  49.         zxiorq_n,    //
  50.         zxmreq_n,    //
  51.         zxrd_n,      //
  52.         zxwr_n,      //
  53.         zxcsrom_n,   //
  54.         zxblkiorq_n, //
  55.         zxblkrom_n,  //
  56.         zxgenwait_n, //
  57.         zxbusin,     //
  58.         zxbusena_n,  //
  59.  
  60.  
  61.         dac_bitck, // audio-DAC signals
  62.         dac_lrck,  //
  63.         dac_dat,  //
  64.  
  65.  
  66.         sd_clk, // SD card interface
  67.         sd_cs,  //
  68.         sd_do,  //
  69.         sd_di,  //
  70.         sd_wp,  //
  71.         sd_det, //
  72.  
  73.  
  74.         ma_clk, // control interface of MP3 chip
  75.         ma_cs,
  76.         ma_do,
  77.         ma_di,
  78.  
  79.         mp3_xreset, // data interface of MP3 chip
  80.         mp3_req,    //
  81.         mp3_clk,    //
  82.         mp3_dat,    //
  83.         mp3_sync,   //
  84.  
  85.         led_diag // LED driver
  86.  
  87. );
  88.  
  89.  
  90. // input-output description
  91.  
  92.         input clk_fpga;
  93.         input clk_24mhz;
  94.  
  95.         output clksel0;
  96.         output clksel1;
  97.  
  98.  
  99.         input warmres_n;
  100.  
  101.         inout reg [7:0] d;
  102.         input [15:0] a;
  103.  
  104.         input iorq_n;
  105.         input mreq_n;
  106.         input rd_n;
  107.         input wr_n;
  108.         input m1_n;
  109.         output int_n;
  110.         output nmi_n;
  111.         output busrq_n;
  112.         input busak_n;
  113.         output reg z80res_n;
  114.  
  115.  
  116.         output mema14;
  117.         output mema15;
  118.         output mema16;
  119.         output mema17;
  120.         output mema18;
  121.         output ram0cs_n;
  122.         output ram1cs_n;
  123.         output ram2cs_n;
  124.         output ram3cs_n;
  125.         output romcs_n;
  126.         output memoe_n;
  127.         output memwe_n;
  128.  
  129.  
  130.         inout [7:0] zxid;
  131.         input [7:0] zxa;
  132.         input zxa14;
  133.         input zxa15;
  134.         input zxiorq_n;
  135.         input zxmreq_n;
  136.         input zxrd_n;
  137.         input zxwr_n;
  138.         input zxcsrom_n;
  139.         output zxblkiorq_n;
  140.         output zxblkrom_n;
  141.         output zxgenwait_n;
  142.         output zxbusin;
  143.         output zxbusena_n;
  144.  
  145.  
  146.         output dac_bitck;
  147.         output dac_lrck;
  148.         output dac_dat;
  149.  
  150.  
  151.         output sd_clk;
  152.         output sd_cs;
  153.         output sd_do;
  154.         input sd_di;
  155.         input sd_wp;
  156.         input sd_det;
  157.  
  158.  
  159.         output ma_clk;
  160.         output ma_cs;
  161.         output ma_do;
  162.         input ma_di;
  163.  
  164.         output mp3_xreset;
  165.         input mp3_req;
  166.         output mp3_clk;
  167.         output mp3_dat;
  168.         output mp3_sync;
  169.  
  170.         output led_diag;
  171.  
  172.  
  173. // global signals
  174.  
  175.         wire internal_reset_n; // internal reset for everything
  176.  
  177.  
  178. // zxbus-ports interconnection
  179.  
  180.         wire rst_from_zx_n; // internal z80 reset
  181.  
  182.         wire [7:0] command_zx2gs;
  183.         wire [7:0] data_zx2gs;
  184.         wire [7:0] data_gs2zx;
  185.         wire command_bit_2gs;
  186.         wire command_bit_2zx;
  187.         wire command_bit_wr;
  188.         wire data_bit_2gs;
  189.         wire data_bit_2zx;
  190.         wire data_bit_wr;
  191.  
  192. // ports-memmap interconnection
  193.         wire mode_ramro,mode_norom;
  194.         wire [6:0] mode_pg0,mode_pg1;
  195.  
  196. // ports databus
  197.         wire [7:0] ports_dout;
  198.         wire ports_busin;
  199.  
  200. // ports-sound interconnection
  201.         wire snd_wrtoggle;
  202.         wire snd_datnvol;
  203.         wire [2:0] snd_addr;
  204.         wire [7:0] snd_data;
  205.  
  206.         wire mode_8chans;
  207.         wire mode_pan4ch;
  208.  
  209. // ports-SPIs interconnection
  210.  
  211.         wire [7:0] md_din;
  212.         wire [7:0] mc_din;
  213.         wire [7:0] mc_dout;
  214.         wire [7:0] sd_din;
  215.         wire [7:0] sd_dout;
  216.  
  217.         wire md_start;
  218.         wire mc_start;
  219.         wire mc_halfspeed;
  220.         wire md_halfspeed;
  221.         wire sd_start;
  222.  
  223.  
  224. // LED related
  225.  
  226.         wire led_toggle;
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233. // CODE STARTS
  234.  
  235. // reset handling
  236.  
  237.         resetter my_rst( .clk(clk_fpga),
  238.                          .rst_in1_n( warmres_n ), .rst_in2_n( rst_from_zx_n ),
  239.                          .rst_out_n( internal_reset_n ) );
  240.  
  241.         always @* // reset for Z80
  242.         begin
  243.                 if( internal_reset_n == 1'b0 )
  244.                         z80res_n <= 1'b0;
  245.                 else
  246.                         z80res_n <= 1'bZ;
  247.         end
  248.  
  249.  
  250.  
  251.  
  252. // control Z80 data bus
  253.  
  254.         always @*
  255.         begin
  256.                 if( (!m1_n) && (!iorq_n) )
  257.                 begin
  258.                         d <= 8'hFF;
  259.                 end
  260.                 else
  261.                 begin
  262.                         if( ports_busin==1'b1 ) // FPGA inputs on data bus
  263.                                 d <= 8'bZZZZZZZZ;
  264.                         else // FPGA outputs
  265.                                 d <= ports_dout;
  266.                 end
  267.         end
  268.  
  269. // control /BUSRQ
  270.  
  271.         assign busrq_n = 1'b1;
  272.  
  273.  
  274.  
  275.  
  276.  
  277. // ZXBUS module
  278.  
  279.         zxbus my_zxbus( .cpu_clock(clk_fpga),
  280.                         .rst_n(internal_reset_n),
  281.                         .rst_from_zx_n(rst_from_zx_n),
  282.  
  283.                         .nmi_n(nmi_n),
  284.  
  285.                         .zxid(zxid),
  286.                         .zxa(zxa),
  287.                         .zxa14(zxa14),
  288.                         .zxa15(zxa15),
  289.                         .zxiorq_n(zxiorq_n),
  290.                         .zxmreq_n(zxmreq_n),
  291.                         .zxrd_n(zxrd_n),
  292.                         .zxwr_n(zxwr_n),
  293.                         .zxblkiorq_n(zxblkiorq_n),
  294.                         .zxblkrom_n(zxblkrom_n),
  295.                         .zxcsrom_n(zxcsrom_n),
  296.                         .zxgenwait_n(zxgenwait_n),
  297.                         .zxbusin(zxbusin),
  298.                         .zxbusena_n(zxbusena_n),
  299.  
  300.                         .command_reg_out(command_zx2gs),
  301.                         .data_reg_out(data_zx2gs),
  302.                         .data_reg_in(data_gs2zx),
  303.                         .command_bit(command_bit_2gs),
  304.                         .command_bit_in(command_bit_2zx),
  305.                         .command_bit_wr(command_bit_wr),
  306.                         .data_bit(data_bit_2gs),
  307.                         .data_bit_in(data_bit_2zx),
  308.                         .data_bit_wr(data_bit_wr),
  309.  
  310.                         .led_toggle(led_toggle) );
  311.  
  312.  
  313.  
  314. // MEMMAP module
  315.  
  316.         memmap my_memmap( .a14(a[14]),
  317.                           .a15(a[15]),
  318.                           .mreq_n(mreq_n),
  319.                           .rd_n(rd_n),
  320.                           .wr_n(wr_n),
  321.                           .mema14(mema14),
  322.                           .mema15(mema15),
  323.                           .mema16(mema16),
  324.                           .mema17(mema17),
  325.                           .mema18(mema18),
  326.  
  327.                           .ram0cs_n(ram0cs_n),
  328.                           .ram1cs_n(ram1cs_n),
  329.                           .ram2cs_n(ram2cs_n),
  330.                           .ram3cs_n(ram3cs_n),
  331.                           .romcs_n(romcs_n),
  332.                           .memoe_n(memoe_n),
  333.                           .memwe_n(memwe_n),
  334.  
  335.                           .mode_ramro(mode_ramro),
  336.                           .mode_norom(mode_norom),
  337.                           .mode_pg0(mode_pg0),
  338.                           .mode_pg1(mode_pg1) );
  339.  
  340.  
  341.  
  342. // PORTS module
  343.  
  344.         ports my_ports( .dout(ports_dout),
  345.                         .din(d),
  346.                         .busin(ports_busin),
  347.                         .a(a),
  348.                         .iorq_n(iorq_n),
  349.                         .mreq_n(mreq_n),
  350.                         .rd_n(rd_n),
  351.                         .wr_n(wr_n),
  352.  
  353.                         .rst_n(internal_reset_n),
  354.  
  355.                         .cpu_clock(clk_fpga),
  356.  
  357.                         .clksel0(clksel0),
  358.                         .clksel1(clksel1),
  359.  
  360.                         .snd_wrtoggle(snd_wrtoggle),
  361.                         .snd_datnvol(snd_datnvol),
  362.                         .snd_addr(snd_addr),
  363.                         .snd_data(snd_data),
  364.                         .mode_8chans(mode_8chans),
  365.                         .mode_pan4ch(mode_pan4ch),
  366.  
  367.                         .command_port_input(command_zx2gs),
  368.                         .command_bit_input(command_bit_2gs),
  369.                         .command_bit_output(command_bit_2zx),
  370.                         .command_bit_wr(command_bit_wr),
  371.                         .data_port_input(data_zx2gs),
  372.                         .data_port_output(data_gs2zx),
  373.                         .data_bit_input(data_bit_2gs),
  374.                         .data_bit_output(data_bit_2zx),
  375.                         .data_bit_wr(data_bit_wr),
  376.  
  377.                         .mode_ramro(mode_ramro),
  378.                         .mode_norom(mode_norom),
  379.                         .mode_pg0(mode_pg0),
  380.                         .mode_pg1(mode_pg1),
  381.  
  382.                         .md_din(md_din),
  383.                         .md_start(md_start),
  384.                         .md_dreq(mp3_req),
  385.                         .md_halfspeed(md_halfspeed),
  386.  
  387.                         .mc_ncs(ma_cs),
  388.                         .mc_xrst(mp3_xreset),
  389.                         .mc_dout(mc_dout),
  390.                         .mc_din(mc_din),
  391.                         .mc_start(mc_start),
  392.                         .mc_halfspeed(mc_halfspeed),
  393.  
  394.                         .sd_ncs(sd_cs),
  395.                         .sd_wp(sd_wp),
  396.                         .sd_det(sd_det),
  397.                         .sd_din(sd_din),
  398.                         .sd_dout(sd_dout),
  399.                         .sd_start(sd_start),
  400.  
  401.                         .led(led_diag),
  402.                         .led_toggle(led_toggle)
  403.  
  404.  
  405.                         );
  406.  
  407.  
  408.  
  409. // SOUND_MAIN module
  410.  
  411.         sound_main my_sound_main( .clock(clk_24mhz),
  412.  
  413.                                   .mode_8chans(mode_8chans),
  414.                                   .mode_pan4ch(mode_pan4ch),
  415.  
  416.                                   .in_wrtoggle(snd_wrtoggle),
  417.                                   .in_datnvol(snd_datnvol),
  418.                                   .in_wraddr(snd_addr),
  419.                                   .in_data(snd_data),
  420.  
  421.                                   .dac_clock(dac_bitck),
  422.                                   .dac_leftright(dac_lrck),
  423.                                   .dac_data(dac_dat) );
  424.  
  425.  
  426.  
  427. // INTERRUPTS module
  428.  
  429.         interrupts my_interrupts( .clk_24mhz(clk_24mhz),
  430.                                   .clk_z80(clk_fpga),
  431.  
  432.                                   .m1_n(m1_n),
  433.                                   .iorq_n(iorq_n),
  434.  
  435.                                   .int_n(int_n) );
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443. // MP3, SDcard spi modules
  444.  
  445.  
  446.         spi spi_mp3_data( .clock(clk_fpga),
  447.                           .sck(mp3_clk),
  448.                           .sdo(mp3_dat),
  449.                           .bsync(mp3_sync),
  450.                           .din(md_din),
  451.                           .start(md_start),
  452.                           .halfspeed(md_halfspeed),
  453.                           .sdi(1'b0) );
  454.  
  455.         spi spi_mp3_control( .clock(clk_fpga),
  456.                              .sck(ma_clk),
  457.                              .sdo(ma_do),
  458.                              .sdi(ma_di),
  459.                              .din(mc_din),
  460.                              .dout(mc_dout),
  461.                              .start(mc_start),
  462.                              .halfspeed(mc_halfspeed) );
  463.  
  464.         spi spi_sd( .clock(clk_fpga),
  465.                     .sck(sd_clk),
  466.                     .sdo(sd_do),
  467.                     .sdi(sd_di),
  468.                     .din(sd_din),
  469.                     .dout(sd_dout),
  470.                     .start(sd_start),
  471.                     .halfspeed(1'b0) );
  472.  
  473.  
  474.  
  475.  
  476. endmodule
  477.  
  478.