Subversion Repositories zxusbnet

Rev

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

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