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 mc_start;
  218.         wire [1:0] mc_speed;
  219.         wire mc_rdy;
  220.  
  221.         wire md_start;
  222.         wire md_halfspeed;
  223.  
  224.         wire sd_start;
  225.  
  226.  
  227. // LED related
  228.  
  229.         wire led_toggle;
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236. // CODE STARTS
  237.  
  238. // reset handling
  239.  
  240.         resetter my_rst( .clk(clk_fpga),
  241.                          .rst_in1_n( warmres_n ), .rst_in2_n( rst_from_zx_n ),
  242.                          .rst_out_n( internal_reset_n ) );
  243.  
  244.         always @* // reset for Z80
  245.         begin
  246.                 if( internal_reset_n == 1'b0 )
  247.                         z80res_n <= 1'b0;
  248.                 else
  249.                         z80res_n <= 1'bZ;
  250.         end
  251.  
  252.  
  253.  
  254.  
  255. // control Z80 data bus
  256.  
  257.         always @*
  258.         begin
  259.                 if( (!m1_n) && (!iorq_n) )
  260.                 begin
  261.                         d <= 8'hFF;
  262.                 end
  263.                 else
  264.                 begin
  265.                         if( ports_busin==1'b1 ) // FPGA inputs on data bus
  266.                                 d <= 8'bZZZZZZZZ;
  267.                         else // FPGA outputs
  268.                                 d <= ports_dout;
  269.                 end
  270.         end
  271.  
  272. // control /BUSRQ
  273.  
  274.         assign busrq_n = 1'b1;
  275.  
  276.  
  277.  
  278.  
  279.  
  280. // ZXBUS module
  281.  
  282.         zxbus my_zxbus( .cpu_clock(clk_fpga),
  283.                         .rst_n(internal_reset_n),
  284.                         .rst_from_zx_n(rst_from_zx_n),
  285.  
  286.                         .nmi_n(nmi_n),
  287.  
  288.                         .zxid(zxid),
  289.                         .zxa(zxa),
  290.                         .zxa14(zxa14),
  291.                         .zxa15(zxa15),
  292.                         .zxiorq_n(zxiorq_n),
  293.                         .zxmreq_n(zxmreq_n),
  294.                         .zxrd_n(zxrd_n),
  295.                         .zxwr_n(zxwr_n),
  296.                         .zxblkiorq_n(zxblkiorq_n),
  297.                         .zxblkrom_n(zxblkrom_n),
  298.                         .zxcsrom_n(zxcsrom_n),
  299.                         .zxgenwait_n(zxgenwait_n),
  300.                         .zxbusin(zxbusin),
  301.                         .zxbusena_n(zxbusena_n),
  302.  
  303.                         .command_reg_out(command_zx2gs),
  304.                         .data_reg_out(data_zx2gs),
  305.                         .data_reg_in(data_gs2zx),
  306.                         .command_bit(command_bit_2gs),
  307.                         .command_bit_in(command_bit_2zx),
  308.                         .command_bit_wr(command_bit_wr),
  309.                         .data_bit(data_bit_2gs),
  310.                         .data_bit_in(data_bit_2zx),
  311.                         .data_bit_wr(data_bit_wr),
  312.  
  313.                         .led_toggle(led_toggle) );
  314.  
  315.  
  316.  
  317. // MEMMAP module
  318.  
  319.         memmap my_memmap( .a14(a[14]),
  320.                           .a15(a[15]),
  321.                           .mreq_n(mreq_n),
  322.                           .rd_n(rd_n),
  323.                           .wr_n(wr_n),
  324.                           .mema14(mema14),
  325.                           .mema15(mema15),
  326.                           .mema16(mema16),
  327.                           .mema17(mema17),
  328.                           .mema18(mema18),
  329.  
  330.                           .ram0cs_n(ram0cs_n),
  331.                           .ram1cs_n(ram1cs_n),
  332.                           .ram2cs_n(ram2cs_n),
  333.                           .ram3cs_n(ram3cs_n),
  334.                           .romcs_n(romcs_n),
  335.                           .memoe_n(memoe_n),
  336.                           .memwe_n(memwe_n),
  337.  
  338.                           .mode_ramro(mode_ramro),
  339.                           .mode_norom(mode_norom),
  340.                           .mode_pg0(mode_pg0),
  341.                           .mode_pg1(mode_pg1) );
  342.  
  343.  
  344.  
  345. // PORTS module
  346.  
  347.         ports my_ports( .dout(ports_dout),
  348.                         .din(d),
  349.                         .busin(ports_busin),
  350.                         .a(a),
  351.                         .iorq_n(iorq_n),
  352.                         .mreq_n(mreq_n),
  353.                         .rd_n(rd_n),
  354.                         .wr_n(wr_n),
  355.  
  356.                         .rst_n(internal_reset_n),
  357.  
  358.                         .cpu_clock(clk_fpga),
  359.  
  360.                         .clksel0(clksel0),
  361.                         .clksel1(clksel1),
  362.  
  363.                         .snd_wrtoggle(snd_wrtoggle),
  364.                         .snd_datnvol(snd_datnvol),
  365.                         .snd_addr(snd_addr),
  366.                         .snd_data(snd_data),
  367.                         .mode_8chans(mode_8chans),
  368.                         .mode_pan4ch(mode_pan4ch),
  369.  
  370.                         .command_port_input(command_zx2gs),
  371.                         .command_bit_input(command_bit_2gs),
  372.                         .command_bit_output(command_bit_2zx),
  373.                         .command_bit_wr(command_bit_wr),
  374.                         .data_port_input(data_zx2gs),
  375.                         .data_port_output(data_gs2zx),
  376.                         .data_bit_input(data_bit_2gs),
  377.                         .data_bit_output(data_bit_2zx),
  378.                         .data_bit_wr(data_bit_wr),
  379.  
  380.                         .mode_ramro(mode_ramro),
  381.                         .mode_norom(mode_norom),
  382.                         .mode_pg0(mode_pg0),
  383.                         .mode_pg1(mode_pg1),
  384.  
  385.                         .md_din(md_din),
  386.                         .md_start(md_start),
  387.                         .md_dreq(mp3_req),
  388.                         .md_halfspeed(md_halfspeed),
  389.  
  390.                         .mc_ncs(ma_cs),
  391.                         .mc_xrst(mp3_xreset),
  392.                         .mc_dout(mc_dout),
  393.                         .mc_din(mc_din),
  394.                         .mc_start(mc_start),
  395.                         .mc_speed(mc_speed),
  396.                         .mc_rdy(mc_rdy),
  397.  
  398.                         .sd_ncs(sd_cs),
  399.                         .sd_wp(sd_wp),
  400.                         .sd_det(sd_det),
  401.                         .sd_din(sd_din),
  402.                         .sd_dout(sd_dout),
  403.                         .sd_start(sd_start),
  404.  
  405.                         .led(led_diag),
  406.                         .led_toggle(led_toggle)
  407.  
  408.  
  409.                         );
  410.  
  411.  
  412.  
  413. // SOUND_MAIN module
  414.  
  415.         sound_main my_sound_main( .clock(clk_24mhz),
  416.  
  417.                                   .mode_8chans(mode_8chans),
  418.                                   .mode_pan4ch(mode_pan4ch),
  419.  
  420.                                   .in_wrtoggle(snd_wrtoggle),
  421.                                   .in_datnvol(snd_datnvol),
  422.                                   .in_wraddr(snd_addr),
  423.                                   .in_data(snd_data),
  424.  
  425.                                   .dac_clock(dac_bitck),
  426.                                   .dac_leftright(dac_lrck),
  427.                                   .dac_data(dac_dat) );
  428.  
  429.  
  430.  
  431. // INTERRUPTS module
  432.  
  433.         interrupts my_interrupts( .clk_24mhz(clk_24mhz),
  434.                                   .clk_z80(clk_fpga),
  435.  
  436.                                   .m1_n(m1_n),
  437.                                   .iorq_n(iorq_n),
  438.  
  439.                                   .int_n(int_n) );
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447. // MP3, SDcard spi modules
  448.  
  449.  
  450.         spi2 spi_mp3_data( .clock(clk_fpga),
  451.                            .sck(mp3_clk),
  452.                            .sdo(mp3_dat),
  453.                            .bsync(mp3_sync),
  454.                            .din(md_din),
  455.                            .start(md_start),
  456.                            .speed( {1'b0,md_halfspeed} ),
  457.                            .sdi(1'b0) );
  458.  
  459.         spi2 spi_mp3_control( .clock(clk_fpga),
  460.                               .sck(ma_clk),
  461.                               .sdo(ma_do),
  462.                               .sdi(ma_di),
  463.                               .din(mc_din),
  464.                               .dout(mc_dout),
  465.                               .start(mc_start),
  466.                               .rdy(mc_rdy),
  467.                               .speed(mc_speed) );
  468.  
  469.         spi2 spi_sd( .clock(clk_fpga),
  470.                      .sck(sd_clk),
  471.                      .sdo(sd_do),
  472.                      .sdi(sd_di),
  473.                      .din(sd_din),
  474.                      .dout(sd_dout),
  475.                      .start(sd_start),
  476.                      .speed(2'b00) );
  477.  
  478.  
  479.  
  480.  
  481. endmodule
  482.  
  483.