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_cs_rf.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 Chip Select Register File       ////
4
////                                                             ////
5
////                                                             ////
6
////  Author: Rudolf Usselmann                                   ////
7
////          rudi@asics.ws                                      ////
8
////                                                             ////
9
////                                                             ////
10
////  Downloaded from: http://www.opencores.org/cores/mem_ctrl/  ////
11
////                                                             ////
12
/////////////////////////////////////////////////////////////////////
13
////                                                             ////
14
//// Copyright (C) 2000-2002 Rudolf Usselmann                    ////
15
////                         www.asics.ws                        ////
16
////                         rudi@asics.ws                       ////
17
////                                                             ////
18
//// This source file may be used and distributed without        ////
19
//// restriction provided that this copyright statement is not   ////
20
//// removed from the file and that any derivative work contains ////
21
//// the original copyright notice and the associated disclaimer.////
22
////                                                             ////
23
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
24
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
25
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
26
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
27
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
28
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
29
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
30
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
31
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
32
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
33
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
34
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
35
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
36
////                                                             ////
37
/////////////////////////////////////////////////////////////////////
38
 
39
//  CVS Log
40
//
41
//  $Id: mc_cs_rf.v,v 1.6 2002-01-21 13:08:52 rudi Exp $
42
//
43
//  $Date: 2002-01-21 13:08:52 $
44
//  $Revision: 1.6 $
45
//  $Author: rudi $
46
//  $Locker:  $
47
//  $State: Exp $
48
//
49
// Change History:
50
//               $Log: not supported by cvs2svn $
51
//               Revision 1.5  2001/12/11 02:47:19  rudi
52
//
53
//               - Made some changes not to expect clock during reset ...
54
//
55
//               Revision 1.4  2001/11/29 02:16:28  rudi
56
//
57
//
58
//               - More Synthesis cleanup, mostly for speed
59
//               - Several bug fixes
60
//               - Changed code to avoid auto-precharge and
61
//                 burst-terminate combinations (apparently illegal ?)
62
//                 Now we will do a manual precharge ...
63
//
64
//               Revision 1.3  2001/09/24 00:38:21  rudi
65
//
66
//               Changed Reset to be active high and async.
67
//
68
//               Revision 1.2  2001/08/10 08:16:21  rudi
69
//
70
//               - Changed IO names to be more clear.
71
//               - Uniquifyed define names to be core specific.
72
//               - Removed "Refresh Early" configuration
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/12 15:19:49  rudi
81
//
82
//
83
//               Minor changes after running lint, and a small bug fix reading csr and ba_mask registers.
84
//
85
//               Revision 1.2  2001/06/03 11:37:17  rudi
86
//
87
//
88
//               1) Fixed Chip Select Mask Register
89
//                      - Power On Value is now all ones
90
//                      - Comparison Logic is now correct
91
//
92
//               2) All resets are now asynchronous
93
//
94
//               3) Converted Power On Delay to an configurable item
95
//
96
//               4) Added reset to Chip Select Output Registers
97
//
98
//               5) Forcing all outputs to Hi-Z state during reset
99
//
100
//               Revision 1.1.1.1  2001/05/13 09:39:42  rudi
101
//               Created Directory Structure
102
//
103
//
104
//
105
//
106
 
107
`include "mc_defines.v"
108
 
109
module mc_cs_rf(clk, rst, wb_we_i, din, rf_we, addr, csc, tms, poc, csc_mask, cs,
110
                wp_err, lmr_req, lmr_ack, init_req, init_ack );
111
 
112
input           clk, rst;
113
input           wb_we_i;
114
input   [31:0]   din;
115
input           rf_we;
116
input   [31:0]   addr;
117
 
118
output  [31:0]   csc;
119
output  [31:0]   tms;
120
input   [31:0]   poc;
121
input   [31:0]   csc_mask;
122
output          cs;
123
output          wp_err;
124
 
125
output          lmr_req;
126
input           lmr_ack;
127
output          init_req;
128
input           init_ack;
129
 
130
parameter       [2:0]    this_cs = 0;
131
parameter       [3:0]    reg_select = this_cs + 2;
132
 
133
////////////////////////////////////////////////////////////////////
134
//
135
// Local Registers and Wires
136
//
137
 
138
reg     [31:0]   csc;
139
reg     [31:0]   tms;
140
wire            sel;
141
wire            cs_d;
142
wire            wp;
143
reg             inited;
144
reg             init_req;
145
reg             init_req_we;
146
reg             lmr_req;
147
reg             lmr_req_we;
148
 
149
////////////////////////////////////////////////////////////////////
150
//
151
// A kludge for cases where there is no clock during reset ...
152
//
153
 
154
reg     rst_r1, rst_r2;
155
 
156
always @(posedge clk or posedge rst)
157
        if(rst)         rst_r1 <= #1 1'b1;
158
        else            rst_r1 <= #1 1'b0;
159
 
160
always @(posedge clk or posedge rst)
161
        if(rst)         rst_r2 <= #1 1'b1;
162
        else            rst_r2 <= #1 rst_r1;
163
 
164
////////////////////////////////////////////////////////////////////
165
//
166
// Write Logic
167
//
168
 
169
reg     [6:0]    addr_r;
170
 
171
always @(posedge clk)
172
        addr_r <= #1 addr[6:0];
173
 
174
assign sel = addr_r[6:3] == reg_select[3:0];
175
 
176
always @(posedge clk)
177
        if(rst_r2)                      csc <= #1 (this_cs[2:0] == `MC_DEF_SEL) ?
178
                                        {26'h0, poc[1:0], 1'b0, poc[3:2], (poc[3:2] != 2'b00)} : 32'h0;
179
        else
180
        if(rf_we & sel & !addr_r[2])    csc <= #1 din;
181
 
182
always @(posedge clk)
183
        if(rst_r2)                      tms <= #1 (this_cs[2:0] == `MC_DEF_SEL) ?
184
                                                `MC_DEF_POR_TMS : 32'h0;
185
        else
186
        if(rf_we & sel & addr_r[2])     tms <= #1 din;
187
 
188
////////////////////////////////////////////////////////////////////
189
//
190
// Load Mode Register Request/Ack Logic
191
//
192
always @(posedge clk or posedge rst)
193
        if(rst)         lmr_req_we <= #1 1'b0;
194
        else            lmr_req_we <= #1 rf_we & sel & addr_r[2];
195
 
196
always @(posedge clk or posedge rst)
197
        if(rst)         lmr_req <= #1 1'b0;
198
        else
199
        if(lmr_req_we & (csc[3:1] == `MC_MEM_TYPE_SDRAM))
200
                        lmr_req <= #1 inited;
201
        else
202
        if(lmr_ack)     lmr_req <= #1 1'b0;
203
 
204
////////////////////////////////////////////////////////////////////
205
//
206
// Initialize SDRAM Request/Ack & tracking logic
207
//
208
always @(posedge clk or posedge rst)
209
        if(rst) init_req_we <= #1 1'b0;
210
        else    init_req_we <= #1 rf_we & sel & !addr_r[2];
211
 
212
always @(posedge clk or posedge rst)
213
        if(rst)         init_req <= #1 1'b0;
214
        else
215
        if(init_req_we & (csc[3:1] == `MC_MEM_TYPE_SDRAM) & csc[0] & !inited)
216
                        init_req <= #1 1'b1;
217
        else
218
        if(init_ack)    init_req <= #1 1'b0;
219
 
220
always @(posedge clk or posedge rst)
221
        if(rst)         inited <= #1 1'b0;
222
        else
223
        if(init_ack)    inited <= #1 1'b1;
224
 
225
////////////////////////////////////////////////////////////////////
226
//
227
// Chip Select Generation Logic
228
//
229
 
230
assign cs_d = ((csc[23:16] & csc_mask[7:0]) == (addr[28:21] & csc_mask[7:0])) & csc[0];
231
 
232
assign wp = wb_we_i & csc[8];
233
 
234
assign wp_err = cs_d &  wp;
235
assign cs     = cs_d & !wp;
236
 
237
endmodule
238
 
239
 
240
 
241
// This dummy is used to terminate the outputs for non existing Chip Selects
242
module mc_cs_rf_dummy(clk, rst, wb_we_i, din, rf_we, addr, csc, tms, poc, csc_mask, cs,
243
                wp_err, lmr_req, lmr_ack, init_req, init_ack );
244
 
245
parameter       [2:0]    this_cs = 0;
246
 
247
input           clk, rst;
248
input           wb_we_i;
249
input   [31:0]   din;
250
input           rf_we;
251
input   [31:0]   addr;
252
 
253
output  [31:0]   csc;
254
output  [31:0]   tms;
255
input   [31:0]   poc;
256
input   [31:0]   csc_mask;
257
output          cs;
258
output          wp_err;
259
 
260
output          lmr_req;
261
input           lmr_ack;
262
output          init_req;
263
input           init_ack;
264
 
265
assign csc = 32'h0;
266
assign tms = 32'h0;
267
assign cs = 1'b0;
268
assign wp_err = 1'b0;
269
assign lmr_req = 1'b0;
270
assign init_req = 1'b0;
271
 
272
endmodule

powered by: WebSVN 2.1.0

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