Subversion Repositories zxusbnet

Rev

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

  1. // ZXiznet project
  2. // (c) NedoPC 2012
  3. //
  4. // zx-bus functions: ports mapping/access, ROM mapping
  5.  
  6. module zbus
  7. #(
  8.         parameter LCELLS=1
  9. )
  10. (
  11.         input  wire [15:0] za,
  12.         inout  wire [ 7:0] zd,
  13.         //
  14.         inout  wire [ 7:0] bd,
  15.         //
  16.         input  wire        ziorq_n,
  17.         input  wire        zrd_n,
  18.         input  wire        zwr_n,
  19.         input  wire        zmreq_n,
  20.         output wire        ziorqge,
  21.         output wire        zblkrom,
  22.         input  wire        zcsrom_n,
  23.         input  wire        zrst_n,
  24.  
  25.         //
  26.         output wire        ports_wrena,
  27.         output wire        ports_wrstb_n,
  28.         output wire [ 1:0] ports_addr,
  29.         output wire [ 7:0] ports_wrdata,
  30.         input  wire [ 7:0] ports_rddata,
  31.        
  32.         //
  33.         input  wire [ 1:0] rommap_win,
  34.         input  wire        rommap_ena,
  35.  
  36.         //
  37.         output wire        sl811_cs_n,
  38.         output wire        sl811_a0,
  39.  
  40.         //
  41.         output wire        w5300_cs_n,
  42.         input  wire        w5300_ports
  43. );
  44.         localparam BASE_ADDR = 8'hAB;
  45.  
  46.  
  47.         wire ziorq_n_lcell;
  48.         wire zi[LCELLS-1:0];
  49.  
  50.  
  51.         wire io_addr_ok;
  52.  
  53.         wire mrd, mwr;
  54.  
  55.         wire ena_dbuf;
  56.         wire ena_din;
  57.         wire ena_dout;
  58.  
  59.  
  60.         // addr decode
  61.         assign io_addr_ok = (za[7:0]==BASE_ADDR);
  62.  
  63.  
  64.         // IORQGE
  65.         assign ziorqge = io_addr_ok ? 1'b1 : 1'bZ;
  66.  
  67.  
  68.  
  69.         // ports write
  70.         assign ports_addr = za[9:8];
  71.         //
  72.         assign ports_wrdata = zd;
  73.         //
  74.         assign ports_wrena   = io_addr_ok && za[15];
  75.         assign ports_wrstb_n = ziorq_n_lcell | zwr_n;
  76.  
  77.         genvar i;
  78.         generate
  79.                 for(i=0;i<LCELLS;i=i+1)
  80.                 begin : gen_iorq_wait
  81.                         if(i==0)
  82.                                 lcell lcelliorq(ziorq_n,zi[0]);
  83.                         else
  84.                                 lcell lcelliorq(zi[i-1],zi[i]);
  85.                 end
  86.         endgenerate
  87.  
  88.         lcell lcelliorq(ziorq_n & zi[LCELLS-1], ziorq_n_lcell);
  89.  
  90.  
  91.         // sl811 chip select and A0
  92.         assign sl811_cs_n = !( !w5300_ports && io_addr_ok && ( !za[15] || (za[15] && za[9:8]==2'b00) ) && !ziorq_n_lcell );
  93.         //
  94.         assign sl811_a0 = ~za[15];
  95.  
  96.  
  97.         // w5300 chip select
  98.         assign mwr = !zmreq_n && !zwr_n && (za[15:14]==rommap_win) && rommap_ena;
  99.         assign mrd = !zmreq_n && !zrd_n && !zcsrom_n && (za[15:14]==rommap_win) && rommap_ena;
  100.         //
  101.         assign w5300_cs_n = ~(mwr || mrd || ( w5300_ports && io_addr_ok && !za[15] && !ziorq_n_lcell ) );
  102.  
  103.         // block ROM
  104.         assign zblkrom = (rommap_ena && (za[15:14]==rommap_win)) ? 1'b1 : 1'bZ;
  105.  
  106.  
  107.  
  108.         assign ena_dbuf = (~sl811_cs_n) | (~w5300_cs_n);
  109.         assign ena_din  = ~zwr_n;
  110.         assign ena_dout = ~zrd_n;
  111.  
  112.  
  113.         // ports data read/buffering
  114.         assign zd = (io_addr_ok && !ziorq_n_lcell && !zrd_n && za[15] && (za[9:8]!=2'b00)) ?
  115.                     ports_rddata : ( (ena_dbuf && ena_dout) ? bd : 8'bZZZZ_ZZZZ );
  116.  
  117.  
  118.         assign bd = (ena_dbuf && ena_din) ? zd : 8'bZZZZ_ZZZZ;
  119.  
  120. endmodule
  121.  
  122.