Subversion Repositories zxusbnet

Rev

Rev 134 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
9 lvd 1
// ZXiznet project
116 lvd 2
// (c) NedoPC 2012-2018
9 lvd 3
//
13 lvd 4
// zx-bus functions: ports mapping/access, ROM mapping
9 lvd 5
 
6
module zbus
7
(
70 dimkam 8
        input  wire        fclk,
84 lvd 9
 
13 lvd 10
        input  wire [15:0] za,
11
        inout  wire [ 7:0] zd,
12
        //
25 lvd 13
        inout  wire [ 7:0] bd,
14
        //
13 lvd 15
        input  wire        ziorq_n,
16
        input  wire        zrd_n,
17
        input  wire        zwr_n,
18
        input  wire        zmreq_n,
19
        output wire        ziorqge,
20
        output wire        zblkrom,
21
        input  wire        zcsrom_n,
22
        input  wire        zrst_n,
23
 
24
        //
25
        output wire        ports_wrena,
26
        output wire        ports_wrstb_n,
27
        output wire [ 1:0] ports_addr,
28
        output wire [ 7:0] ports_wrdata,
29
        input  wire [ 7:0] ports_rddata,
30
 
31
        //
32
        input  wire [ 1:0] rommap_win,
33
        input  wire        rommap_ena,
34
 
35
        //
70 dimkam 36
        output reg         sl811_cs_n,
84 lvd 37
        output reg         sl811_a0,
13 lvd 38
 
39
        //
70 dimkam 40
        output reg         w5300_cs_n,
84 lvd 41
        input  wire        w5300_ports,
42
        input  wire [ 9:0] async_w5300_addr,
43
        output reg  [ 9:0] w5300_addr,
44
 
45
 
46
 
47
        // buffered rd/wr strobes to usb/ether chips
48
        output reg         bwr_n,
49
        output reg         brd_n
9 lvd 50
);
13 lvd 51
        parameter BASE_ADDR = 8'hAB;
9 lvd 52
 
53
 
13 lvd 54
 
84 lvd 55
 
56
        reg [1:0] rst_n_resync;
57
        wire rst_n = rst_n_resync[1];
58
 
59
 
13 lvd 60
        wire io_addr_ok;
61
 
62
        wire mrd, mwr;
63
 
25 lvd 64
        wire ena_dbuf;
65
        wire ena_din;
66
        wire ena_dout;
13 lvd 67
 
68
 
72 lvd 69
 
84 lvd 70
        // buffering chipselects
71
        reg async_w5300_cs_n;
72
        reg async_sl811_cs_n;
73
        //
74
        reg [1:0] r_w5300_cs_n;
75
        reg [1:0] r_sl811_cs_n;
72 lvd 76
 
84 lvd 77
        // buffering sl811 a0
78
        reg async_sl811_a0;
79
        //
80
        reg [1:0] r_sl811_a0;
72 lvd 81
 
84 lvd 82
        // buffering w5300 address
83
        reg [9:0] r_w5300_addr [0:1];
72 lvd 84
 
85
 
84 lvd 86
        // for filtering strobes
87
        reg [2:0] wr_regs;
88
        reg [2:0] rd_regs;
89
        reg       wr_state,
90
                  rd_state;
91
        wire      wr_start,
92
                  rd_start;
72 lvd 93
 
84 lvd 94
        //
95
        reg [2:0] ctr_5;
96
 
97
 
98
 
99
 
100
        // common read and write latches latch
101
        reg [7:0] read_latch;
102
        reg [7:0] write_latch;
103
 
104
 
105
 
106
 
107
        // reset resync
108
        always @(posedge fclk, negedge zrst_n)
109
        if( !zrst_n )
110
                rst_n_resync[1:0] <= 2'b00;
111
        else
112
                rst_n_resync[1:0] <= { rst_n_resync[0], 1'b1 };
113
 
114
 
115
 
116
 
117
        // make filtered out vesions of read/write strobes
118
        always @(posedge fclk)
119
        begin
120
                wr_regs[2:0] <= { wr_regs[1:0], ~zwr_n };
121
                rd_regs[2:0] <= { rd_regs[1:0], ~zrd_n };
122
        end
123
        //
124
 
134 lvd 125
        assign wr_start = wr_regs[2:0]==3'b001 && !ctr_5;
126
        assign rd_start = rd_regs[2:0]==3'b001 && !ctr_5;
84 lvd 127
 
134 lvd 128
 
84 lvd 129
        // buffered rd/wrs
130
        always @(posedge fclk)
131
        begin
132
                if( wr_start )
133
                        bwr_n <= 1'b0;
134
                else if( !ctr_5 )
135
                        bwr_n <= 1'b1;
136
                //
137
                if( rd_start )
138
                        brd_n <= 1'b0;
139
                else if( !ctr_5 )
140
                        brd_n <= 1'b1;
141
        end
142
        //
143
        always @(posedge fclk, negedge rst_n)
144
        if( !rst_n )
145
        begin
146
                ctr_5 <= 3'd0;
147
        end
148
        else if( wr_start || rd_start )
149
                ctr_5 <= 3'd4;
134 lvd 150
        else if( ctr_5 )
84 lvd 151
                ctr_5 <= ctr_5 - 3'd1;
152
 
153
 
154
        // buffered chipselects
155
        always @(posedge fclk)
156
        begin
157
                r_w5300_cs_n[1:0] <= { r_w5300_cs_n[0], async_w5300_cs_n };
158
                r_sl811_cs_n[1:0] <= { r_sl811_cs_n[0], async_sl811_cs_n };
159
        end
160
        //
161
        always @(posedge fclk)
162
        if( wr_start || rd_start )
163
        begin
133 lvd 164
                w5300_cs_n <= async_w5300_cs_n;
165
                sl811_cs_n <= async_sl811_cs_n;
84 lvd 166
        end
167
        else if( !ctr_5 )
168
        begin
169
                w5300_cs_n <= 1'b1;
170
                sl811_cs_n <= 1'b1;
171
        end
172
 
173
 
174
        // buffered sl811_a0
175
        always @(posedge fclk)
176
                r_sl811_a0[1:0] <= { r_sl811_a0[0], async_sl811_a0 };
177
        //
178
        always @(posedge fclk)
179
        if( wr_start || rd_start )
133 lvd 180
                sl811_a0 <= async_sl811_a0;
84 lvd 181
 
182
 
183
 
184
        // buffered w5300_addr
185
        always @(posedge fclk)
186
        begin
187
                r_w5300_addr[0] <= async_w5300_addr;
188
                r_w5300_addr[1] <= r_w5300_addr[0];
189
        end
190
        //
191
        always @(posedge fclk)
192
        if( wr_start || rd_start )
133 lvd 193
                w5300_addr <= async_w5300_addr;
84 lvd 194
 
195
 
196
 
197
 
198
 
199
 
13 lvd 200
        // addr decode
201
        assign io_addr_ok = (za[7:0]==BASE_ADDR);
202
 
203
 
204
        // IORQGE
205
        assign ziorqge = io_addr_ok ? 1'b1 : 1'bZ;
206
 
207
 
208
 
209
        // ports write
210
        assign ports_addr = za[9:8];
211
        //
212
        assign ports_wrdata = zd;
213
        //
214
        assign ports_wrena   = io_addr_ok && za[15];
215
        assign ports_wrstb_n = ziorq_n | zwr_n;
216
 
217
 
59 lvd 218
 
72 lvd 219
        always @*
84 lvd 220
                async_sl811_cs_n = !( !w5300_ports && io_addr_ok && ( !za[15] || (za[15] && za[9:8]==2'b00) ) && !ziorq_n );
70 dimkam 221
 
13 lvd 222
        //
84 lvd 223
        always @*
224
                async_sl811_a0 = ~za[15];
13 lvd 225
 
226
 
227
        // w5300 chip select
228
        assign mwr = !zmreq_n && !zwr_n && (za[15:14]==rommap_win) && rommap_ena;
229
        assign mrd = !zmreq_n && !zrd_n && !zcsrom_n && (za[15:14]==rommap_win) && rommap_ena;
230
        //
72 lvd 231
        always @*
84 lvd 232
                async_w5300_cs_n = ~(mwr || mrd || ( w5300_ports && io_addr_ok && !za[15] && !ziorq_n ) );
13 lvd 233
 
234
        // block ROM
235
        assign zblkrom = (rommap_ena && (za[15:14]==rommap_win)) ? 1'b1 : 1'bZ;
236
 
237
 
238
 
84 lvd 239
        assign ena_dbuf = (~async_sl811_cs_n) | (~async_w5300_cs_n);
25 lvd 240
        assign ena_dout = ~zrd_n;
241
 
84 lvd 242
        wire ports_rd = io_addr_ok && !ziorq_n && !zrd_n && za[15] && (za[9:8]!=2'b00);
25 lvd 243
 
84 lvd 244
        wire b_ena_dbuf = (~sl811_cs_n) | (~w5300_cs_n);
245
        wire b_ena_din  = ~bwr_n;
246
 
25 lvd 247
        // ports data read/buffering
84 lvd 248
/*      assign zd = (io_addr_ok && !ziorq_n && !zrd_n && za[15] && (za[9:8]!=2'b00)) ?
25 lvd 249
                    ports_rddata : ( (ena_dbuf && ena_dout) ? bd : 8'bZZZZ_ZZZZ );
13 lvd 250
 
251
 
25 lvd 252
        assign bd = (ena_dbuf && ena_din) ? zd : 8'bZZZZ_ZZZZ;
84 lvd 253
*/
25 lvd 254
 
84 lvd 255
        assign zd = ports_rd ? ports_rddata : ((ena_dbuf && ena_dout) ? read_latch : 8'hZZ);
256
 
257
        assign bd = (b_ena_dbuf && b_ena_din) ? write_latch : 8'hZZ;
258
 
259
 
260
 
261
 
262
        // write latch
263
        always @*
264
        if( !zwr_n )
265
                write_latch <= zd;
266
 
267
        // read latch
268
        always @*
269
        if( !brd_n )
270
                read_latch <= bd;
271
 
272
 
273
 
274
 
9 lvd 275
endmodule
276