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. // ports of card: #83AB, #82AB, #81AB (read/write),
  5. // correspond to addr=2'b11, 2'b10, 2'b01
  6.  
  7. module ports
  8. (
  9.         input  wire       rst_n,
  10.  
  11.         input  wire       wrstb_n, // write strobe for ports, latched at positive edge
  12.         input  wire       wrena,   // write enable for ports
  13.         //
  14.         input  wire [1:0] addr, // addressing: no port at 2'b00
  15.         //
  16.         input  wire [7:0] wrdata,
  17.         output reg  [7:0] rddata,
  18.  
  19.  
  20.         // inputs and outputs
  21. `ifndef NO_INTERRUPTS
  22.         output reg        ena_w5300_int,
  23.         output reg        ena_sl811_int,
  24.         output reg        ena_zxbus_int,
  25. `endif
  26.         input  wire       w5300_int_n,
  27.         input  wire       sl811_intrq,
  28. `ifndef NO_INTERRUPTS
  29.         input  wire       internal_int,
  30. `endif
  31.         //
  32.         output reg  [1:0] rommap_win,
  33.         output reg        rommap_ena,
  34.         output reg        w5300_a0inv,
  35.         output reg        w5300_rst_n,
  36.         output reg        w5300_ports,
  37.         output reg  [2:0] w5300_hi,
  38.  
  39.         //
  40.         output reg        sl811_ms_n,
  41.         output reg        sl811_rst_n,
  42.         //
  43.         input  wire       usb_power
  44. );
  45.  
  46.  
  47.  
  48.  
  49.         // wr #83AB
  50.         always @(posedge wrstb_n, negedge rst_n)
  51.         if( !rst_n )
  52.         begin
  53. `ifndef NO_INTERRUPTS
  54.                 ena_w5300_int <= 1'b0;
  55.                 ena_sl811_int <= 1'b0;
  56.                 ena_zxbus_int <= 1'b0;
  57. `endif
  58.                 w5300_rst_n <= 1'b0;
  59.                 sl811_rst_n <= 1'b0;
  60.         end
  61.         else if( wrena && addr==2'b11 )
  62.         begin
  63. `ifndef NO_INTERRUPTS
  64.                 ena_w5300_int <= wrdata[2];
  65.                 ena_sl811_int <= wrdata[3];
  66.                 ena_zxbus_int <= wrdata[6];
  67. `endif
  68.                 w5300_rst_n <= wrdata[4];
  69.                 sl811_rst_n <= wrdata[5];
  70.         end
  71.        
  72.  
  73.         // wr #82AB
  74.         always @(posedge wrstb_n, negedge rst_n)
  75.         if( !rst_n )
  76.         begin
  77.                 rommap_win <= 2'b00;
  78.                 rommap_ena <= 1'b0;
  79.                
  80.                 w5300_a0inv <= 1'b0;
  81.                 w5300_ports <= 1'b0;
  82.                 w5300_hi    <= 3'd0;
  83.         end
  84.         else if( wrena && addr==2'b10 )
  85.         begin
  86.                 rommap_win <= wrdata[1:0];
  87.                 rommap_ena <= wrdata[2] & (~wrdata[4]);
  88.                
  89.                 w5300_a0inv <= wrdata[3];
  90.                 w5300_ports <= wrdata[4] & (~wrdata[2]);
  91.                 w5300_hi    <= wrdata[7:5];
  92.         end
  93.  
  94.  
  95.         // wr #81AB
  96.         always @(posedge wrstb_n, negedge rst_n)
  97.         if( !rst_n )
  98.         begin
  99.                 sl811_ms_n  <= 1'b0;
  100.         end
  101.         else if( wrena && addr==2'b01 )
  102.         begin
  103.                 sl811_ms_n  <= ~wrdata[0];
  104.         end
  105.  
  106.  
  107.  
  108.         // read ports
  109.         always @*
  110.         case(addr)
  111. `ifndef NO_INTERRUPTS
  112.                 2'b11: rddata = { internal_int, ena_zxbus_int, sl811_rst_n, w5300_rst_n, ena_sl811_int, ena_w5300_int, sl811_intrq, ~w5300_int_n };
  113. `else
  114.                 2'b11: rddata = {         1'b0,          1'b0, sl811_rst_n, w5300_rst_n,          1'b0,          1'b0, sl811_intrq, ~w5300_int_n };
  115. `endif
  116.                 2'b10: rddata = { w5300_hi, w5300_ports, w5300_a0inv, rommap_ena, rommap_win[1:0] };
  117.  
  118.                 2'b01: rddata = { 6'bXXXXXX, usb_power, ~sl811_ms_n };
  119.  
  120.                 default: rddata = 8'bXXXX_XXXX;
  121.  
  122.         endcase
  123.  
  124.  
  125.  
  126.  
  127. endmodule
  128.  
  129.