Rev 60 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
13 | lvd | 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 | lvd | 32 | output reg w5300_ports, |
33 | output reg [2:0] w5300_hi, |
||
23 | lvd | 34 | |
13 | lvd | 35 | // |
25 | lvd | 36 | output reg sl811_ms_n, |
37 | output reg sl811_rst_n, |
||
23 | lvd | 38 | // |
39 | input wire usb_power |
||
13 | lvd | 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; |
||
23 | lvd | 52 | |
53 | w5300_rst_n <= 1'b0; |
||
54 | sl811_rst_n <= 1'b0; |
||
13 | lvd | 55 | end |
56 | else if( wrena && addr==2'b11 ) |
||
57 | begin |
||
58 | ena_w5300_int <= wrdata[2]; |
||
59 | ena_sl811_int <= wrdata[3]; |
||
23 | lvd | 60 | ena_zxbus_int <= wrdata[6]; |
61 | |||
62 | w5300_rst_n <= wrdata[4]; |
||
63 | sl811_rst_n <= wrdata[5]; |
||
13 | lvd | 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; |
||
32 | lvd | 75 | w5300_ports <= 1'b0; |
76 | w5300_hi <= 3'd0; |
||
13 | lvd | 77 | end |
78 | else if( wrena && addr==2'b10 ) |
||
79 | begin |
||
80 | rommap_win <= wrdata[1:0]; |
||
32 | lvd | 81 | rommap_ena <= wrdata[2] & (~wrdata[4]); |
13 | lvd | 82 | |
83 | w5300_a0inv <= wrdata[3]; |
||
32 | lvd | 84 | w5300_ports <= wrdata[4] & (~wrdata[2]); |
85 | w5300_hi <= wrdata[7:5]; |
||
13 | lvd | 86 | end |
87 | |||
88 | |||
89 | // wr #81AB |
||
48 | lvd | 90 | always @(posedge wrstb_n, negedge rst_n) |
91 | if( !rst_n ) |
||
13 | lvd | 92 | begin |
25 | lvd | 93 | sl811_ms_n <= 1'b0; |
13 | lvd | 94 | end |
95 | else if( wrena && addr==2'b01 ) |
||
96 | begin |
||
25 | lvd | 97 | sl811_ms_n <= ~wrdata[0]; |
13 | lvd | 98 | end |
99 | |||
100 | |||
101 | |||
102 | // read ports |
||
103 | always @* |
||
104 | case(addr) |
||
105 | |||
23 | lvd | 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 }; |
13 | lvd | 107 | |
32 | lvd | 108 | 2'b10: rddata = { w5300_hi, w5300_ports, w5300_a0inv, rommap_ena, rommap_win[1:0] }; |
13 | lvd | 109 | |
25 | lvd | 110 | 2'b01: rddata = { 6'bXXXXXX, usb_power, ~sl811_ms_n }; |
13 | lvd | 111 | |
112 | default: rddata = 8'bXXXX_XXXX; |
||
113 | |||
114 | endcase |
||
115 | |||
116 | |||
117 | |||
118 | |||
119 | endmodule |
||
120 |