Subversion Repositories zxusbnet

Rev

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