Rev 84 | 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 |
||
72 | lvd | 21 | output reg ena_w5300_int, |
22 | output reg ena_sl811_int, |
||
23 | output reg ena_zxbus_int, |
||
13 | lvd | 24 | input wire w5300_int_n, |
25 | input wire sl811_intrq, |
||
72 | lvd | 26 | input wire internal_int, |
13 | lvd | 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 |
||
72 | lvd | 49 | ena_w5300_int <= 1'b0; |
50 | ena_sl811_int <= 1'b0; |
||
51 | ena_zxbus_int <= 1'b0; |
||
52 | w5300_rst_n <= 1'b0; |
||
53 | sl811_rst_n <= 1'b0; |
||
13 | lvd | 54 | end |
55 | else if( wrena && addr==2'b11 ) |
||
56 | begin |
||
72 | lvd | 57 | ena_w5300_int <= wrdata[2]; |
58 | ena_sl811_int <= wrdata[3]; |
||
59 | ena_zxbus_int <= wrdata[6]; |
||
23 | lvd | 60 | w5300_rst_n <= wrdata[4]; |
61 | sl811_rst_n <= wrdata[5]; |
||
13 | lvd | 62 | end |
63 | |||
64 | |||
65 | // wr #82AB |
||
66 | always @(posedge wrstb_n, negedge rst_n) |
||
67 | if( !rst_n ) |
||
68 | begin |
||
69 | rommap_win <= 2'b00; |
||
70 | rommap_ena <= 1'b0; |
||
71 | |||
72 | w5300_a0inv <= 1'b0; |
||
32 | lvd | 73 | w5300_ports <= 1'b0; |
74 | w5300_hi <= 3'd0; |
||
13 | lvd | 75 | end |
76 | else if( wrena && addr==2'b10 ) |
||
77 | begin |
||
78 | rommap_win <= wrdata[1:0]; |
||
32 | lvd | 79 | rommap_ena <= wrdata[2] & (~wrdata[4]); |
13 | lvd | 80 | |
81 | w5300_a0inv <= wrdata[3]; |
||
32 | lvd | 82 | w5300_ports <= wrdata[4] & (~wrdata[2]); |
83 | w5300_hi <= wrdata[7:5]; |
||
13 | lvd | 84 | end |
85 | |||
86 | |||
87 | // wr #81AB |
||
48 | lvd | 88 | always @(posedge wrstb_n, negedge rst_n) |
89 | if( !rst_n ) |
||
13 | lvd | 90 | begin |
25 | lvd | 91 | sl811_ms_n <= 1'b0; |
13 | lvd | 92 | end |
93 | else if( wrena && addr==2'b01 ) |
||
94 | begin |
||
25 | lvd | 95 | sl811_ms_n <= ~wrdata[0]; |
13 | lvd | 96 | end |
97 | |||
98 | |||
99 | |||
100 | // read ports |
||
101 | always @* |
||
102 | case(addr) |
||
84 | lvd | 103 | //`ifndef NO_INTERRUPTS |
72 | lvd | 104 | 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 }; |
84 | lvd | 105 | /*`else |
72 | lvd | 106 | 2'b11: rddata = { 1'b0, 1'b0, sl811_rst_n, w5300_rst_n, 1'b0, 1'b0, sl811_intrq, ~w5300_int_n }; |
84 | lvd | 107 | `endif*/ |
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 |