Subversion Repositories zxusbnet

Rev

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