Subversion Repositories zxusbnet

Rev

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

  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.         wire ziorq_n_lcell;
  45.         wire zrd_n_lcell;
  46.         wire zn1,zn2,zn3;
  47.  
  48.  
  49.         wire io_addr_ok;
  50.  
  51.         wire mrd, mwr;
  52.  
  53.         wire ena_dbuf;
  54.         wire ena_din;
  55.         wire ena_dout;
  56.  
  57.  
  58.         // addr decode
  59.         assign io_addr_ok = (za[7:0]==BASE_ADDR);
  60.  
  61.  
  62.         // IORQGE
  63.         assign ziorqge = io_addr_ok ? 1'b1 : 1'bZ;
  64.  
  65.  
  66.  
  67.         // ports write
  68.         assign ports_addr = za[9:8];
  69.         //
  70.         assign ports_wrdata = zd;
  71.         //
  72.         assign ports_wrena   = io_addr_ok && za[15];
  73.         assign ports_wrstb_n = ziorq_n | zwr_n;
  74.  
  75.         lcell lcell1(ziorq_n, zn1);
  76.         lcell lcell2(zn1, zn2);
  77. //      lcell lcell3(zn2, zn3);
  78.         lcell lcelln(ziorq_n & zn1, ziorq_n_lcell);
  79.  
  80.  
  81.         // sl811 chip select and A0
  82.         assign sl811_cs_n = !( !w5300_ports && io_addr_ok && ( !za[15] || (za[15] && za[9:8]==2'b00) ) && !ziorq_n_lcell );
  83.         //
  84.         assign sl811_a0 = ~za[15];
  85.  
  86.  
  87.         // w5300 chip select
  88.         assign mwr = !zmreq_n && !zwr_n && (za[15:14]==rommap_win) && rommap_ena;
  89.         assign mrd = !zmreq_n && !zrd_n && !zcsrom_n && (za[15:14]==rommap_win) && rommap_ena;
  90.         //
  91.         assign w5300_cs_n = ~(mwr || mrd || ( w5300_ports && io_addr_ok && !za[15] && !ziorq_n ) );
  92.  
  93.         // block ROM
  94.         assign zblkrom = (rommap_ena && (za[15:14]==rommap_win)) ? 1'b1 : 1'bZ;
  95.  
  96.  
  97.  
  98.         assign ena_dbuf = (~sl811_cs_n) | (~w5300_cs_n);
  99.         assign ena_din  = ~zwr_n;
  100.         assign ena_dout = ~zrd_n;
  101.  
  102.  
  103.         // ports data read/buffering
  104.         assign zd = (io_addr_ok && !ziorq_n && !zrd_n && za[15] && (za[9:8]!=2'b00)) ?
  105.                     ports_rddata : ( (ena_dbuf && ena_dout) ? bd : 8'bZZZZ_ZZZZ );
  106.  
  107.  
  108.         assign bd = (ena_dbuf && ena_din) ? zd : 8'bZZZZ_ZZZZ;
  109.  
  110. endmodule
  111.  
  112.