Subversion Repositories zxusbnet

Rev

Rev 70 | Rev 116 | 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. `ifdef CLOCKED_FILTER
  9.         input  wire        fclk,
  10.         input  wire        bwr_n,
  11. `endif
  12.         input  wire [15:0] za,
  13.         inout  wire [ 7:0] zd,
  14.         //
  15.         inout  wire [ 7:0] bd,
  16.         //
  17.         input  wire        ziorq_n,
  18.         input  wire        zrd_n,
  19.         input  wire        zwr_n,
  20.         input  wire        zmreq_n,
  21.         output wire        ziorqge,
  22.         output wire        zblkrom,
  23.         input  wire        zcsrom_n,
  24.         input  wire        zrst_n,
  25.  
  26.         //
  27.         output wire        ports_wrena,
  28.         output wire        ports_wrstb_n,
  29.         output wire [ 1:0] ports_addr,
  30.         output wire [ 7:0] ports_wrdata,
  31.         input  wire [ 7:0] ports_rddata,
  32.        
  33.         //
  34.         input  wire [ 1:0] rommap_win,
  35.         input  wire        rommap_ena,
  36.  
  37.         //
  38.         output reg         sl811_cs_n,
  39.         output wire        sl811_a0,
  40.  
  41.         //
  42.         output reg         w5300_cs_n,
  43.         input  wire        w5300_ports
  44. );
  45.         parameter BASE_ADDR = 8'hAB;
  46.  
  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.  
  59. `ifdef CLOCKED_FILTER
  60.         reg pre_sl811_cs_n;
  61.         reg pre_w5300_cs_n;
  62. `endif
  63.  
  64.  
  65.  
  66.  
  67.  
  68.         // addr decode
  69.         assign io_addr_ok = (za[7:0]==BASE_ADDR);
  70.  
  71.  
  72.         // IORQGE
  73.         assign ziorqge = io_addr_ok ? 1'b1 : 1'bZ;
  74.  
  75.  
  76.  
  77.         // ports write
  78.         assign ports_addr = za[9:8];
  79.         //
  80.         assign ports_wrdata = zd;
  81.         //
  82.         assign ports_wrena   = io_addr_ok && za[15];
  83.         assign ports_wrstb_n = ziorq_n | zwr_n;
  84.  
  85.  
  86.  
  87.         // sl811 chip select and A0
  88. `ifdef CLOCKED_FILTER
  89.         always @(posedge fclk)
  90.         begin
  91.                 pre_sl811_cs_n <= !( !w5300_ports && io_addr_ok && ( !za[15] || (za[15] && za[9:8]==2'b00) ) && !ziorq_n );
  92.                 sl811_cs_n <= pre_sl811_cs_n;
  93.         end
  94. `else
  95.         always @*
  96.                 sl811_cs_n = !( !w5300_ports && io_addr_ok && ( !za[15] || (za[15] && za[9:8]==2'b00) ) && !ziorq_n );
  97. `endif
  98.  
  99.         //
  100.         assign sl811_a0 = ~za[15];
  101.  
  102.  
  103.         // w5300 chip select
  104.         assign mwr = !zmreq_n && !zwr_n && (za[15:14]==rommap_win) && rommap_ena;
  105.         assign mrd = !zmreq_n && !zrd_n && !zcsrom_n && (za[15:14]==rommap_win) && rommap_ena;
  106.         //
  107. `ifdef CLOCKED_FILTER  
  108.         always @(posedge fclk)
  109.         begin
  110.                 pre_w5300_cs_n <= ~(mwr || mrd || ( w5300_ports && io_addr_ok && !za[15] && !ziorq_n ) );
  111.                 w5300_cs_n <= pre_w5300_cs_n;
  112.         end
  113. `else
  114.         always @*
  115.                 w5300_cs_n = ~(mwr || mrd || ( w5300_ports && io_addr_ok && !za[15] && !ziorq_n ) );
  116. `endif
  117.  
  118.         // block ROM
  119.         assign zblkrom = (rommap_ena && (za[15:14]==rommap_win)) ? 1'b1 : 1'bZ;
  120.  
  121.  
  122.  
  123.         assign ena_dbuf = (~sl811_cs_n) | (~w5300_cs_n);
  124. `ifdef CLOCKED_FILTER
  125.         assign ena_din  = ~bwr_n;
  126. `else
  127.         assign ena_din  = ~zwr_n;
  128. `endif
  129.         assign ena_dout = ~zrd_n;
  130.  
  131.  
  132.         // ports data read/buffering
  133.         assign zd = (io_addr_ok && !ziorq_n && !zrd_n && za[15] && (za[9:8]!=2'b00)) ?
  134.                     ports_rddata : ( (ena_dbuf && ena_dout) ? bd : 8'bZZZZ_ZZZZ );
  135.  
  136.  
  137.         assign bd = (ena_dbuf && ena_din) ? zd : 8'bZZZZ_ZZZZ;
  138.  
  139. endmodule
  140.  
  141.