Subversion Repositories zxusbnet

Rev

Rev 84 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

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