Subversion Repositories zxusbnet

Rev

Rev 79 | Rev 81 | 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        fclk,
  9.  
  10.         input  wire [15:0] za,
  11.         inout  wire [ 7:0] zd,
  12.         //
  13.         inout  wire [ 7:0] bd,
  14.         //
  15.         input  wire        ziorq_n,
  16.         input  wire        zrd_n,
  17.         input  wire        zwr_n,
  18.         input  wire        zmreq_n,
  19.         output wire        ziorqge,
  20.         output wire        zblkrom,
  21.         input  wire        zcsrom_n,
  22.         input  wire        zrst_n,
  23.  
  24.         //
  25.         output wire        ports_wrena,
  26.         output wire        ports_wrstb_n,
  27.         output wire [ 1:0] ports_addr,
  28.         output wire [ 7:0] ports_wrdata,
  29.         input  wire [ 7:0] ports_rddata,
  30.        
  31.         //
  32.         input  wire [ 1:0] rommap_win,
  33.         input  wire        rommap_ena,
  34.  
  35.         //
  36.         output reg         sl811_cs_n,
  37.         output wire        sl811_a0,
  38.  
  39.         //
  40.         output reg         w5300_cs_n,
  41.         input  wire        w5300_ports,
  42.  
  43.         // buffered rd/wr strobes to usb/ether chips
  44.         output reg         bwr_n,
  45.         output reg         brd_n
  46. );
  47.         parameter BASE_ADDR = 8'hAB;
  48.  
  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.         reg pre_sl811_cs_n;
  61.         reg pre_w5300_cs_n;
  62.  
  63.  
  64.  
  65.  
  66.         // for filtering strobes
  67.         reg [2:0] wr_regs;
  68.         reg [2:0] rd_regs;
  69.         reg       wr_state,
  70.                   rd_state;
  71.         wire      wr_start,
  72.                   rd_start;
  73.  
  74.         //
  75.         reg [2:0] ctr_5;
  76.  
  77.  
  78.  
  79.  
  80.         // common read and write latches latch
  81.         reg [7:0] read_latch;
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.         // make filtered out vesions of read/write strobes
  89.         always @(posedge fclk)
  90.         begin
  91.                 wr_regs[2:0] <= { wr_regs[1:0], ~zwr_n };
  92.                 rd_regs[2:0] <= { rd_regs[1:0], ~zrd_n };
  93.         end
  94.         //
  95.         always @(posedge fclk)
  96.         begin
  97.                      if( wr_regs[2:1]==2'b11 && !wr_state )
  98.                         wr_state <= 1'b1;
  99.                 else if( wr_regs[2:1]==2'b00 &&  wr_state )
  100.                         wr_state <= 1'b0;
  101.                 //
  102.                      if( rd_regs[2:1]==2'b11 && !rd_state )
  103.                         rd_state <= 1'b1;
  104.                 else if( rd_regs[2:1]==2'b00 &&  rd_state )
  105.                         rd_state <= 1'b0;
  106.         end
  107.         //
  108.         assign wr_start = wr_regs[2:1]==2'b11 && !wr_state;
  109.         assign rd_start = rd_regs[2:1]==2'b11 && !rd_state;
  110.  
  111.  
  112.         // buffered rd/wrs
  113.         always @(posedge fclk)
  114.         begin
  115.                 if( wr_start )
  116.                         bwr_n <= 1'b0;
  117.                 else if( !ctr_5 )
  118.                         bwr_n <= 1'b1;
  119.                 //
  120.                 if( rd_start )
  121.                         brd_n <= 1'b0;
  122.                 else if( !ctr_5 )
  123.                         brd_n <= 1'b1;
  124.         end
  125.         //
  126.         always @(posedge fclk)
  127.         if( wr_start || rd_start )
  128.                 ctr_5 <= 3'd4;
  129.         else
  130.                 ctr_5 <= ctr_5 - 3'd1;
  131.  
  132.  
  133.  
  134.  
  135.         // addr decode
  136.         assign io_addr_ok = (za[7:0]==BASE_ADDR);
  137.  
  138.  
  139.         // IORQGE
  140.         assign ziorqge = io_addr_ok ? 1'b1 : 1'bZ;
  141.  
  142.  
  143.  
  144.         // ports write
  145.         assign ports_addr = za[9:8];
  146.         //
  147.         assign ports_wrdata = zd;
  148.         //
  149.         assign ports_wrena   = io_addr_ok && za[15];
  150.         assign ports_wrstb_n = ziorq_n | zwr_n;
  151.  
  152.  
  153.  
  154.         always @*
  155.                 sl811_cs_n = !( !w5300_ports && io_addr_ok && ( !za[15] || (za[15] && za[9:8]==2'b00) ) && !ziorq_n );
  156.  
  157.         //
  158.         assign sl811_a0 = ~za[15];
  159.  
  160.  
  161.         // w5300 chip select
  162.         assign mwr = !zmreq_n && !zwr_n && (za[15:14]==rommap_win) && rommap_ena;
  163.         assign mrd = !zmreq_n && !zrd_n && !zcsrom_n && (za[15:14]==rommap_win) && rommap_ena;
  164.         //
  165.         always @*
  166.                 w5300_cs_n = ~(mwr || mrd || ( w5300_ports && io_addr_ok && !za[15] && !ziorq_n ) );
  167.  
  168.         // block ROM
  169.         assign zblkrom = (rommap_ena && (za[15:14]==rommap_win)) ? 1'b1 : 1'bZ;
  170.  
  171.  
  172.  
  173.         assign ena_dbuf = (~sl811_cs_n) | (~w5300_cs_n);
  174.        
  175.  
  176.  
  177.         assign ena_din  = ~zwr_n;
  178.        
  179.         assign ena_dout = ~zrd_n;
  180.  
  181.  
  182.         // ports data read/buffering
  183.         assign zd = (io_addr_ok && !ziorq_n && !zrd_n && za[15] && (za[9:8]!=2'b00)) ?
  184.                     ports_rddata : ( (ena_dbuf && ena_dout) ? bd : 8'bZZZZ_ZZZZ );
  185.  
  186.  
  187.         assign bd = (ena_dbuf && ena_din) ? zd : 8'bZZZZ_ZZZZ;
  188.  
  189. endmodule
  190.  
  191.