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_adr_sel.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 Address Select Block            ////
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_adr_sel.v,v 1.4 2002-01-21 13:08:52 rudi Exp $
42
//
43
//  $Date: 2002-01-21 13:08:52 $
44
//  $Revision: 1.4 $
45
//  $Author: rudi $
46
//  $Locker:  $
47
//  $State: Exp $
48
//
49
// Change History:
50
//               $Log: not supported by cvs2svn $
51
//               Revision 1.3  2001/11/29 02:16:28  rudi
52
//
53
//
54
//               - More Synthesis cleanup, mostly for speed
55
//               - Several bug fixes
56
//               - Changed code to avoid auto-precharge and
57
//                 burst-terminate combinations (apparently illegal ?)
58
//                 Now we will do a manual precharge ...
59
//
60
//               Revision 1.2  2001/08/10 08:16:21  rudi
61
//
62
//               - Changed IO names to be more clear.
63
//               - Uniquifyed define names to be core specific.
64
//               - Removed "Refresh Early" configuration
65
//
66
//               Revision 1.1  2001/07/29 07:34:41  rudi
67
//
68
//
69
//               1) Changed Directory Structure
70
//               2) Fixed several minor bugs
71
//
72
//               Revision 1.2  2001/06/12 15:19:49  rudi
73
//
74
//
75
//               Minor changes after running lint, and a small bug fix reading csr and ba_mask registers.
76
//
77
//               Revision 1.1.1.1  2001/05/13 09:39:40  rudi
78
//               Created Directory Structure
79
//
80
//
81
//
82
//
83
 
84
`include "mc_defines.v"
85
 
86
module mc_adr_sel(clk, csc, tms, wb_ack_o, wb_stb_i, wb_addr_i, wb_we_i,
87
                wb_write_go, wr_hold, cas_,
88
                mc_addr, row_adr, bank_adr, rfr_ack,
89
                cs_le, cmd_a10, row_sel, lmr_sel, next_adr, wr_cycle,
90
                page_size);
91
 
92
input           clk;
93
input   [31:0]   csc;
94
input   [31:0]   tms;
95
input           wb_ack_o, wb_stb_i;
96
input   [31:0]   wb_addr_i;
97
input           wb_we_i;
98
input           wb_write_go;
99
input           wr_hold;
100
input           cas_;
101
output  [23:0]   mc_addr;
102
output  [12:0]   row_adr;
103
output  [1:0]    bank_adr;
104
input           rfr_ack;
105
input           cs_le;
106
input           cmd_a10;
107
input           row_sel;
108
input           lmr_sel;
109
input           next_adr;
110
input           wr_cycle;
111
output  [10:0]   page_size;
112
 
113
////////////////////////////////////////////////////////////////////
114
//
115
// Local Registers & Wires
116
//
117
 
118
reg     [23:0]   mc_addr_d;
119
reg     [23:0]   acs_addr;
120
wire    [23:0]   acs_addr_pl1;
121
reg     [23:0]   sram_addr;
122
wire    [14:0]   sdram_adr;
123
reg     [12:0]   row_adr;
124
reg     [9:0]    col_adr;
125
reg     [1:0]    bank_adr;
126
reg     [10:0]   page_size;
127
 
128
wire    [2:0]    mem_type;
129
wire    [1:0]    bus_width;
130
wire    [1:0]    mem_size;
131
wire            bas;
132
 
133
// Aliases
134
assign mem_type  = csc[3:1];
135
assign bus_width = csc[5:4];
136
assign mem_size  = csc[7:6];
137
assign bas       = csc[9];
138
 
139
////////////////////////////////////////////////////////////////////
140
//
141
// Misc Logic
142
//
143
 
144
always @(mem_type or wr_hold or sdram_adr or acs_addr or sram_addr or wb_addr_i)
145
        if(mem_type == `MC_MEM_TYPE_SDRAM)              mc_addr_d = {9'h0, sdram_adr};
146
        else
147
        if(mem_type == `MC_MEM_TYPE_ACS)                mc_addr_d = acs_addr;
148
        else
149
        if((mem_type == `MC_MEM_TYPE_SRAM) & wr_hold)   mc_addr_d = sram_addr;
150
        else                                            mc_addr_d = wb_addr_i[25:2];
151
 
152
assign mc_addr = rfr_ack ? {mc_addr_d[23:11], 1'b1, mc_addr_d[9:0]} : mc_addr_d;
153
 
154
////////////////////////////////////////////////////////////////////
155
//
156
// Async Devices Address Latch & Counter
157
//
158
 
159
mc_incn_r #(24) u0(     .clk(           clk             ),
160
                        .inc_in(        acs_addr        ),
161
                        .inc_out(       acs_addr_pl1    ) );
162
 
163
always @(posedge clk)
164
        if(wb_stb_i)    sram_addr <= #1 wb_addr_i[25:2];
165
 
166
always @(posedge clk)
167
        if(cs_le | wb_we_i)
168
                case(bus_width)         // synopsys full_case parallel_case
169
                   `MC_BW_8:    acs_addr <= #1 wb_addr_i[23:0];
170
                   `MC_BW_16:   acs_addr <= #1 wb_addr_i[24:1];
171
                   `MC_BW_32:   acs_addr <= #1 wb_addr_i[25:2];
172
                endcase
173
        else
174
        if(next_adr)            acs_addr <= #1 acs_addr_pl1;
175
 
176
////////////////////////////////////////////////////////////////////
177
//
178
// SDRAM Address Mux
179
//
180
 
181
assign sdram_adr[12:0] = (lmr_sel & !cas_) ? tms[12:0] :
182
                                row_sel ? row_adr :
183
                                {2'h0, cmd_a10, col_adr};
184
 
185
assign sdram_adr[14:13] = bank_adr;
186
 
187
always @(posedge clk)
188
   if(wr_cycle ? wb_ack_o : wb_stb_i)
189
        casex({bus_width, mem_size})            // synopsys full_case parallel_case
190
           {`MC_BW_8, `MC_MEM_SIZE_64}:         col_adr <= #1 {1'h0, wb_addr_i[10:2]};
191
           {`MC_BW_8, `MC_MEM_SIZE_128}:        col_adr <= #1        wb_addr_i[11:2];
192
           {`MC_BW_8, `MC_MEM_SIZE_256}:        col_adr <= #1        wb_addr_i[11:2];
193
 
194
           {`MC_BW_16, `MC_MEM_SIZE_64}:        col_adr <= #1 {2'h0, wb_addr_i[09:2]};
195
           {`MC_BW_16, `MC_MEM_SIZE_128}:       col_adr <= #1 {1'h0, wb_addr_i[10:2]};
196
           {`MC_BW_16, `MC_MEM_SIZE_256}:       col_adr <= #1 {1'h0, wb_addr_i[10:2]};
197
 
198
           {`MC_BW_32, `MC_MEM_SIZE_64}:        col_adr <= #1 {2'h0, wb_addr_i[09:2]};
199
           {`MC_BW_32, `MC_MEM_SIZE_128}:       col_adr <= #1 {2'h0, wb_addr_i[09:2]};
200
           {`MC_BW_32, `MC_MEM_SIZE_256}:       col_adr <= #1 {2'h0, wb_addr_i[09:2]};
201
        endcase
202
 
203
always @(posedge clk)
204
   if(cs_le)
205
     begin
206
        if(!bas)
207
                casex({bus_width, mem_size})            // synopsys full_case parallel_case
208
                   {`MC_BW_8, `MC_MEM_SIZE_64}:         row_adr <= #1 {1'h0, wb_addr_i[24:13]};
209
                   {`MC_BW_8, `MC_MEM_SIZE_128}:        row_adr <= #1 {1'h0, wb_addr_i[25:14]};
210
                   {`MC_BW_8, `MC_MEM_SIZE_256}:        row_adr <= #1        wb_addr_i[26:14];
211
 
212
                   {`MC_BW_16, `MC_MEM_SIZE_64}:        row_adr <= #1 {1'h0, wb_addr_i[23:12]};
213
                   {`MC_BW_16, `MC_MEM_SIZE_128}:       row_adr <= #1 {1'h0, wb_addr_i[24:13]};
214
                   {`MC_BW_16, `MC_MEM_SIZE_256}:       row_adr <= #1        wb_addr_i[25:13];
215
 
216
                   {`MC_BW_32, `MC_MEM_SIZE_64}:        row_adr <= #1 {2'h0, wb_addr_i[22:12]};
217
                   {`MC_BW_32, `MC_MEM_SIZE_128}:       row_adr <= #1 {1'h0, wb_addr_i[23:12]};
218
                   {`MC_BW_32, `MC_MEM_SIZE_256}:       row_adr <= #1        wb_addr_i[24:12];
219
                endcase
220
        else
221
                casex({bus_width, mem_size})            // synopsys full_case parallel_case
222
                   {`MC_BW_8, `MC_MEM_SIZE_64}:         row_adr <= #1 {1'h0, wb_addr_i[22:11]};
223
                   {`MC_BW_8, `MC_MEM_SIZE_128}:        row_adr <= #1 {1'h0, wb_addr_i[23:12]};
224
                   {`MC_BW_8, `MC_MEM_SIZE_256}:        row_adr <= #1        wb_addr_i[24:12];
225
 
226
                   {`MC_BW_16, `MC_MEM_SIZE_64}:        row_adr <= #1 {1'h0, wb_addr_i[21:10]};
227
                   {`MC_BW_16, `MC_MEM_SIZE_128}:       row_adr <= #1 {1'h0, wb_addr_i[22:11]};
228
                   {`MC_BW_16, `MC_MEM_SIZE_256}:       row_adr <= #1        wb_addr_i[23:11];
229
 
230
                   {`MC_BW_32, `MC_MEM_SIZE_64}:        row_adr <= #1 {2'h0, wb_addr_i[20:10]};
231
                   {`MC_BW_32, `MC_MEM_SIZE_128}:       row_adr <= #1 {1'h0, wb_addr_i[21:10]};
232
                   {`MC_BW_32, `MC_MEM_SIZE_256}:       row_adr <= #1        wb_addr_i[22:10];
233
                endcase
234
     end
235
 
236
 
237
always @(posedge clk)
238
   if(cs_le)
239
     begin
240
        if(!bas)
241
                casex({bus_width, mem_size})            // synopsys full_case parallel_case
242
                   {`MC_BW_8, `MC_MEM_SIZE_64}:         bank_adr <= #1 wb_addr_i[12:11];
243
                   {`MC_BW_8, `MC_MEM_SIZE_128}:        bank_adr <= #1 wb_addr_i[13:12];
244
                   {`MC_BW_8, `MC_MEM_SIZE_256}:        bank_adr <= #1 wb_addr_i[13:12];
245
 
246
                   {`MC_BW_16, `MC_MEM_SIZE_64}:        bank_adr <= #1 wb_addr_i[11:10];
247
                   {`MC_BW_16, `MC_MEM_SIZE_128}:       bank_adr <= #1 wb_addr_i[12:11];
248
                   {`MC_BW_16, `MC_MEM_SIZE_256}:       bank_adr <= #1 wb_addr_i[12:11];
249
 
250
                   {`MC_BW_32, `MC_MEM_SIZE_64}:        bank_adr <= #1 wb_addr_i[11:10];
251
                   {`MC_BW_32, `MC_MEM_SIZE_128}:       bank_adr <= #1 wb_addr_i[11:10];
252
                   {`MC_BW_32, `MC_MEM_SIZE_256}:       bank_adr <= #1 wb_addr_i[11:10];
253
                endcase
254
        else
255
                casex({bus_width, mem_size})            // synopsys full_case parallel_case
256
                   {`MC_BW_8, `MC_MEM_SIZE_64}:         bank_adr <= #1 wb_addr_i[24:23];
257
                   {`MC_BW_8, `MC_MEM_SIZE_128}:        bank_adr <= #1 wb_addr_i[25:24];
258
                   {`MC_BW_8, `MC_MEM_SIZE_256}:        bank_adr <= #1 wb_addr_i[26:25];
259
 
260
                   {`MC_BW_16, `MC_MEM_SIZE_64}:        bank_adr <= #1 wb_addr_i[23:22];
261
                   {`MC_BW_16, `MC_MEM_SIZE_128}:       bank_adr <= #1 wb_addr_i[24:23];
262
                   {`MC_BW_16, `MC_MEM_SIZE_256}:       bank_adr <= #1 wb_addr_i[25:24];
263
 
264
                   {`MC_BW_32, `MC_MEM_SIZE_64}:        bank_adr <= #1 wb_addr_i[22:21];
265
                   {`MC_BW_32, `MC_MEM_SIZE_128}:       bank_adr <= #1 wb_addr_i[23:22];
266
                   {`MC_BW_32, `MC_MEM_SIZE_256}:       bank_adr <= #1 wb_addr_i[24:23];
267
                endcase
268
     end
269
 
270
always @(bus_width or mem_size)
271
        casex({bus_width, mem_size})            // synopsys full_case parallel_case
272
           {`MC_BW_8, `MC_MEM_SIZE_64}:         page_size = 11'd512;
273
           {`MC_BW_8, `MC_MEM_SIZE_128}:        page_size = 11'd1024;
274
           {`MC_BW_8, `MC_MEM_SIZE_256}:        page_size = 11'd1024;
275
 
276
           {`MC_BW_16, `MC_MEM_SIZE_64}:        page_size = 11'd256;
277
           {`MC_BW_16, `MC_MEM_SIZE_128}:       page_size = 11'd512;
278
           {`MC_BW_16, `MC_MEM_SIZE_256}:       page_size = 11'd512;
279
 
280
           {`MC_BW_32, `MC_MEM_SIZE_64}:        page_size = 11'd256;
281
           {`MC_BW_32, `MC_MEM_SIZE_128}:       page_size = 11'd256;
282
           {`MC_BW_32, `MC_MEM_SIZE_256}:       page_size = 11'd256;
283
        endcase
284
 
285
endmodule
286
 

powered by: WebSVN 2.1.0

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