OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [soc/] [rtl/] [mem_if/] [rtl/] [verilog/] [mc_mem_if.v] - Blame information for rev 12

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 xianfeng
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  WISHBONE Memory Controller                                 ////
4
////  Memory Bus Interface                                       ////
5
////                                                             ////
6
////                                                             ////
7
////  Author: Rudolf Usselmann                                   ////
8
////          rudi@asics.ws                                      ////
9
////                                                             ////
10
////                                                             ////
11
////  Downloaded from: http://www.opencores.org/cores/mem_ctrl/  ////
12
////                                                             ////
13
/////////////////////////////////////////////////////////////////////
14
////                                                             ////
15
//// Copyright (C) 2000-2002 Rudolf Usselmann                    ////
16
////                         www.asics.ws                        ////
17
////                         rudi@asics.ws                       ////
18
////                                                             ////
19
//// This source file may be used and distributed without        ////
20
//// restriction provided that this copyright statement is not   ////
21
//// removed from the file and that any derivative work contains ////
22
//// the original copyright notice and the associated disclaimer.////
23
////                                                             ////
24
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
25
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
26
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
27
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
28
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
29
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
30
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
31
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
32
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
33
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
34
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
35
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
36
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
37
////                                                             ////
38
/////////////////////////////////////////////////////////////////////
39
 
40
//  CVS Log
41
//
42
//  $Id: mc_mem_if.v,v 1.6 2002-01-21 13:08:52 rudi Exp $
43
//
44
//  $Date: 2002-01-21 13:08:52 $
45
//  $Revision: 1.6 $
46
//  $Author: rudi $
47
//  $Locker:  $
48
//  $State: Exp $
49
//
50
// Change History:
51
//               $Log: not supported by cvs2svn $
52
//               Revision 1.5  2001/12/21 05:09:29  rudi
53
//
54
//               - Fixed combinatorial loops in synthesis
55
//               - Fixed byte select bug
56
//
57
//               Revision 1.4  2001/11/29 02:16:28  rudi
58
//
59
//
60
//               - More Synthesis cleanup, mostly for speed
61
//               - Several bug fixes
62
//               - Changed code to avoid auto-precharge and
63
//                 burst-terminate combinations (apparently illegal ?)
64
//                 Now we will do a manual precharge ...
65
//
66
//               Revision 1.3  2001/09/24 00:38:21  rudi
67
//
68
//               Changed Reset to be active high and async.
69
//
70
//               Revision 1.2  2001/09/02 02:28:28  rudi
71
//
72
//               Many fixes for minor bugs that showed up in gate level simulations.
73
//
74
//               Revision 1.1  2001/07/29 07:34:41  rudi
75
//
76
//
77
//               1) Changed Directory Structure
78
//               2) Fixed several minor bugs
79
//
80
//               Revision 1.3  2001/06/14 01:57:37  rudi
81
//
82
//
83
//               Fixed a potential bug in a corner case situation where the TMS register
84
//               does not propegate properly during initialisation.
85
//
86
//               Revision 1.2  2001/06/03 11:37:17  rudi
87
//
88
//
89
//               1) Fixed Chip Select Mask Register
90
//                      - Power On Value is now all ones
91
//                      - Comparison Logic is now correct
92
//
93
//               2) All resets are now asynchronous
94
//
95
//               3) Converted Power On Delay to an configurable item
96
//
97
//               4) Added reset to Chip Select Output Registers
98
//
99
//               5) Forcing all outputs to Hi-Z state during reset
100
//
101
//               Revision 1.1.1.1  2001/05/13 09:39:48  rudi
102
//               Created Directory Structure
103
//
104
//
105
//
106
//
107
 
108
`include "mc_defines.v"
109
 
110
module mc_mem_if(clk, rst, mc_clk, mc_br, mc_bg,
111
                mc_addr, mc_data_o, mc_dp_o, mc_data_oe,
112
                mc_dqm, mc_oe_, mc_we_, mc_cas_, mc_ras_, mc_cke_, mc_cs_,
113
                mc_adsc_, mc_adv_, mc_ack, mc_rp, mc_c_oe, mc_c_oe_d,
114
                mc_br_r, mc_bg_d, mc_data_od, mc_dp_od, mc_addr_d, mc_ack_r,
115
                we_, ras_, cas_, cke_, mc_adsc_d, mc_adv_d, cs_en, rfr_ack,
116
                cs_need_rfr, lmr_sel, spec_req_cs, cs, fs, data_oe, susp_sel,
117
                suspended_o, oe_, wb_cyc_i, wb_stb_i, wb_sel_i, wb_cycle,
118
                wr_cycle, mc_data_ir, mc_data_i, mc_dp_i, mc_sts_ir, mc_sts_i,
119
                mc_zz_o
120
                );
121
// Memory Interface
122
input           clk;
123
input           rst;
124
input           mc_clk;
125
input           mc_br;
126
output          mc_bg;
127
output  [23:0]   mc_addr;
128
output  [31:0]   mc_data_o;
129
output  [3:0]    mc_dp_o;
130
output          mc_data_oe;
131
output  [3:0]    mc_dqm;
132
output          mc_oe_;
133
output          mc_we_;
134
output          mc_cas_;
135
output          mc_ras_;
136
output          mc_cke_;
137
output  [7:0]    mc_cs_;
138
output          mc_adsc_;
139
output          mc_adv_;
140
input           mc_ack;
141
output          mc_rp;
142
output          mc_c_oe;
143
output  [35:0]   mc_data_ir;
144
output          mc_sts_ir;
145
output          mc_zz_o;
146
 
147
// Internal Interface
148
output          mc_br_r;
149
input           mc_bg_d;
150
input           data_oe;
151
input           susp_sel;
152
input           suspended_o;
153
input   [31:0]   mc_data_od;
154
input   [3:0]    mc_dp_od;
155
input   [23:0]   mc_addr_d;
156
output          mc_ack_r;
157
input           wb_cyc_i;
158
input           wb_stb_i;
159
input   [3:0]    wb_sel_i;
160
input           wb_cycle;
161
input           wr_cycle;
162
input           oe_ ;
163
input           we_;
164
input           ras_;
165
input           cas_;
166
input           cke_;
167
input           cs_en;
168
input           rfr_ack;
169
input   [7:0]    cs_need_rfr;
170
input           lmr_sel;
171
input   [7:0]    spec_req_cs;
172
input   [7:0]    cs;
173
input           fs;
174
input           mc_adsc_d;
175
input           mc_adv_d;
176
input           mc_c_oe_d;
177
input   [31:0]   mc_data_i;
178
input   [3:0]    mc_dp_i;
179
input           mc_sts_i;
180
 
181
////////////////////////////////////////////////////////////////////
182
//
183
// Local Wires
184
//
185
 
186
reg             mc_data_oe;
187
reg     [31:0]   mc_data_o;
188
reg     [3:0]    mc_dp_o;
189
reg     [3:0]    mc_dqm;
190
reg     [3:0]    mc_dqm_r;
191
reg     [23:0]   mc_addr;
192
reg             mc_oe_;
193
reg             mc_we_;
194
reg             mc_cas_;
195
reg             mc_ras_;
196
wire            mc_cke_;
197
reg     [7:0]    mc_cs_;
198
reg             mc_bg;
199
reg             mc_adsc_;
200
reg             mc_adv_;
201
reg             mc_br_r;
202
reg             mc_ack_r;
203
reg             mc_rp;
204
reg             mc_c_oe;
205
reg             mc_zz_o;
206
 
207
reg     [35:0]   mc_data_ir;
208
reg             mc_sts_ir;
209
 
210
////////////////////////////////////////////////////////////////////
211
//
212
// Misc Logic
213
//
214
 
215
always @(posedge mc_clk)
216
        mc_zz_o <= #1 suspended_o;
217
 
218
always @(posedge mc_clk)
219
        mc_sts_ir <= #1 mc_sts_i;
220
 
221
always @(posedge mc_clk)
222
        mc_data_ir <= #1 {mc_dp_i, mc_data_i};
223
 
224
always @(posedge mc_clk)
225
        mc_c_oe <= #1 mc_c_oe_d;
226
 
227
always @(posedge mc_clk)
228
        mc_rp <= #1 !suspended_o & !fs;
229
 
230
always @(posedge mc_clk)
231
        mc_br_r <= #1 mc_br;
232
 
233
always @(posedge mc_clk)
234
        mc_ack_r <= #1 mc_ack;
235
 
236
always @(posedge mc_clk)
237
        mc_bg <= #1 mc_bg_d;
238
 
239
always @(posedge mc_clk or posedge rst)
240
        if(rst)         mc_data_oe <= #1 1'b0;
241
        else            mc_data_oe <= #1 data_oe & !susp_sel & mc_c_oe_d;
242
 
243
always @(posedge mc_clk)
244
        mc_data_o <= #1 mc_data_od;
245
 
246
always @(posedge mc_clk)
247
        mc_dp_o <= #1 mc_dp_od;
248
 
249
always @(posedge mc_clk)
250
        mc_addr <= #1 mc_addr_d;
251
 
252
always @(posedge clk)
253
        if(wb_cyc_i & wb_stb_i)
254
                mc_dqm_r <= #1 wb_sel_i;
255
 
256
reg     [3:0]    mc_dqm_r2;
257
always @(posedge clk)
258
                mc_dqm_r2 <= #1 mc_dqm_r;
259
 
260
always @(posedge mc_clk)
261
        mc_dqm <= #1    susp_sel ? 4'hf :
262
                        data_oe ? ~mc_dqm_r2 :
263
                        (wb_cycle & !wr_cycle) ? 4'h0 : 4'hf;
264
 
265
always @(posedge mc_clk or posedge rst)
266
        if(rst)         mc_oe_ <= #1 1'b1;
267
        else            mc_oe_ <= #1 oe_ | susp_sel;
268
 
269
always @(posedge mc_clk)
270
        mc_we_ <= #1 we_;
271
 
272
always @(posedge mc_clk)
273
        mc_cas_ <= #1 cas_;
274
 
275
always @(posedge mc_clk)
276
        mc_ras_ <= #1 ras_;
277
 
278
assign  mc_cke_ = cke_;
279
 
280
always @(posedge mc_clk or posedge rst)
281
        if(rst)         mc_cs_[0] <= #1 1'b1;
282
        else
283
        mc_cs_[0] <= #1 ~(cs_en & (
284
                                (rfr_ack | susp_sel) ? cs_need_rfr[0] :
285
                                lmr_sel ? spec_req_cs[0] :
286
                                cs[0]
287
                        ));
288
 
289
always @(posedge mc_clk or posedge rst)
290
        if(rst)         mc_cs_[1] <= #1 1'b1;
291
        else
292
           mc_cs_[1] <= #1 ~(cs_en & (
293
                                (rfr_ack | susp_sel) ? cs_need_rfr[1] :
294
                                lmr_sel ? spec_req_cs[1] :
295
                                cs[1]
296
                        ));
297
 
298
always @(posedge mc_clk or posedge rst)
299
        if(rst)         mc_cs_[2] <= #1 1'b1;
300
        else
301
           mc_cs_[2] <= #1 ~(cs_en & (
302
                                (rfr_ack | susp_sel) ? cs_need_rfr[2] :
303
                                lmr_sel ? spec_req_cs[2] :
304
                                cs[2]
305
                        ));
306
 
307
always @(posedge mc_clk or posedge rst)
308
        if(rst)         mc_cs_[3] <= #1 1'b1;
309
        else
310
           mc_cs_[3] <= #1 ~(cs_en & (
311
                                (rfr_ack | susp_sel) ? cs_need_rfr[3] :
312
                                lmr_sel ? spec_req_cs[3] :
313
                                cs[3]
314
                        ));
315
 
316
always @(posedge mc_clk or posedge rst)
317
        if(rst)         mc_cs_[4] <= #1 1'b1;
318
        else
319
           mc_cs_[4] <= #1 ~(cs_en & (
320
                                (rfr_ack | susp_sel) ? cs_need_rfr[4] :
321
                                lmr_sel ? spec_req_cs[4] :
322
                                cs[4]
323
                        ));
324
 
325
always @(posedge mc_clk or posedge rst)
326
        if(rst)         mc_cs_[5] <= #1 1'b1;
327
        else
328
           mc_cs_[5] <= #1 ~(cs_en & (
329
                                (rfr_ack | susp_sel) ? cs_need_rfr[5] :
330
                                lmr_sel ? spec_req_cs[5] :
331
                                cs[5]
332
                        ));
333
 
334
always @(posedge mc_clk or posedge rst)
335
        if(rst)         mc_cs_[6] <= #1 1'b1;
336
        else
337
           mc_cs_[6] <= #1 ~(cs_en & (
338
                                (rfr_ack | susp_sel) ? cs_need_rfr[6] :
339
                                lmr_sel ? spec_req_cs[6] :
340
                                cs[6]
341
                        ));
342
 
343
always @(posedge mc_clk or posedge rst)
344
        if(rst)         mc_cs_[7] <= #1 1'b1;
345
        else
346
           mc_cs_[7] <= #1 ~(cs_en & (
347
                                (rfr_ack | susp_sel) ? cs_need_rfr[7] :
348
                                lmr_sel ? spec_req_cs[7] :
349
                                cs[7]
350
                        ));
351
 
352
always @(posedge mc_clk)
353
        mc_adsc_ <= #1 ~mc_adsc_d;
354
 
355
always @(posedge mc_clk)
356
        mc_adv_  <= #1 ~mc_adv_d;
357
 
358
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.