Subversion Repositories ngs

Rev

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

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