Subversion Repositories ngs

Rev

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

  1. // part of NeoGS project (c) 2007-2008 NedoPC
  2. //
  3.  
  4. // ports $00-$3f are in FPGA, $40-$ff are in CPLD
  5.  
  6. module ports(
  7.  
  8.         din,  // NGS z80 cpu DATA BUS inputs
  9.         dout, // NGS z80 cpu DATA BUS outputs
  10.         busin, // direction of bus: =1 - input, =0 - output
  11.         a, // NSG z80 cpu ADDRESS BUS
  12.  
  13.         iorq_n,mreq_n,rd_n,wr_n, // NGS z80 cpu control signals
  14.  
  15.  
  16.         data_port_input, // data_port input from zxbus module (async)
  17.         data_port_output, // data_port output to zxbus module (async to zxbus, sync here)
  18.         command_port_input, // command_port input from zxbus (async)
  19.  
  20.         data_bit_input, // data_bit from zxbus module (sync)
  21.         command_bit_input, // --//-- (sync)
  22.  
  23.         data_bit_output, // output to zxbus module
  24.         command_bit_output,
  25.  
  26.         data_bit_wr, // strobes (positive) to zxbus module, synchronous
  27.         command_bit_wr,
  28.  
  29.  
  30.         mode_8chans, // mode outputs for sound_main module
  31.         mode_pan4ch, //
  32.         mode_inv7b,  //
  33.  
  34.         mode_ramro, // mode outputs for memmap module
  35.         mode_norom,
  36.  
  37.         mode_pg0, // page registers for memmap module
  38.         mode_pg1,
  39.  
  40.  
  41.         clksel0, // clock select (output from FPGA)
  42.         clksel1,
  43.  
  44.  
  45.         snd_wrtoggle, // toggle to write sound data to sound system memory
  46.         snd_datnvol,  // whether it's for volume (=0) or for samples (=1)
  47.         snd_addr,     // address: which channel to be written (0-7)
  48.         snd_data,     // actual 8-bit data to be written
  49.  
  50.  
  51.         md_din, // mp3 data interface
  52.         md_start,
  53.         md_dreq,
  54.         md_halfspeed,
  55.  
  56.         mc_ncs, // mp3 control interface
  57.         mc_xrst,
  58.         mc_dout,
  59.         mc_din,
  60.         mc_start,
  61.         mc_speed,
  62.         mc_rdy,
  63.  
  64.         sd_ncs, // SD card interface
  65.         sd_dout,
  66.         sd_din,
  67.         sd_start,
  68.         sd_det,
  69.         sd_wp,
  70.  
  71.         led, // LED control
  72.         led_toggle,
  73.  
  74.  
  75.         dma_din_modules, // DMA control
  76.         //
  77.         dma_select_zx,
  78.         dma_dout_zx,
  79.         //
  80.         dma_wrstb,
  81.         dma_regsel,
  82.  
  83.         rst_n,
  84.  
  85.         cpu_clock // Z80 CPU clock (clk_fpga on schematics)
  86. );
  87.  
  88.  
  89.         localparam MPAG      = 6'h00;
  90.         localparam MPAGEX    = 6'h10;
  91.  
  92.         localparam ZXCMD     = 6'h01;
  93.         localparam ZXDATRD   = 6'h02;
  94.         localparam ZXDATWR   = 6'h03;
  95.         localparam ZXSTAT    = 6'h04;
  96.         localparam CLRCBIT   = 6'h05;
  97.  
  98.         localparam VOL1      = 6'h06;
  99.         localparam VOL2      = 6'h07;
  100.         localparam VOL3      = 6'h08;
  101.         localparam VOL4      = 6'h09;
  102.         localparam VOL5      = 6'h16;
  103.         localparam VOL6      = 6'h17;
  104.         localparam VOL7      = 6'h18;
  105.         localparam VOL8      = 6'h19;
  106.  
  107.         localparam DAMNPORT1 = 6'h0a;
  108.         localparam DAMNPORT2 = 6'h0b;
  109.  
  110.         localparam LEDCTR    = 6'h01;
  111.  
  112.         localparam GSCFG0    = 6'h0f;
  113.  
  114.         localparam SCTRL     = 6'h11;
  115.         localparam SSTAT     = 6'h12;
  116.  
  117.         localparam SD_SEND   = 6'h13;
  118.         localparam SD_READ   = 6'h13;
  119.         localparam SD_RSTR   = 6'h14;
  120.  
  121.         localparam MD_SEND   = 6'h14; // same as SD_RSTR!!!
  122.  
  123.         localparam MC_SEND   = 6'h15;
  124.         localparam MC_READ   = 6'h15;
  125.  
  126.         localparam DMA_MOD   = 6'h1b; // read/write
  127.         localparam DMA_HAD   = 6'h1c; // LSB bits 1:0 are 00 // read/write all
  128.         localparam DMA_MAD   = 6'h1d; //                  01
  129.         localparam DMA_LAD   = 6'h1e; //                  10
  130.         localparam DMA_CST   = 6'h1f; //                  11
  131.  
  132.         localparam DMA_PORTS = 6'h1c; // mask for _HAD, _MAD, _LAD and _CST ports, two LSBs must be zero
  133.  
  134.         // FREE PORT ADDRESSES: $0C-$0E, $1A, $20-$3F
  135.  
  136.  
  137.         // inputs/outputs description
  138.  
  139.         input      [7:0] din;
  140.         output reg [7:0] dout;
  141.  
  142.         output reg busin; // =1 - dbus ins, =0 - dbus outs
  143.  
  144.         input [15:0] a;
  145.  
  146.         input iorq_n,mreq_n,rd_n,wr_n;
  147.  
  148.         input      [7:0] data_port_input;
  149.         input      [7:0] command_port_input;
  150.         output reg [7:0] data_port_output;
  151.  
  152.         input data_bit_input;
  153.         input command_bit_input;
  154.  
  155.         output reg data_bit_output;
  156.  
  157.         output reg command_bit_output;
  158.  
  159.         output reg data_bit_wr;
  160.  
  161.         output reg command_bit_wr;
  162.  
  163.         output reg mode_inv7b,
  164.                    mode_8chans,
  165.                    mode_pan4ch;
  166.  
  167.         output reg mode_ramro;
  168.  
  169.         output reg mode_norom;
  170.  
  171.         output reg [7:0] mode_pg0;
  172.         output reg [7:0] mode_pg1;
  173.  
  174.         output reg clksel0;
  175.         output reg clksel1;
  176.  
  177.  
  178.         output reg snd_wrtoggle;
  179.         output reg snd_datnvol;
  180.         output reg [2:0] snd_addr;
  181.         output reg [7:0] snd_data;
  182.  
  183.  
  184.         input rst_n;
  185.  
  186.         input cpu_clock;
  187.  
  188.  
  189.  
  190.  
  191.         // SPI interfaces related
  192.  
  193.         // MP3 data interface
  194.         output [7:0] md_din; // data to MP3 data SPI interface
  195.  
  196.         output md_start; // start toggle for mp3 data spi
  197.  
  198.         input md_dreq; // data request from mp3 decoder
  199.  
  200.         output reg md_halfspeed;
  201.  
  202.  
  203.         // MP3 control interface
  204.         output reg mc_ncs; // nCS signal
  205.  
  206.         output reg mc_xrst; // xRESET signal
  207.  
  208.         output mc_start; // start toggle
  209.  
  210.         output reg [1:0] mc_speed;
  211.  
  212.         input mc_rdy;
  213.  
  214.         output [7:0] mc_din; // data to send
  215.  
  216.         input [7:0] mc_dout; // received data
  217.  
  218.  
  219.       // SDcard interface
  220.         output reg sd_ncs;
  221.  
  222.         output sd_start;
  223.  
  224.         output [7:0] sd_din;
  225.  
  226.         input [7:0] sd_dout;
  227.  
  228.         input sd_det;
  229.  
  230.         input sd_wp;
  231.  
  232.  
  233.         // DMA modules control
  234.         //
  235.         output reg [7:0] dma_din_modules;
  236.         //
  237.         input [7:0] dma_dout_zx;
  238.         output reg dma_select_zx;
  239.         //
  240.         output reg dma_wrstb;
  241.         output reg [1:0] dma_regsel;
  242.  
  243.  
  244.         // LED control register
  245.         output reg led;
  246.         input led_toggle;
  247.  
  248.  
  249.  
  250. // internal regs & wires
  251.  
  252.         reg mode_expag; // extended paging mode register
  253.  
  254.         reg port09_bit5;
  255.  
  256.         wire port_enabled; // =1 when port address is in enabled region ($00-$3f)
  257.         wire mem_enabled; // =1 when memory mapped sound regs are addressed ($6000-$7FFF)
  258.         reg volports_enabled; // when volume ports are addressed (6-9 and $16-$19)
  259.  
  260.         reg iowrn_reg; // registered io write signal (all positive edge!)
  261.         reg iordn_reg; // --//--
  262.         reg merdn_reg; // --//--
  263.  
  264.  
  265.         reg port_wr; // synchronous positive write pulse (write from z80 to fpga regs)
  266.         reg port_rd;  // synchronous positive read pulse (read done from fpga regs to z80)
  267.  
  268.         reg memreg_rd; // when memory-mapped sound regs are read
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.         wire port00_wr;   // specific write and read strobes (1 clock cycle long positive)
  276.         wire p_ledctr_wr;
  277.         wire port02_rd;
  278.         wire port03_wr;
  279.         wire port05_wrrd;
  280.         wire port09_wr;
  281.         wire port0a_wrrd;
  282.         wire port0b_wrrd;
  283.         wire port0f_wr;
  284.         wire port10_wr;
  285.  
  286. //      wire p_sstat_rd;
  287. //      wire p_sctrl_rd;
  288.         wire p_sctrl_wr;
  289.         wire p_sdsnd_wr;
  290. //      wire p_sdrd_rd;
  291.         wire p_sdrst_rd;
  292.         wire p_mdsnd_wr;
  293.         wire p_mcsnd_wr;
  294. //      wire p_mcrd_rd;
  295.  
  296.         wire p_dmamod_wr;
  297.         wire p_dmaports_wr;
  298.  
  299.  
  300.         reg [2:0] volnum; // volume register number from port address
  301.  
  302.  
  303.         reg [2:0] dma_module_select; // which dma module selected: zero - none selected
  304.         localparam DMA_NONE_SELECTED = 3'd0;
  305.         localparam DMA_MODULE_ZX     = 3'd1;
  306. //      localparam DMA_MODULE_...    = 3'd2;
  307.  
  308.         reg [7:0] dma_dout_modules; // select in data from different modules
  309.  
  310.  
  311. // actual code
  312.  
  313.         //enabled ports
  314.         assign port_enabled = ~(a[7] | a[6]); // $00-$3F
  315.  
  316.         //enabled mem
  317.         assign mem_enabled = (~a[15]) & a[14] & a[13]; // $6000-$7FFF
  318.  
  319.         // volume ports enabled
  320.         always @*
  321.         begin
  322.                 if( a[5:0]==VOL1 ||
  323.                     a[5:0]==VOL2 ||
  324.                     a[5:0]==VOL3 ||
  325.                     a[5:0]==VOL4 ||
  326.                     a[5:0]==VOL5 ||
  327.                     a[5:0]==VOL6 ||
  328.                     a[5:0]==VOL7 ||
  329.                     a[5:0]==VOL8 )
  330.  
  331.                         volports_enabled <= 1'b1;
  332.                 else
  333.                         volports_enabled <= 1'b0;
  334.         end
  335.  
  336.  
  337.  
  338.         //when data bus outputs
  339.         always @*
  340.         begin
  341.                 if( port_enabled && (!iorq_n) && (!rd_n) )
  342.                         busin <= 1'b0; // bus outputs
  343.                 else
  344.                         busin <= 1'b1; // bus inputs
  345.         end
  346.  
  347.  
  348.  
  349.         // rd/wr/iorq syncing in and pulses - old gen
  350.         always @(posedge cpu_clock)
  351.         begin
  352.                 iowrn_reg <= iorq_n | wr_n;
  353.                 iordn_reg <= iorq_n | rd_n;
  354.  
  355.                 if( port_enabled && (!iorq_n) && (!wr_n) && iowrn_reg )
  356.                         port_wr <= 1'b1;
  357.                 else
  358.                         port_wr <= 1'b0;
  359.  
  360.                 if( port_enabled && (!iorq_n) && (!rd_n) && iordn_reg )
  361.                         port_rd <= 1'b1;
  362.                 else
  363.                         port_rd <= 1'b0;
  364.  
  365.         end
  366.  
  367. /*
  368.         // new gen of port_rd and port_wr
  369.         reg [2:0] rd_sync;
  370.         reg [2:0] wr_sync;
  371.         always @(posedge cpu_clock)
  372.         begin
  373.                 rd_sync[2:0] <= { rd_sync[1:0], port_enabled&(~iorq_n)&(~rd_n) };
  374.                 wr_sync[2:0] <= { wr_sync[1:0], port_enabled&(~iorq_n)&(~wr_n) };
  375.  
  376.                 port_wr <= (wr_sync[1:0]==2'b01);
  377.                 port_rd <= (rd_sync[1:0]==2'b01);
  378.  
  379.         end
  380. */
  381.  
  382.         // mreq syncing and mem read pulse
  383.         always @(negedge cpu_clock)
  384.         begin
  385.                 merdn_reg <= mreq_n | rd_n;
  386.  
  387.                 if( mem_enabled && (!mreq_n) && (!rd_n) && merdn_reg )
  388.                         memreg_rd <= 1'b1;
  389.                 else
  390.                         memreg_rd <= 1'b0;
  391.  
  392.         end
  393.  
  394.  
  395.         // specific ports strobes
  396.         assign port00_wr   = ( a[5:0]==MPAG      && port_wr            );
  397.         assign port02_rd   = ( a[5:0]==ZXDATRD   && port_rd            );
  398.         assign port03_wr   = ( a[5:0]==ZXDATWR   && port_wr            );
  399.         assign port05_wrrd = ( a[5:0]==CLRCBIT   && (port_wr||port_rd) );
  400.         assign port09_wr   = ( a[5:0]==VOL4      && port_wr            );
  401.         assign port0a_wrrd = ( a[5:0]==DAMNPORT1 && (port_wr||port_rd) );
  402.         assign port0b_wrrd = ( a[5:0]==DAMNPORT2 && (port_wr||port_rd) );
  403.         assign port0f_wr   = ( a[5:0]==GSCFG0    && port_wr            );
  404.         assign port10_wr   = ( a[5:0]==MPAGEX    && port_wr            );
  405.  
  406.  
  407. //      assign p_sctrl_rd = ( a[5:0]==SCTRL  && port_rd );
  408.         assign p_sctrl_wr = ( a[5:0]==SCTRL  && port_wr );
  409. //      assign p_sstat_rd = ( a[5:0]==SSTAT  && port_rd );
  410.         assign p_sdsnd_wr = ( a[5:0]==SD_SEND && port_wr );
  411. //      assign p_sdrd_rd  = ( a[5:0]==SD_READ && port_rd );
  412.         assign p_sdrst_rd = ( a[5:0]==SD_RSTR && port_rd );
  413.         assign p_mdsnd_wr = ( a[5:0]==MD_SEND && port_wr );
  414.         assign p_mcsnd_wr = ( a[5:0]==MC_SEND && port_wr );
  415. //      assign p_mcrd_rd  = ( a[5:0]==MC_READ && port_rd );
  416.  
  417.         assign p_ledctr_wr = ( a[5:0]==LEDCTR && port_wr );
  418.  
  419.         assign p_dmamod_wr   = ( a[5:0]==DMA_MOD && port_wr );
  420.         assign p_dmaports_wr = ( {a[5:2],2'b00}==DMA_PORTS && port_wr );
  421.  
  422.  
  423.  
  424.  
  425.         // read from fpga to Z80
  426.         always @*
  427.         begin
  428.                 case( a[5:0] )
  429.                 ZXCMD: // command register
  430.                         dout <= command_port_input;
  431.                 ZXDATRD: // data register
  432.                         dout <= data_port_input;
  433.                 ZXSTAT: // status bits
  434.                         dout <= { data_bit_input, 6'bXXXXXX, command_bit_input };
  435.                 GSCFG0: // config register #0F
  436.                         dout <= { mode_inv7b, mode_pan4ch, clksel1, clksel0, mode_expag, mode_8chans, mode_ramro, mode_norom };
  437.  
  438.                 SSTAT:
  439.                         dout <= { 4'd0, mc_rdy, sd_wp, sd_det, md_dreq };
  440.                 SCTRL:
  441.                         dout <= { 2'd0, mc_speed[1], md_halfspeed, mc_speed[0], mc_xrst, mc_ncs, sd_ncs };
  442.                 SD_READ:
  443.                         dout <= sd_dout;
  444.                 SD_RSTR:
  445.                         dout <= sd_dout;
  446.                 MC_READ:
  447.                         dout <= mc_dout;
  448.  
  449.  
  450.                 DMA_MOD:
  451.                         dout <= { 5'd0, dma_module_select };
  452.                 DMA_HAD:
  453.                         dout <= dma_dout_modules;
  454.                 DMA_MAD:
  455.                         dout <= dma_dout_modules;
  456.                 DMA_LAD:
  457.                         dout <= dma_dout_modules;
  458.                 DMA_CST:
  459.                         dout <= dma_dout_modules;
  460.  
  461.  
  462.                 default:
  463.                         dout <= 8'bXXXXXXXX;
  464.                 endcase
  465.         end
  466.  
  467.  
  468.  
  469.  
  470.  
  471.         // write to $00 and $10 ports ++
  472.         always @(posedge cpu_clock)
  473.         begin
  474.                 if( port00_wr==1'b1 ) // port 00
  475.                 begin
  476.                         if( mode_expag==1'b0 ) // normal paging
  477.                                 mode_pg0[7:0] <= { din[6:0], 1'b0 };
  478.                         else // extended paging
  479.                                 mode_pg0[7:0] <= { din[6:0], din[7] };
  480.                 end
  481.  
  482.                 if( mode_expag==1'b0 && port00_wr==1'b1 ) // port 10 (when in normal mode, part of port 00)
  483.                         mode_pg1[7:0] <= { din[6:0], 1'b1 };
  484.                 else if( mode_expag==1'b1 && port10_wr==1'b1 )
  485.                         mode_pg1[7:0] <= { din[6:0], din[7] };
  486.         end
  487.  
  488.         // port $03 write ++
  489.         always @(posedge cpu_clock)
  490.         begin
  491.                 if( port03_wr==1'b1 )
  492.                         data_port_output <= din;
  493.         end
  494.  
  495.         // port $09 bit tracing
  496.         always @(posedge cpu_clock)
  497.         begin
  498.                 if( port09_wr==1'b1 )
  499.                         port09_bit5 <= din[5];
  500.         end
  501.  
  502.         // write and reset of port $0F ++
  503.         always @(posedge cpu_clock,negedge rst_n)
  504.         begin
  505.                 if( rst_n==1'b0 ) // reset!
  506.                         { mode_inv7b, mode_pan4ch, clksel1, clksel0, mode_expag, mode_8chans, mode_ramro, mode_norom } <= 8'b00110000;
  507.                 else // write to port
  508.                 begin
  509.                         if( port0f_wr == 1'b1 )
  510.                         begin
  511.                                 { mode_inv7b, mode_pan4ch, clksel1, clksel0, mode_expag, mode_8chans, mode_ramro, mode_norom } <= din[7:0];
  512.                         end
  513.                 end
  514.         end
  515.  
  516.         // data bit handling
  517.         always @*
  518.         case( {port02_rd,port03_wr,port0a_wrrd} )
  519.                 3'b100:
  520.                 begin
  521.                         data_bit_output <= 1'b0;
  522.                         data_bit_wr <= 1'b1;
  523.                 end
  524.  
  525.                 3'b010:
  526.                 begin
  527.                         data_bit_output <= 1'b1; // ++
  528.                         data_bit_wr <= 1'b1;
  529.                 end
  530.  
  531.                 3'b001:
  532.                 begin
  533.                         data_bit_output <= ~mode_pg0[0];
  534.                         data_bit_wr <= 1'b1;
  535.                 end
  536.  
  537.                 default:
  538.                 begin
  539.                         data_bit_output <= 1'bX;
  540.                         data_bit_wr <= 1'b0;
  541.                 end
  542.         endcase
  543.  
  544.         // command bit handling
  545.         always @*
  546.         case( {port05_wrrd,port0b_wrrd} )
  547.                 2'b10:
  548.                 begin
  549.                         command_bit_output <= 1'b0;
  550.                         command_bit_wr <= 1'b1;
  551.                 end
  552.  
  553.                 2'b01:
  554.                 begin
  555.                         command_bit_output <= port09_bit5;
  556.                         command_bit_wr <= 1'b1;
  557.                 end
  558.  
  559.                 default:
  560.                 begin
  561.                         command_bit_output <= 1'bX;
  562.                         command_bit_wr <= 1'b0;
  563.                 end
  564.         endcase
  565.  
  566.         // handle data going to sound module (volume and samples values)
  567.         always @*
  568.         begin
  569.                 case( a[5:0] ) // port addresses to volume register numbers
  570.                 VOL1:
  571.                         volnum <= 3'd0;
  572.                 VOL2:
  573.                         volnum <= 3'd1;
  574.                 VOL3:
  575.                         volnum <= 3'd2;
  576.                 VOL4:
  577.                         volnum <= 3'd3;
  578.                 VOL5:
  579.                         volnum <= 3'd4;
  580.                 VOL6:
  581.                         volnum <= 3'd5;
  582.                 VOL7:
  583.                         volnum <= 3'd6;
  584.                 VOL8:
  585.                         volnum <= 3'd7;
  586.                 default:
  587.                         volnum <= 3'bXXX;
  588.                 endcase
  589.         end
  590.  
  591.         // handling itself (sending data to sound module)
  592.         always @(posedge cpu_clock)
  593.         begin
  594.                 if( memreg_rd ) // memory read - sample data write
  595.                 begin
  596.                         snd_wrtoggle <= ~snd_wrtoggle;
  597.                         snd_datnvol  <= 1'b1; // sample data
  598.  
  599.                         if( !mode_8chans ) // 4 channel mode
  600.                                 snd_addr <= { 1'b0, a[9:8] };
  601.                         else // 8 channel mode
  602.                                 snd_addr <= a[10:8];
  603.  
  604.                         snd_data <= din;
  605.                 end
  606.                 else if( volports_enabled && port_wr )
  607.                 begin
  608.                         snd_wrtoggle <= ~snd_wrtoggle;
  609.                         snd_datnvol  <= 1'b0; // volume data
  610.                         snd_addr <= volnum;
  611.                         snd_data <= din;
  612.                 end
  613.         end
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.         //SPI (mp3, SD) interfaces
  621.  
  622.         assign sd_din = (a[5:0]==SD_RSTR) ? 8'hFF : din;
  623.         assign mc_din = din;
  624.         assign md_din = din;
  625.  
  626.  
  627.         assign sd_start = p_sdsnd_wr | p_sdrst_rd;
  628.         assign mc_start = p_mcsnd_wr;
  629.         assign md_start = p_mdsnd_wr;
  630.  
  631.  
  632.       always @(posedge cpu_clock, negedge rst_n)
  633.       begin
  634.                 if( !rst_n ) // async reset
  635.                 begin
  636.                         md_halfspeed <= 1'b0;
  637.                         mc_speed     <= 2'b01;
  638.                         mc_xrst      <= 1'b0;
  639.                         mc_ncs       <= 1'b1;
  640.                         sd_ncs       <= 1'b1;
  641.                 end
  642.                 else // clock
  643.                 begin
  644.                         if( p_sctrl_wr )
  645.                         begin
  646.                                 if( din[0] )
  647.                                         sd_ncs       <= din[7];
  648.  
  649.                                 if( din[1] )
  650.                                         mc_ncs       <= din[7];
  651.  
  652.                                 if( din[2] )
  653.                                         mc_xrst      <= din[7];
  654.  
  655.                                 if( din[3] )
  656.                                         mc_speed[0]  <= din[7];
  657.  
  658.                                 if( din[4] )
  659.                                         md_halfspeed <= din[7];
  660.  
  661.                                 if( din[5] )
  662.                                         mc_speed[1]  <= din[7];
  663.  
  664.                         end
  665.                 end
  666.       end
  667.  
  668.  
  669.         // LED control
  670.         always @(posedge cpu_clock, negedge rst_n)
  671.         begin
  672.                 if( !rst_n )
  673.                         led <= 1'b0;
  674.                 else
  675.                 begin
  676.                         if( p_ledctr_wr )
  677.                                 led <= din[0];
  678.                         else if( led_toggle )
  679.                                 led <= ~led;
  680.                 end
  681.  
  682.         end
  683.  
  684.  
  685.  
  686.  
  687.         // DMA control
  688.         //
  689.         always @(posedge cpu_clock, negedge rst_n) // selection of modules
  690.         begin
  691.                 if( !rst_n )
  692.                         dma_module_select <= DMA_NONE_SELECTED;
  693.                 else if( p_dmamod_wr )
  694.                         dma_module_select <= din[2:0];
  695.         end
  696.         //
  697.         always @* dma_din_modules = din; // translate Z80 bus out to all DMA modules
  698.         //
  699.         always @* // select modules by individual signals
  700.         begin
  701.                 dma_select_zx = 1'b0;
  702.                 //dma_select_... = 1'b0;
  703.  
  704.                 case( dma_module_select )
  705.                 DMA_MODULE_ZX:
  706.                         dma_select_zx = 1'b1;
  707.                 //DMA_MODULE_...:
  708.                 //      dma_select_... = 1'b1;
  709.                 endcase
  710.         end
  711.         //
  712.         always @* dma_wrstb = p_dmaports_wr; // translate dma write strobe
  713.         //
  714.         always @* dma_regsel = a[1:0];
  715.         //
  716.         always @* // route data from modules to the common module bus
  717.         begin
  718.                 case( dma_regsel )
  719.                 DMA_MODULE_ZX:
  720.                         dma_dout_modules <= dma_dout_zx;
  721.                 //DMA_MODULE_...:
  722.                 //      dma_dout_modules <= dma_dout_...;
  723.                 default:
  724.                         dma_dout_modules <= 8'bxxxxxxxx;
  725.                 endcase
  726.         end
  727.  
  728.  
  729. endmodule
  730.  
  731.