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

Subversion Repositories mem_ctrl

[/] [mem_ctrl/] [trunk/] [rtl/] [verilog/] [mc_adr_sel.v] - Blame information for rev 8

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 rudi
/////////////////////////////////////////////////////////////////////
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 Rudolf Usselmann                         ////
15
////                    rudi@asics.ws                            ////
16
////                                                             ////
17
//// This source file may be used and distributed without        ////
18
//// restriction provided that this copyright statement is not   ////
19
//// removed from the file and that any derivative work contains ////
20
//// the original copyright notice and the associated disclaimer.////
21
////                                                             ////
22
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
23
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
24
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
25
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
26
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
27
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
28
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
29
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
30
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
31
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
32
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
33
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
34
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
35
////                                                             ////
36
/////////////////////////////////////////////////////////////////////
37
 
38
//  CVS Log
39
//
40 8 rudi
//  $Id: mc_adr_sel.v,v 1.2 2001-08-10 08:16:21 rudi Exp $
41 4 rudi
//
42 8 rudi
//  $Date: 2001-08-10 08:16:21 $
43
//  $Revision: 1.2 $
44 4 rudi
//  $Author: rudi $
45
//  $Locker:  $
46
//  $State: Exp $
47
//
48
// Change History:
49
//               $Log: not supported by cvs2svn $
50 8 rudi
//               Revision 1.1  2001/07/29 07:34:41  rudi
51
//
52
//
53
//               1) Changed Directory Structure
54
//               2) Fixed several minor bugs
55
//
56 4 rudi
//               Revision 1.2  2001/06/12 15:19:49  rudi
57
//
58
//
59
//               Minor changes after running lint, and a small bug fix reading csr and ba_mask registers.
60
//
61
//               Revision 1.1.1.1  2001/05/13 09:39:40  rudi
62
//               Created Directory Structure
63
//
64
//
65
//
66
//
67
 
68
`include "mc_defines.v"
69
 
70
module mc_adr_sel(clk, csc, tms, wb_ack_o, wb_stb_i, wb_addr_i,
71
                wb_write_go, wr_hold, cas_,
72
                mc_addr, row_adr, bank_adr, rfr_ack,
73
                cs_le, cmd_a10, row_sel, lmr_sel, next_adr, wr_cycle,
74
                page_size);
75
 
76
input           clk;
77
input   [31:0]   csc;
78
input   [31:0]   tms;
79
input           wb_ack_o, wb_stb_i;
80
input   [31:0]   wb_addr_i;
81
input           wb_write_go;
82
input           wr_hold;
83
input           cas_;
84
output  [23:0]   mc_addr;
85
output  [12:0]   row_adr;
86
output  [1:0]    bank_adr;
87
input           rfr_ack;
88
input           cs_le;
89
input           cmd_a10;
90
input           row_sel;
91
input           lmr_sel;
92
input           next_adr;
93
input           wr_cycle;
94
output  [10:0]   page_size;
95
 
96
////////////////////////////////////////////////////////////////////
97
//
98
// Local Registers & Wires
99
//
100
 
101
reg     [23:0]   mc_addr_d;
102
reg     [23:0]   acs_addr;
103
wire    [23:0]   acs_addr_pl1;
104
reg     [23:0]   sram_addr;
105
wire    [14:0]   sdram_adr;
106
reg     [12:0]   row_adr;
107
reg     [9:0]    col_adr;
108
reg     [1:0]    bank_adr;
109
reg     [10:0]   page_size;
110
 
111
wire    [2:0]    mem_type;
112
wire    [1:0]    bus_width;
113
wire    [1:0]    mem_size;
114
wire            bas;
115
 
116
// Aliases
117
assign mem_type  = csc[3:1];
118
assign bus_width = csc[5:4];
119
assign mem_size  = csc[7:6];
120
assign bas       = csc[9];
121
 
122
////////////////////////////////////////////////////////////////////
123
//
124
// Misc Logic
125
//
126
 
127
always @(mem_type or wr_hold or sdram_adr or acs_addr or sram_addr or wb_addr_i)
128 8 rudi
        if(mem_type == `MC_MEM_TYPE_SDRAM)              mc_addr_d = {9'h0, sdram_adr};
129 4 rudi
        else
130 8 rudi
        if(mem_type == `MC_MEM_TYPE_ACS)                mc_addr_d = acs_addr;
131 4 rudi
        else
132 8 rudi
        if((mem_type == `MC_MEM_TYPE_SRAM) & wr_hold)   mc_addr_d = sram_addr;
133 4 rudi
        else                                            mc_addr_d = wb_addr_i[25:2];
134
 
135
assign mc_addr = rfr_ack ? {mc_addr_d[23:11], 1'b1, mc_addr_d[9:0]} : mc_addr_d;
136
 
137
////////////////////////////////////////////////////////////////////
138
//
139
// Async Devices Address Latch & Counter
140
//
141
 
142
//assign asc_addr_pl1 = asc_addr + 1;
143
mc_incn_r #(24) u0(     .clk(           clk             ),
144
                        .inc_in(        acs_addr        ),
145
                        .inc_out(       acs_addr_pl1    ) );
146
 
147
always @(posedge clk)
148
        if(wb_stb_i)    sram_addr <= #1 wb_addr_i[25:2];
149
 
150
always @(posedge clk)
151
        // *** Use same address for write and read ***
152
        //if(wb_write_go)               acs_addr <= #1 wb_addr_i[25:2];
153
        //else
154
        if(cs_le)
155
                case(bus_width)         // synopsys full_case parallel_case
156 8 rudi
                   `MC_BW_8:    acs_addr <= #1 wb_addr_i[23:0];
157
                   `MC_BW_16:   acs_addr <= #1 wb_addr_i[24:1];
158
                   `MC_BW_32:   acs_addr <= #1 wb_addr_i[25:2];
159 4 rudi
                endcase
160
        else
161
        if(next_adr)            acs_addr <= #1 acs_addr_pl1;
162
 
163
////////////////////////////////////////////////////////////////////
164
//
165
// SDRAM Address Mux
166
//
167
 
168
assign sdram_adr[12:0] = (lmr_sel & !cas_) ? tms[12:0] :
169
                                row_sel ? row_adr :
170
                                {2'h0, cmd_a10, col_adr};
171
 
172
assign sdram_adr[14:13] = bank_adr;
173
 
174
always @(posedge clk)
175
   if(wr_cycle ? wb_ack_o : wb_stb_i)
176
        casex({bus_width, mem_size})            // synopsys full_case parallel_case
177 8 rudi
           {`MC_BW_8, `MC_MEM_SIZE_64}:         col_adr <= #1 {1'h0, wb_addr_i[10:2]};
178
           {`MC_BW_8, `MC_MEM_SIZE_128}:        col_adr <= #1        wb_addr_i[11:2];
179
           {`MC_BW_8, `MC_MEM_SIZE_256}:        col_adr <= #1        wb_addr_i[11:2];
180 4 rudi
 
181 8 rudi
           {`MC_BW_16, `MC_MEM_SIZE_64}:        col_adr <= #1 {2'h0, wb_addr_i[09:2]};
182
           {`MC_BW_16, `MC_MEM_SIZE_128}:       col_adr <= #1 {1'h0, wb_addr_i[10:2]};
183
           {`MC_BW_16, `MC_MEM_SIZE_256}:       col_adr <= #1 {1'h0, wb_addr_i[10:2]};
184 4 rudi
 
185 8 rudi
           {`MC_BW_32, `MC_MEM_SIZE_64}:        col_adr <= #1 {2'h0, wb_addr_i[09:2]};
186
           {`MC_BW_32, `MC_MEM_SIZE_128}:       col_adr <= #1 {2'h0, wb_addr_i[09:2]};
187
           {`MC_BW_32, `MC_MEM_SIZE_256}:       col_adr <= #1 {2'h0, wb_addr_i[09:2]};
188 4 rudi
        endcase
189
 
190
always @(posedge clk)
191
   if(cs_le)
192
     begin
193
        if(!bas)
194
                casex({bus_width, mem_size})            // synopsys full_case parallel_case
195 8 rudi
                   {`MC_BW_8, `MC_MEM_SIZE_64}:         row_adr <= #1 {1'h0, wb_addr_i[24:13]};
196
                   {`MC_BW_8, `MC_MEM_SIZE_128}:        row_adr <= #1 {1'h0, wb_addr_i[25:14]};
197
                   {`MC_BW_8, `MC_MEM_SIZE_256}:        row_adr <= #1        wb_addr_i[26:14];
198 4 rudi
 
199 8 rudi
                   {`MC_BW_16, `MC_MEM_SIZE_64}:        row_adr <= #1 {1'h0, wb_addr_i[23:12]};
200
                   {`MC_BW_16, `MC_MEM_SIZE_128}:       row_adr <= #1 {1'h0, wb_addr_i[24:13]};
201
                   {`MC_BW_16, `MC_MEM_SIZE_256}:       row_adr <= #1        wb_addr_i[25:13];
202 4 rudi
 
203 8 rudi
                   {`MC_BW_32, `MC_MEM_SIZE_64}:        row_adr <= #1 {2'h0, wb_addr_i[22:12]};
204
                   {`MC_BW_32, `MC_MEM_SIZE_128}:       row_adr <= #1 {1'h0, wb_addr_i[23:12]};
205
                   {`MC_BW_32, `MC_MEM_SIZE_256}:       row_adr <= #1        wb_addr_i[24:12];
206 4 rudi
                endcase
207
        else
208
                casex({bus_width, mem_size})            // synopsys full_case parallel_case
209 8 rudi
                   {`MC_BW_8, `MC_MEM_SIZE_64}:         row_adr <= #1 {1'h0, wb_addr_i[22:11]};
210
                   {`MC_BW_8, `MC_MEM_SIZE_128}:        row_adr <= #1 {1'h0, wb_addr_i[23:12]};
211
                   {`MC_BW_8, `MC_MEM_SIZE_256}:        row_adr <= #1        wb_addr_i[24:12];
212 4 rudi
 
213 8 rudi
                   {`MC_BW_16, `MC_MEM_SIZE_64}:        row_adr <= #1 {1'h0, wb_addr_i[21:10]};
214
                   {`MC_BW_16, `MC_MEM_SIZE_128}:       row_adr <= #1 {1'h0, wb_addr_i[22:11]};
215
                   {`MC_BW_16, `MC_MEM_SIZE_256}:       row_adr <= #1        wb_addr_i[23:11];
216 4 rudi
 
217 8 rudi
                   {`MC_BW_32, `MC_MEM_SIZE_64}:        row_adr <= #1 {2'h0, wb_addr_i[20:10]};
218
                   {`MC_BW_32, `MC_MEM_SIZE_128}:       row_adr <= #1 {1'h0, wb_addr_i[21:10]};
219
                   {`MC_BW_32, `MC_MEM_SIZE_256}:       row_adr <= #1        wb_addr_i[22:10];
220 4 rudi
                endcase
221
     end
222
 
223
 
224
always @(posedge clk)
225
   if(cs_le)
226
     begin
227
        if(!bas)
228
                casex({bus_width, mem_size})            // synopsys full_case parallel_case
229 8 rudi
                   {`MC_BW_8, `MC_MEM_SIZE_64}:         bank_adr <= #1 wb_addr_i[12:11];
230
                   {`MC_BW_8, `MC_MEM_SIZE_128}:        bank_adr <= #1 wb_addr_i[13:12];
231
                   {`MC_BW_8, `MC_MEM_SIZE_256}:        bank_adr <= #1 wb_addr_i[13:12];
232 4 rudi
 
233 8 rudi
                   {`MC_BW_16, `MC_MEM_SIZE_64}:        bank_adr <= #1 wb_addr_i[11:10];
234
                   {`MC_BW_16, `MC_MEM_SIZE_128}:       bank_adr <= #1 wb_addr_i[12:11];
235
                   {`MC_BW_16, `MC_MEM_SIZE_256}:       bank_adr <= #1 wb_addr_i[12:11];
236 4 rudi
 
237 8 rudi
                   {`MC_BW_32, `MC_MEM_SIZE_64}:        bank_adr <= #1 wb_addr_i[11:10];
238
                   {`MC_BW_32, `MC_MEM_SIZE_128}:       bank_adr <= #1 wb_addr_i[11:10];
239
                   {`MC_BW_32, `MC_MEM_SIZE_256}:       bank_adr <= #1 wb_addr_i[11:10];
240 4 rudi
                endcase
241
        else
242
                casex({bus_width, mem_size})            // synopsys full_case parallel_case
243 8 rudi
                   {`MC_BW_8, `MC_MEM_SIZE_64}:         bank_adr <= #1 wb_addr_i[24:23];
244
                   {`MC_BW_8, `MC_MEM_SIZE_128}:        bank_adr <= #1 wb_addr_i[25:24];
245
                   {`MC_BW_8, `MC_MEM_SIZE_256}:        bank_adr <= #1 wb_addr_i[26:25];
246 4 rudi
 
247 8 rudi
                   {`MC_BW_16, `MC_MEM_SIZE_64}:        bank_adr <= #1 wb_addr_i[23:22];
248
                   {`MC_BW_16, `MC_MEM_SIZE_128}:       bank_adr <= #1 wb_addr_i[24:23];
249
                   {`MC_BW_16, `MC_MEM_SIZE_256}:       bank_adr <= #1 wb_addr_i[25:24];
250 4 rudi
 
251 8 rudi
                   {`MC_BW_32, `MC_MEM_SIZE_64}:        bank_adr <= #1 wb_addr_i[22:21];
252
                   {`MC_BW_32, `MC_MEM_SIZE_128}:       bank_adr <= #1 wb_addr_i[23:22];
253
                   {`MC_BW_32, `MC_MEM_SIZE_256}:       bank_adr <= #1 wb_addr_i[24:23];
254 4 rudi
                endcase
255
     end
256
 
257
always @(bus_width or mem_size)
258
        casex({bus_width, mem_size})            // synopsys full_case parallel_case
259 8 rudi
           {`MC_BW_8, `MC_MEM_SIZE_64}:         page_size = 11'd512;
260
           {`MC_BW_8, `MC_MEM_SIZE_128}:        page_size = 11'd1024;
261
           {`MC_BW_8, `MC_MEM_SIZE_256}:        page_size = 11'd1024;
262 4 rudi
 
263 8 rudi
           {`MC_BW_16, `MC_MEM_SIZE_64}:        page_size = 11'd256;
264
           {`MC_BW_16, `MC_MEM_SIZE_128}:       page_size = 11'd512;
265
           {`MC_BW_16, `MC_MEM_SIZE_256}:       page_size = 11'd512;
266 4 rudi
 
267 8 rudi
           {`MC_BW_32, `MC_MEM_SIZE_64}:        page_size = 11'd256;
268
           {`MC_BW_32, `MC_MEM_SIZE_128}:       page_size = 11'd256;
269
           {`MC_BW_32, `MC_MEM_SIZE_256}:       page_size = 11'd256;
270 4 rudi
        endcase
271
 
272
endmodule
273
 

powered by: WebSVN 2.1.0

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