1 |
103 |
unneback |
\input texinfo
|
2 |
|
|
@c -*-texinfo-*-
|
3 |
|
|
@c %**start of header
|
4 |
|
|
@setfilename versatile_mem_ctrl
|
5 |
|
|
@include version.texi
|
6 |
|
|
@settitle Versatile memory controller @value{VERSION}
|
7 |
|
|
|
8 |
|
|
@c %**end of header
|
9 |
|
|
|
10 |
|
|
@set DESIGN Versatile memory controller
|
11 |
|
|
@copying
|
12 |
|
|
This file documents the @value{DESIGN}.
|
13 |
|
|
|
14 |
|
|
Copyright @copyright{} 2011 ORSoC
|
15 |
|
|
|
16 |
|
|
@quotation
|
17 |
|
|
Permission is granted to copy, distribute and/or modify this document
|
18 |
|
|
under the terms of the GNU Free Documentation License, Version 1.2 or
|
19 |
|
|
any later version published by the Free Software Foundation; with no
|
20 |
|
|
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
|
21 |
|
|
Texts. A copy of the license is included in the section entitled ``GNU
|
22 |
|
|
Free Documentation License''.
|
23 |
|
|
@end quotation
|
24 |
|
|
@end copying
|
25 |
|
|
|
26 |
|
|
@afourpaper
|
27 |
|
|
|
28 |
|
|
@titlepage
|
29 |
|
|
@title @value{DESIGN} User Guide
|
30 |
|
|
@c @subtitle subtitle-if-any
|
31 |
|
|
@c @subtitle second-subtitle
|
32 |
|
|
@author Michael Unneback
|
33 |
|
|
@author ORSoC
|
34 |
|
|
|
35 |
|
|
@c The following two commands
|
36 |
|
|
@c start the copyright page.
|
37 |
|
|
@page
|
38 |
|
|
@vskip 0pt plus 1filll
|
39 |
|
|
@insertcopying
|
40 |
|
|
|
41 |
|
|
Published by ORSoC
|
42 |
|
|
@end titlepage
|
43 |
|
|
|
44 |
|
|
@c So the toc is printed at the start.
|
45 |
|
|
@contents
|
46 |
|
|
|
47 |
|
|
@ifnottex
|
48 |
|
|
@node Top
|
49 |
|
|
@top Scope of this Document
|
50 |
|
|
|
51 |
|
|
This document is the user guide for @value{DESIGN}.
|
52 |
|
|
|
53 |
|
|
@end ifnottex
|
54 |
|
|
|
55 |
|
|
@node Document Introduction
|
56 |
|
|
@chapter Introduction
|
57 |
|
|
|
58 |
|
|
@cindex Introduction to this @value{DESIGN}
|
59 |
|
|
|
60 |
|
|
This design implements a versatile memory controller. If used in combination with the versitale library, available from OpenCores,
|
61 |
|
|
different types of system can easily be designed, including use cases where the system bus is in one clock domain and the memory
|
62 |
|
|
controller in an other.
|
63 |
106 |
unneback |
|
64 |
|
|
@section Dependencies to other IP cores
|
65 |
|
|
|
66 |
|
|
This design uses the following IP coreas available from OpenCores project verstile library.
|
67 |
|
|
@itemize @bullet
|
68 |
|
|
@item vl_cnt_shreg_ce_clear
|
69 |
|
|
@item vl_dff_ce_clear
|
70 |
|
|
@item vl_cnt_lfsr_zq
|
71 |
|
|
@item vl_dff
|
72 |
|
|
@item vl_o_dff
|
73 |
|
|
@item vl_io_dff_oe
|
74 |
|
|
@end itemize
|
75 |
|
|
|
76 |
103 |
unneback |
@node Block diagram
|
77 |
|
|
@chapter Block Diagram
|
78 |
|
|
@cindex Block diagram
|
79 |
|
|
|
80 |
106 |
unneback |
@section Synchronous design
|
81 |
|
|
@image{block-sdram}
|
82 |
|
|
Synchronous design where wishbone clock domain is equal to SDRAM and SDRAM controller clock domain.
|
83 |
103 |
unneback |
|
84 |
106 |
unneback |
@section Asynchronous design
|
85 |
|
|
@image{block-sdram-wbwb}
|
86 |
|
|
Asynchronous design where wishbone and SDRAM clock domain are independant. A wishbone rev B3 compatilble bridge
|
87 |
|
|
is available in project versatile_library from OpenCores, http://www.opencores.org.
|
88 |
103 |
unneback |
|
89 |
106 |
unneback |
@section Asynchronous design with multiple wishbone interfaces
|
90 |
|
|
@image{block-sdram-wbwb-arbiter}
|
91 |
|
|
Asynchronous design where wishbone and SDRAM clock domain are independant. Multiple wishbone port with use of a wishbone arbiter.
|
92 |
103 |
unneback |
|
93 |
106 |
unneback |
@node SDR SDRAM controller
|
94 |
|
|
@chapter SDR SDRAM controller
|
95 |
103 |
unneback |
|
96 |
106 |
unneback |
@section Module defines
|
97 |
|
|
@multitable @columnfractions .2 .8
|
98 |
|
|
@headitem Name @tab Description
|
99 |
|
|
@item NO_BURST @tab Define if burst cycles not used
|
100 |
|
|
@item WRAP4 @tab Define to support 4 word wrap burst
|
101 |
|
|
@item WRAP8 @tab Define to support 8 word wrap burst
|
102 |
|
|
@item WRAP16 @tab Define to support 16 word wrap burst
|
103 |
103 |
unneback |
@end multitable
|
104 |
|
|
|
105 |
106 |
unneback |
@section Module parameters
|
106 |
103 |
unneback |
|
107 |
106 |
unneback |
@multitable @columnfractions .2 .1 .7
|
108 |
|
|
@headitem Name @tab Default value @tab Description
|
109 |
|
|
@item ba_size @tab 2 @tab Bank adress vector size
|
110 |
|
|
@item row_size @tab 13 @tab Row adress vector size
|
111 |
|
|
@item col_size @tab 9 @tab Column adress vector size
|
112 |
|
|
@item cl @tab 2 @tab CAS latency
|
113 |
103 |
unneback |
@end multitable
|
114 |
|
|
|
115 |
106 |
unneback |
Parameters ba_size, col_size and row_size should be set depending on memory configuration. The following
|
116 |
|
|
table holds figures for some SDRAM memories.
|
117 |
103 |
unneback |
|
118 |
106 |
unneback |
@multitable @columnfractions .15 .25 .1 .1 .1 .3
|
119 |
|
|
@headitem Manufacturer @tab Partnumber @tab ba_size @tab row_size @tab col_size @tab Memory size
|
120 |
|
|
@item Micron @tab MT48LC4M16 @tab 2 @tab 12 @tab 8 @tab 8Mbyte
|
121 |
|
|
@item Micron @tab MT48LC8M16 @tab 2 @tab 12 @tab 9 @tab 16Mbyte
|
122 |
|
|
@item Micron @tab MT48LC16M16 @tab 2 @tab 13 @tab 9 @tab 32Mbyte
|
123 |
|
|
@item Micron @tab MT48LC32M16 @tab 2 @tab 13 @tab 10 @tab 64Mbyte
|
124 |
103 |
unneback |
@end multitable
|
125 |
|
|
|
126 |
106 |
unneback |
Parameter cl should be set to either 2 or 3 depending on SDRAM clock.
|
127 |
103 |
unneback |
|
128 |
106 |
unneback |
@section Module IO signals
|
129 |
|
|
@subsection Wishbone signals
|
130 |
|
|
@multitable @columnfractions .2 .1 .1 .6
|
131 |
|
|
@headitem Name @tab Dir @tab Width @tab Description
|
132 |
|
|
@item dat_i @tab I @tab 32 @tab Input data vector
|
133 |
|
|
@item adr_i @tab I @tab @tab Adress vector
|
134 |
|
|
@item sel_i @tab I @tab 4 @tab Byte select signals
|
135 |
|
|
@item bte_i @tab I @tab 2 @tab Bus tag identifier
|
136 |
|
|
@item we_i @tab I @tab 1 @tab Write enable
|
137 |
|
|
@item cyc_i @tab I @tab 1 @tab Active cycle indicator
|
138 |
|
|
@item stb_i @tab I @tab 1 @tab Strobe
|
139 |
|
|
@item dat_o @tab O @tab 32 @tab Output data vector
|
140 |
|
|
@item ack_o @tab O @tab 1 @tab Acknowledge signal
|
141 |
103 |
unneback |
@end multitable
|
142 |
|
|
|
143 |
106 |
unneback |
Wishbone signal bte_i is optional and is only used for designs supporting burst transfer.
|
144 |
|
|
@subsection SDRAM signals
|
145 |
|
|
@multitable @columnfractions .2 .1 .1 .6
|
146 |
|
|
@headitem Name @tab Dir @tab Width @tab Description
|
147 |
|
|
@item ba @tab O @tab ba_size @tab Bank adress vector
|
148 |
|
|
@item a @tab O @tab 13 @tab Adress vector
|
149 |
|
|
@item cmd @tab O @tab 3 @tab SDRAM command, {ras_n, cas_n, we_n}
|
150 |
|
|
@item cke @tab O @tab 1 @tab Clock enable
|
151 |
|
|
@item cs_n @tab O @tab 1 @tab Chip select, active low
|
152 |
|
|
@item dqm @tab O @tab 2 @tab Data mask
|
153 |
|
|
@item dq_i @tab I @tab 16 @tab Data input vector
|
154 |
|
|
@item dq_o @tab O @tab 16 @tab Data output vector
|
155 |
|
|
@item dq_oe @tab O @tab 1 @tab Data output enable
|
156 |
103 |
unneback |
@end multitable
|
157 |
|
|
|
158 |
106 |
unneback |
@subsection System signals
|
159 |
|
|
@multitable @columnfractions .2 .1 .1 .6
|
160 |
|
|
@headitem Name @tab Dir @tab Width @tab Description
|
161 |
|
|
@item clk @tab I @tab 1 @tab SDRAM system clock
|
162 |
|
|
@item rst @tab I @tab 1 @tab Asynchronous reset, active hig
|
163 |
103 |
unneback |
@end multitable
|
164 |
|
|
|
165 |
106 |
unneback |
@node SDR SDRAM 16 bit data bus controller
|
166 |
|
|
@chapter SDR SDRAM 16 bit data bus controller
|
167 |
|
|
@cindex SDR SDRAM 16 bit data bus controller
|
168 |
103 |
unneback |
|
169 |
106 |
unneback |
@section State machine implementation
|
170 |
103 |
unneback |
|
171 |
106 |
unneback |
Design is based on a state machine as described below.
|
172 |
103 |
unneback |
|
173 |
106 |
unneback |
@image{sdr_sdram_16,14cm,16cm,,.png}
|
174 |
103 |
unneback |
|
175 |
106 |
unneback |
A counter is incremented on each cycle the state machine reside in any given state.
|
176 |
|
|
When changing state a counter clear is issued. The counter state vector is used for
|
177 |
|
|
two things
|
178 |
103 |
unneback |
@itemize
|
179 |
106 |
unneback |
@item controlling outputs, ie defining cmd and other control signals
|
180 |
|
|
@item to make sure timing reqiurements are fulfilled, ie define time from precharge to activate
|
181 |
103 |
unneback |
@end itemize
|
182 |
|
|
|
183 |
106 |
unneback |
@subsection State - init
|
184 |
103 |
unneback |
|
185 |
106 |
unneback |
The init state is responsible to make sure that a proper start-up and initialization of the SDRAM is
|
186 |
|
|
performed. The following sequence should be applied:
|
187 |
|
|
@enumerate
|
188 |
|
|
@item assert CKE low
|
189 |
|
|
@item provide stable clock
|
190 |
|
|
@item bring CKE high
|
191 |
|
|
@item perform PRECHARGE ALL command and wait for tRP
|
192 |
|
|
@item issue AUTO RERFESH and wait for tRFC
|
193 |
|
|
@item issue AUTO RERFESH and wait for tRFC
|
194 |
|
|
@item LOAD MODE REGISTER and wait for tMR
|
195 |
|
|
@end enumerate
|
196 |
|
|
After this state machine advances to idle state
|
197 |
|
|
|
198 |
|
|
@subsection State - idle
|
199 |
|
|
|
200 |
|
|
In state idle implementation awaits two different condition, appearing in order of priority
|
201 |
|
|
@enumerate
|
202 |
|
|
@item refresh request => next state is rfr
|
203 |
|
|
@item cyc_i & stb_i => next state is adr
|
204 |
|
|
@end enumerate
|
205 |
|
|
|
206 |
|
|
|
207 |
|
|
@subsection State - adr
|
208 |
|
|
|
209 |
|
|
Depending on status of open bank and open rows choice is taken whether to precharge and activate, activate or go
|
210 |
|
|
directly to read write state. Reason for this as a separate state is to be able to have comparison result as a
|
211 |
|
|
registered signal to achive an higher clock frequency.
|
212 |
|
|
|
213 |
|
|
@subsection State - pch
|
214 |
|
|
|
215 |
|
|
Open row in current bank is deactivated. State machine waits in pch state to fulfill tRP.
|
216 |
|
|
|
217 |
|
|
@subsection State - act
|
218 |
|
|
|
219 |
|
|
Row in current bank is activated. State machine waits in act state to fulfill tRCD.
|
220 |
|
|
|
221 |
|
|
@subsection State - rw
|
222 |
|
|
|
223 |
|
|
A two word read or write burst is started. If wishbone cycle is of type burst column will get incremented
|
224 |
|
|
with possible wrap around and a new burst started for each 32 bit word.
|
225 |
|
|
|
226 |
|
|
@section Timing
|
227 |
|
|
|
228 |
|
|
The follwoing timing requirements must be fulfilled:
|
229 |
|
|
|
230 |
103 |
unneback |
@itemize
|
231 |
106 |
unneback |
@item tMR - Load Mode Register period
|
232 |
|
|
@item tRCD - Active to read/write delay
|
233 |
|
|
@item tRP - Precharge command period
|
234 |
|
|
@item tRFC - Auto refresh period
|
235 |
|
|
@item tREF - refresh period
|
236 |
103 |
unneback |
@end itemize
|
237 |
|
|
|
238 |
106 |
unneback |
In the SDRAM datasheet the above timing figures will be given in ns and should be
|
239 |
|
|
converted to number of clock cycles. All of the above timing figures, except tREF, are implemented as parameters
|
240 |
|
|
in the design and should be set depending on SDRAM figures and actual clock period. All
|
241 |
|
|
parameters have default values of 2 clock cycles.
|
242 |
|
|
|
243 |
|
|
@subsection Bank/Row activation - tRCD
|
244 |
|
|
|
245 |
|
|
@image{tRCD,15cm,5cm,,.png}
|
246 |
|
|
|
247 |
|
|
Minimum time between activation of and read or write command.
|
248 |
|
|
@subsection Auto refresh mode
|
249 |
|
|
|
250 |
|
|
@image{aref,15cm,15cm,,.png}
|
251 |
|
|
|
252 |
|
|
Minumum time between precharge and auto refresh and active command.
|
253 |
|
|
|
254 |
|
|
@subsection Refresh period - tREF
|
255 |
|
|
|
256 |
|
|
The auto refresh period, tREF must be met. During auto refresh an internal address counter
|
257 |
|
|
is used and adress signals are treated as don't care. During the refresh period each row must
|
258 |
|
|
be refreshed. @*
|
259 |
|
|
For example consider a SDRAM with tREF = 64 ms and row size of 8K. An auto refresh command
|
260 |
|
|
should be issued once every 64 ms / 8192 = 7.813 us.@*
|
261 |
|
|
The refresh interval counter is implemented as an LFSR style counter for minimal area and maximum
|
262 |
|
|
performance. To accurately set the wrap value for this counter use the application VersatileCounter found
|
263 |
|
|
in the versatile library project at opencores. This program gives the wrap value for a given vector length.
|
264 |
|
|
Assuming an SDRAM clock frequency of 133 MHz which equals a period time of 7.5 ns we should issue an auto
|
265 |
|
|
refresh every 7.813 us / 7.5 ns = 1041 cycle. We need a state vector of 11 bits in the counter.@*
|
266 |
|
|
To get the wrap value we use the application@*
|
267 |
|
|
@command{./VersatileCounter.php 11 1041@*11111110101}
|
268 |
|
|
|
269 |
|
|
@node Example: Timing setup
|
270 |
|
|
@chapter Example: Timing setup
|
271 |
|
|
|
272 |
|
|
@section Requirements
|
273 |
|
|
|
274 |
|
|
SDRAM device to use:
|
275 |
103 |
unneback |
@itemize
|
276 |
106 |
unneback |
@item Micron MT48LC32M16-7E
|
277 |
103 |
unneback |
@end itemize
|
278 |
|
|
|
279 |
106 |
unneback |
@multitable @columnfractions .4 .2 .1 .1 .1 .1
|
280 |
|
|
@headitem Parameter @tab Symbol @tab Min @tab Max @tab Unit
|
281 |
|
|
@item Auto refresh period @tab tRFC @tab 66 @tab - @tab ns
|
282 |
|
|
@item Precharge command period @tab tRP @tab 15 @tab - @tab ns
|
283 |
|
|
@item Active to read or write delay @tab tRCD @tab 15 @tab - @tab ns
|
284 |
|
|
@item Load mode register command to active or refresh @tab tMRD @tab 2 @tab - @tab tCK
|
285 |
|
|
@item Refresh periods (8192 rows) @tab tREF @tab 66 @tab -@tab ms
|
286 |
|
|
@end multitable
|
287 |
103 |
unneback |
|
288 |
106 |
unneback |
Intended operating frequency is 75 MHz, tCK = 13.333 ns
|
289 |
103 |
unneback |
|
290 |
106 |
unneback |
@section Parameter settings
|
291 |
|
|
|
292 |
|
|
@multitable @columnfractions .2 .8
|
293 |
|
|
@headitem Symbol @tab Value
|
294 |
|
|
@item tRFC @tab 5
|
295 |
|
|
@item tRP @tab 2
|
296 |
|
|
@item tRCD @tab 2
|
297 |
|
|
@item tMRD @tab 2
|
298 |
|
|
@end multitable
|
299 |
|
|
@*
|
300 |
|
|
Refresh rate is 66 ms / 8192 = 8.057 us@*
|
301 |
|
|
Number of clock cycles between refresh request 8.057 us / 13.333 ns = 604@*
|
302 |
|
|
@*
|
303 |
|
|
To get the wrap value we use the application from Versatile Library@*
|
304 |
|
|
@command{./VersatileCounter.php 10 604@*0101001110}
|
305 |
|
|
|
306 |
|
|
|
307 |
103 |
unneback |
@c ****************************************************************************
|
308 |
|
|
@c End bits
|
309 |
|
|
@c ****************************************************************************
|
310 |
|
|
|
311 |
106 |
unneback |
@node GNU Free Documentation License
|
312 |
103 |
unneback |
@chapter GNU Free Documentation License
|
313 |
|
|
@cindex license for @value{DESIGN}
|
314 |
|
|
|
315 |
|
|
@include fdl.texi
|
316 |
|
|
|
317 |
|
|
@node Index
|
318 |
|
|
|
319 |
|
|
@unnumbered Index
|
320 |
|
|
|
321 |
|
|
@printindex cp
|
322 |
|
|
|
323 |
|
|
@bye
|