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. // top-level module
  5.  
  6. module top
  7. (
  8.         // zxbus
  9.         input  wire [15:0] za,
  10.         inout  wire [ 7:0] zd,
  11.        
  12.         // buffered data bus for chips
  13.         inout  wire [ 7:0] bd,
  14.  
  15.         // zxbus control signals
  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. `ifndef NO_INTERRUPTS
  25.         output wire        zint_n,
  26. `endif
  27. `ifdef  CLOCKED_FILTER
  28.         input  wire        fclk,
  29. `endif
  30.  
  31.         // buffered RD_N and WR_N for chips
  32.         output reg         brd_n,
  33.         output reg         bwr_n,
  34.  
  35.  
  36.         // w5300 Ethernet chip
  37.         output wire        w5300_rst_n,
  38.         output wire [ 9:0] w5300_addr,
  39.         output wire        w5300_cs_n,
  40.         input  wire        w5300_int_n,
  41.  
  42.  
  43.         // sl811 Usb chip
  44.         output wire        sl811_rst_n,
  45.         input  wire        sl811_intrq,
  46.         output wire        sl811_ms_n,
  47.         output wire        sl811_cs_n,
  48.         output wire        sl811_a0,
  49.  
  50.         // usb power presence
  51.         input  wire        usb_power
  52.  
  53.         // = total 56 pins (maximum is 66)
  54.         //   among them 27 outputs (maximum is 64)
  55. );
  56.  
  57.  
  58.  
  59.         // CLOCKED_FILTER for brd/bwr:
  60.         // just resync for brd, resync + 6ck max for bwr
  61. `ifdef CLOCKED_FILTER
  62.         reg pre_brd_n;
  63.  
  64.         reg bwr_n_r;
  65.         reg bwr_n_rr;
  66.  
  67.         reg [4:0] shreg;
  68. `endif
  69.  
  70.  
  71.  
  72. `ifndef NO_INTERRUPTS
  73.         wire ena_w5300_int;
  74.         wire ena_sl811_int;
  75.         wire ena_zxbus_int;
  76.         wire internal_int;
  77. `endif
  78.  
  79.         wire [7:0] ports_wrdata;
  80.         wire [7:0] ports_rddata;
  81.         wire [1:0] ports_addr;
  82.         wire       ports_wrena;
  83.         wire       ports_wrstb_n;
  84.  
  85.         wire [1:0] rommap_win;
  86.         wire       rommap_ena;
  87.  
  88.         wire       w5300_a0inv;
  89.         wire       w5300_ports;
  90.         wire [2:0] w5300_hi;
  91.  
  92.  
  93.         // zx-bus
  94.         zbus zbus
  95.         (
  96. `ifdef CLOCKED_FILTER
  97.                 .fclk(fclk),
  98.                 .bwr_n(bwr_n),
  99. `endif
  100.                 .za(za),
  101.                 .zd(zd),
  102.                 //
  103.                 .bd(bd),
  104.                 //
  105.                 .ziorq_n (ziorq_n ),
  106.                 .zrd_n   (zrd_n   ),
  107.                 .zwr_n   (zwr_n   ),
  108.                 .zmreq_n (zmreq_n ),
  109.                 .ziorqge (ziorqge ),
  110.                 .zblkrom (zblkrom ),
  111.                 .zcsrom_n(zcsrom_n),
  112.                 .zrst_n  (zrst_n  ),
  113.                 //
  114.                 .ports_wrena  (ports_wrena  ),
  115.                 .ports_wrstb_n(ports_wrstb_n),
  116.                 .ports_addr   (ports_addr   ),
  117.                 .ports_wrdata (ports_wrdata ),
  118.                 .ports_rddata (ports_rddata ),
  119.                 //
  120.                 .rommap_win(rommap_win),
  121.                 .rommap_ena(rommap_ena),
  122.                 //
  123.                 .sl811_cs_n(sl811_cs_n),
  124.                 .sl811_a0  (sl811_a0  ),
  125.                 //
  126.                 .w5300_cs_n (w5300_cs_n ),
  127.                 .w5300_ports(w5300_ports)
  128.         );
  129.  
  130.  
  131.         // map Z80 space to wiznet space
  132.         wizmap wizmap
  133.         (
  134.                 .za(za),
  135.  
  136.                 .w5300_a0inv(w5300_a0inv),
  137.                 .w5300_addr (w5300_addr ),
  138.                 .w5300_ports(w5300_ports),
  139.                 .w5300_hi   (w5300_hi   )
  140.         );
  141.  
  142.  
  143.         // ports
  144.         ports ports
  145.         (
  146.                 .rst_n(zrst_n),
  147.                 //
  148.                 .wrstb_n(ports_wrstb_n),
  149.                 .wrena  (ports_wrena  ),
  150.                 .addr   (ports_addr   ),
  151.                 .wrdata (ports_wrdata ),
  152.                 .rddata (ports_rddata ),
  153.                 //
  154. `ifndef NO_INTERRUPTS
  155.                 .ena_w5300_int(ena_w5300_int),
  156.                 .ena_sl811_int(ena_sl811_int),
  157.                 .ena_zxbus_int(ena_zxbus_int),
  158. `endif
  159.                 //
  160.                 .w5300_int_n(w5300_int_n),
  161.                 .sl811_intrq(sl811_intrq),
  162.                 //
  163. `ifndef NO_INTERRUPTS
  164.                 .internal_int(internal_int),
  165. `endif
  166.                 //
  167.                 .rommap_win(rommap_win),
  168.                 .rommap_ena(rommap_ena),
  169.                 //
  170.                 .w5300_a0inv(w5300_a0inv),
  171.                 .w5300_rst_n(w5300_rst_n),
  172.                 .w5300_ports(w5300_ports),
  173.                 .w5300_hi   (w5300_hi   ),
  174.                 //
  175.                 .sl811_ms_n (sl811_ms_n ),
  176.                 .sl811_rst_n(sl811_rst_n),
  177.                 //
  178.                 .usb_power(usb_power)
  179.         );
  180.  
  181.  
  182. `ifdef CLOCKED_FILTER
  183.         // brd
  184.         always @(posedge fclk)
  185.         begin
  186.                 pre_brd_n <= zrd_n;
  187.                 brd_n     <= pre_brd_n;
  188.         end
  189.         // bwr
  190.         always @(posedge fclk)
  191.         begin
  192.                 bwr_n_r  <= zwr_n;
  193.                 bwr_n_rr <= bwr_n_r;
  194.                 //
  195.                 if( bwr_n_rr )
  196.                         shreg <= 5'b1_1111;
  197.                 else
  198.                         shreg <= {shreg[3:0],1'b0};
  199.                 //
  200.                 bwr_n <= bwr_n_r || !shreg;
  201.         end
  202. `else
  203.         // buffered RD_N and WR_N
  204.         always @* brd_n = zrd_n;
  205.         always @* bwr_n = zwr_n;
  206. `endif
  207.  
  208.  
  209. `ifndef NO_INTERRUPTS
  210.         // interrupt generation
  211.         assign internal_int = (ena_w5300_int & (~w5300_int_n)) |
  212.                               (ena_sl811_int &   sl811_intrq ) ;
  213.         //
  214.         assign zint_n = (internal_int & ena_zxbus_int) ? 1'b0 : 1'bZ;
  215. `endif
  216.  
  217.  
  218. endmodule
  219.  
  220.