Rev 905 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 905 | Rev 983 | ||
---|---|---|---|
Line 119... | Line 119... | ||
119 | reg romnram; |
119 | reg romnram; |
120 | reg wrdisable; |
120 | reg wrdisable; |
121 | 121 | ||
122 | 122 | ||
123 | 123 | ||
124 | - | ||
125 | reg [15:0] rd_buf; |
- | |
126 | - | ||
127 | reg [15:1] cached_addr; |
- | |
128 | reg cached_addr_valid; |
- | |
129 | - | ||
130 | wire cache_hit; |
- | |
131 | - | ||
132 | - | ||
133 | wire dram_beg; |
124 | wire dram_beg; |
134 | wire opfetch, memrd, memwr; |
125 | wire opfetch, memrd, memwr; |
135 | wire stall14, stall7_35; |
126 | wire stall14, stall7_35; |
136 | 127 | ||
137 | wire stall14_ini; |
128 | wire stall14_ini; |
Line 225... | Line 216... | ||
225 | 216 | ||
226 | 217 | ||
227 | assign zd_ena = (~mreq_n) & (~rd_n) & (~romnram); |
218 | assign zd_ena = (~mreq_n) & (~rd_n) & (~romnram); |
228 | 219 | ||
229 | 220 | ||
- | 221 | wire code_cache_select; |
|
- | 222 | reg [15:1] code_cached_addr; |
|
- | 223 | reg code_cached_addr_valid; |
|
- | 224 | reg [15:0] code_cached_word; |
|
- | 225 | ||
- | 226 | wire data_cache_select; |
|
- | 227 | reg [15:1] data_cached_addr; |
|
- | 228 | reg data_cached_addr_valid; |
|
- | 229 | reg [15:0] data_cached_word; |
|
230 | 230 | ||
- | 231 | wire cache_hit; |
|
231 | assign cache_hit = ( (za[15:1] == cached_addr[15:1]) && cached_addr_valid ); |
232 | wire [15:0] selected_cache; |
232 | 233 | ||
- | 234 | assign code_cache_select = (za[15:1] == code_cached_addr[15:1]); |
|
- | 235 | assign data_cache_select = (za[15:1] == data_cached_addr[15:1]); |
|
233 | 236 | ||
- | 237 | assign cache_hit = (code_cache_select && code_cached_addr_valid) || (data_cache_select && data_cached_addr_valid); |
|
- | 238 | assign selected_cache = (data_cache_select && data_cached_addr_valid) ? data_cached_word : code_cached_word; |
|
234 | 239 | ||
235 | // strobe the beginnings of DRAM cycles |
240 | // strobe the beginnings of DRAM cycles |
236 | 241 | ||
237 | always @(posedge fclk) |
242 | always @(posedge fclk) |
238 | if( zneg ) |
243 | if( zneg ) |
239 | r_mreq_n <= mreq_n | (~rfsh_n); |
244 | r_mreq_n <= mreq_n | (~rfsh_n); |
240 | // |
245 | // |
241 | assign dram_beg = ( (!cache_hit) || memwr ) && zneg && r_mreq_n && (!romnram) && (!mreq_n) && rfsh_n; |
246 | assign dram_beg = ( !cache_hit || memwr ) && zneg && r_mreq_n && (!romnram) && (!mreq_n) && rfsh_n; |
242 | 247 | ||
243 | // access type |
248 | // access type |
244 | assign opfetch = (~mreq_n) && (~m1_n); |
249 | assign opfetch = (~mreq_n) && (~m1_n); |
245 | assign memrd = (~mreq_n) && (~rd_n); |
250 | assign memrd = (~mreq_n) && (~rd_n); |
246 | assign memwr = (~mreq_n) && rd_n && rfsh_n && (!wrdisable); |
251 | assign memwr = (~mreq_n) && rd_n && rfsh_n && (!wrdisable); |
Line 324... | Line 329... | ||
324 | assign cpu_wrbsel = za[0]; |
329 | assign cpu_wrbsel = za[0]; |
325 | assign cpu_addr[20:0] = { page[7:0], za[13:1] }; |
330 | assign cpu_addr[20:0] = { page[7:0], za[13:1] }; |
326 | assign cpu_wrdata = zd_in; |
331 | assign cpu_wrdata = zd_in; |
327 | // |
332 | // |
328 | always @* if( cpu_strobe ) // WARNING! ACHTUNG! LATCH!!! |
333 | always @* if( cpu_strobe ) // WARNING! ACHTUNG! LATCH!!! |
- | 334 | if (m1_n) |
|
- | 335 | data_cached_word <= cpu_rddata; |
|
- | 336 | else |
|
329 | rd_buf <= cpu_rddata; |
337 | code_cached_word <= cpu_rddata; |
- | 338 | ||
330 | // |
339 | // |
331 | assign zd_out = cpu_wrbsel ? rd_buf[7:0] : rd_buf[15:8]; |
340 | assign zd_out = cpu_wrbsel ? selected_cache[7:0] : selected_cache[15:8]; |
332 | 341 | ||
333 | 342 | ||
334 | 343 | ||
335 | 344 | ||
336 | 345 | ||
Line 343... | Line 352... | ||
343 | if( zpos ) |
352 | if( zpos ) |
344 | io_r <= io; |
353 | io_r <= io; |
345 | // |
354 | // |
346 | always @(posedge fclk, negedge rst_n) |
355 | always @(posedge fclk, negedge rst_n) |
347 | if( !rst_n ) |
356 | if( !rst_n ) |
- | 357 | begin |
|
348 | cached_addr_valid <= 1'b0; |
358 | code_cached_addr_valid <= 1'b0; |
- | 359 | data_cached_addr_valid <= 1'b0; |
|
- | 360 | end |
|
349 | else |
361 | else |
350 | begin |
362 | begin |
351 | if( (zneg && r_mreq_n && (!mreq_n) && rfsh_n && romnram) || |
363 | if( (zneg && r_mreq_n && (!mreq_n) && rfsh_n && romnram) || |
352 | (zneg && r_mreq_n && memwr ) || |
364 | (zneg && r_mreq_n && memwr ) || |
353 | (io && (!io_r) && zpos ) || |
365 | (io && (!io_r) && zpos ) || |
354 | (nmi_buf_clr ) ) |
366 | (nmi_buf_clr ) ) |
- | 367 | begin |
|
- | 368 | if (memwr) |
|
- | 369 | begin |
|
- | 370 | if (code_cache_select) |
|
- | 371 | code_cached_addr_valid <= 1'b0; |
|
- | 372 | if (data_cache_select) |
|
- | 373 | data_cached_addr_valid <= 1'b0; |
|
- | 374 | end |
|
- | 375 | else |
|
- | 376 | begin |
|
- | 377 | data_cached_addr_valid <= 1'b0; |
|
355 | cached_addr_valid <= 1'b0; |
378 | code_cached_addr_valid <= 1'b0; |
- | 379 | end |
|
- | 380 | end |
|
356 | else if( cpu_strobe ) |
381 | else if( cpu_strobe ) |
- | 382 | begin |
|
- | 383 | if (m1_n) |
|
357 | cached_addr_valid <= 1'b1; |
384 | data_cached_addr_valid <= 1'b1; |
- | 385 | else |
|
- | 386 | code_cached_addr_valid <= 1'b1; |
|
- | 387 | end |
|
358 | end |
388 | end |
359 | // |
389 | // |
360 | always @(posedge fclk) |
390 | always @(posedge fclk) |
361 | if( !rst_n ) |
391 | if( !rst_n ) |
362 | begin |
392 | begin |
- | 393 | //code_cached_addr <= 15'd0; |
|
363 | cached_addr <= 15'd0; |
394 | //data_cached_addr <= 15'd0; |
364 | end |
395 | end |
365 | else if( cpu_strobe ) |
396 | else if( cpu_strobe ) |
366 | begin |
397 | begin |
- | 398 | if (m1_n) |
|
367 | cached_addr[15:1] <= za[15:1]; |
399 | data_cached_addr[15:1] <= za[15:1]; |
- | 400 | else |
|
- | 401 | code_cached_addr[15:1] <= za[15:1]; |
|
368 | end |
402 | end |
369 | 403 | ||
370 | 404 | ||
371 | 405 | ||
372 | 406 |