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. // 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 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.         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.  
  91.  
  92.  
  93.         // USB chip clock
  94.         initial // for simulation
  95.         begin
  96.                 usb_ckreg <= 1'b0;
  97.                 usb_clk   <= 1'b0;
  98.         end
  99.         //
  100.         always @(posedge fclk)
  101.         begin
  102.                 usb_ckreg <=  usb_clk;
  103.                 usb_clk   <= ~usb_ckreg;
  104.         end
  105.  
  106.  
  107.  
  108.  
  109.         // zx-bus
  110.         zbus zbus
  111.         (
  112.                 .fclk(fclk),
  113.  
  114.                 .za(za),
  115.                 .zd(zd),
  116.                 //
  117.                 .bd(bd),
  118.                 //
  119.                 .ziorq_n (ziorq_n ),
  120.                 .zrd_n   (zrd_n   ),
  121.                 .zwr_n   (zwr_n   ),
  122.                 .zmreq_n (zmreq_n ),
  123.                 .ziorqge (ziorqge ),
  124.                 .zblkrom (zblkrom ),
  125.                 .zcsrom_n(zcsrom_n),
  126.                 .zrst_n  (zrst_n  ),
  127.                 //
  128.                 .ports_wrena  (ports_wrena  ),
  129.                 .ports_wrstb_n(ports_wrstb_n),
  130.                 .ports_addr   (ports_addr   ),
  131.                 .ports_wrdata (ports_wrdata ),
  132.                 .ports_rddata (ports_rddata ),
  133.                 //
  134.                 .rommap_win(rommap_win),
  135.                 .rommap_ena(rommap_ena),
  136.                 //
  137.                 .sl811_cs_n(sl811_cs_n),
  138.                 .sl811_a0  (sl811_a0  ),
  139.                 //
  140.                 .w5300_cs_n (w5300_cs_n ),
  141.                 .w5300_ports(w5300_ports)
  142.         );
  143.  
  144.  
  145.         // map Z80 space to wiznet space
  146.         wizmap wizmap
  147.         (
  148.                 .za(za),
  149.  
  150.                 .w5300_a0inv(w5300_a0inv),
  151.                 .w5300_addr (w5300_addr ),
  152.                 .w5300_ports(w5300_ports),
  153.                 .w5300_hi   (w5300_hi   )
  154.         );
  155.  
  156.  
  157.         // ports
  158.         ports ports
  159.         (
  160.                 .rst_n(zrst_n),
  161.                 //
  162.                 .wrstb_n(ports_wrstb_n),
  163.                 .wrena  (ports_wrena  ),
  164.                 .addr   (ports_addr   ),
  165.                 .wrdata (ports_wrdata ),
  166.                 .rddata (ports_rddata ),
  167.                 //
  168.                 .ena_w5300_int(ena_w5300_int),
  169.                 .ena_sl811_int(ena_sl811_int),
  170.                 .ena_zxbus_int(ena_zxbus_int),
  171.                 //
  172.                 .w5300_int_n(w5300_int_n),
  173.                 .sl811_intrq(sl811_intrq),
  174.                 //
  175.                 .internal_int(internal_int),
  176.                 //
  177.                 .rommap_win(rommap_win),
  178.                 .rommap_ena(rommap_ena),
  179.                 //
  180.                 .w5300_a0inv(w5300_a0inv),
  181.                 .w5300_rst_n(w5300_rst_n),
  182.                 .w5300_ports(w5300_ports),
  183.                 .w5300_hi   (w5300_hi   ),
  184.                 //
  185.                 .sl811_ms_n (sl811_ms_n ),
  186.                 .sl811_rst_n(sl811_rst_n),
  187.                 //
  188.                 .usb_power(usb_power)
  189.         );
  190.  
  191.  
  192.         // brd
  193.         always @(posedge fclk)
  194.         begin
  195.                 pre_brd_n <= zrd_n;
  196.                 brd_n     <= pre_brd_n;
  197.         end
  198.         // bwr
  199.         always @(posedge fclk)
  200.         begin
  201.                 bwr_n_r  <= zwr_n;
  202.                 bwr_n_rr <= bwr_n_r;
  203.                 //
  204.                 if( bwr_n_rr )
  205.                         shreg <= 5'b1_1111;
  206.                 else
  207.                         shreg <= {shreg[3:0],1'b0};
  208.                 //
  209.                 bwr_n <= bwr_n_r || !shreg;
  210.         end
  211.  
  212. /*      `else
  213.         // buffered RD_N and WR_N
  214.         always @* brd_n = zrd_n;
  215.         always @* bwr_n = zwr_n;
  216. */
  217.  
  218.         // interrupt generation
  219.         assign internal_int = (ena_w5300_int & (~w5300_int_n)) |
  220.                               (ena_sl811_int &   sl811_intrq ) ;
  221.         //
  222.         assign zint_n = (internal_int & ena_zxbus_int) ? 1'b0 : 1'bZ;
  223.  
  224.  
  225. endmodule
  226.  
  227.