Subversion Repositories zxusbnet

Rev

Rev 62 | 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.         input  wire [15:0] za,
  9.         inout  wire [ 7:0] zd,
  10.         //
  11.         inout  wire [ 7:0] bd,
  12.         //
  13.         input  wire        ziorq_n,
  14.         input  wire        zrd_n,
  15.         input  wire        zwr_n,
  16.         input  wire        zmreq_n,
  17.         output wire        ziorqge,
  18.         output wire        zblkrom,
  19.         input  wire        zcsrom_n,
  20.         input  wire        zrst_n,
  21.  
  22.         //
  23.         output wire        ports_wrena,
  24.         output wire        ports_wrstb_n,
  25.         output wire [ 1:0] ports_addr,
  26.         output wire [ 7:0] ports_wrdata,
  27.         input  wire [ 7:0] ports_rddata,
  28.        
  29.         //
  30.         input  wire [ 1:0] rommap_win,
  31.         input  wire        rommap_ena,
  32.  
  33.         //
  34.         output wire        sl811_cs_n,
  35.         output wire        sl811_a0,
  36.  
  37.         //
  38.         output wire        w5300_cs_n,
  39.         input  wire        w5300_ports
  40. );
  41.         parameter BASE_ADDR = 8'hAB;
  42.  
  43.  
  44.  
  45.         wire io_addr_ok;
  46.  
  47.         wire mrd, mwr;
  48.  
  49.         wire ena_dbuf;
  50.         wire ena_din;
  51.         wire ena_dout;
  52.  
  53.  
  54.         // addr decode
  55.         assign io_addr_ok = (za[7:0]==BASE_ADDR);
  56.  
  57.  
  58.         // IORQGE
  59.         assign ziorqge = io_addr_ok ? 1'b1 : 1'bZ;
  60.  
  61.  
  62.  
  63.         // ports write
  64.         assign ports_addr = za[9:8];
  65.         //
  66.         assign ports_wrdata = zd;
  67.         //
  68.         assign ports_wrena   = io_addr_ok && za[15];
  69.         assign ports_wrstb_n = ziorq_n | zwr_n;
  70.  
  71.  
  72.  
  73.         // sl811 chip select and A0
  74.         assign sl811_cs_n = !( !w5300_ports && io_addr_ok && ( !za[15] || (za[15] && za[9:8]==2'b00) ) && !ziorq_n );
  75.         //
  76.         assign sl811_a0 = ~za[15];
  77.  
  78.  
  79.         // w5300 chip select
  80.         assign mwr = !zmreq_n && !zwr_n && (za[15:14]==rommap_win) && rommap_ena;
  81.         assign mrd = !zmreq_n && !zrd_n && !zcsrom_n && (za[15:14]==rommap_win) && rommap_ena;
  82.         //
  83.         assign w5300_cs_n = ~(mwr || mrd || ( w5300_ports && io_addr_ok && !za[15] && !ziorq_n ) );
  84.  
  85.         // block ROM
  86.         assign zblkrom = (rommap_ena && (za[15:14]==rommap_win)) ? 1'b1 : 1'bZ;
  87.  
  88.  
  89.  
  90.         assign ena_dbuf = (~sl811_cs_n) | (~w5300_cs_n);
  91.         assign ena_din  = ~zwr_n;
  92.         assign ena_dout = ~zrd_n;
  93.  
  94.  
  95.         // ports data read/buffering
  96.         assign zd = (io_addr_ok && !ziorq_n && !zrd_n && za[15] && (za[9:8]!=2'b00)) ?
  97.                     ports_rddata : ( (ena_dbuf && ena_dout) ? bd : 8'bZZZZ_ZZZZ );
  98.  
  99.  
  100.         assign bd = (ena_dbuf && ena_din) ? zd : 8'bZZZZ_ZZZZ;
  101.  
  102. endmodule
  103.  
  104.