1 |
2 |
john_fpga |
==============================================
|
2 |
|
|
File : DDR2_liesmich.txt
|
3 |
|
|
Projekt : Prj_12_DDR2
|
4 |
|
|
Zweck : DDR2-SDRAM auf dem Spartan-3A Board
|
5 |
|
|
DDR2-RAM : MT47H32M16 (64 MByte)
|
6 |
|
|
Datum: 19.08.2011
|
7 |
|
|
Version : 7.0
|
8 |
|
|
Plattform : XILINX Spartan-3A
|
9 |
|
|
FPGA : XC3S700A-FGG484
|
10 |
|
|
Sprache : VHDL
|
11 |
|
|
ISE : ISE-Design-Suite V:13.1
|
12 |
|
|
IP-Core : MIG V:3.6.1
|
13 |
|
|
Autor : UB
|
14 |
|
|
Mail : Becker_U(at)gmx.de
|
15 |
|
|
==============================================
|
16 |
|
|
|
17 |
|
|
|
18 |
|
|
|
19 |
|
|
Module :
|
20 |
|
|
==================
|
21 |
|
|
|
22 |
|
|
############### ######################### ################
|
23 |
|
|
# # # # # #
|
24 |
|
|
# DDR2-RAM : #---------# TOP_Modul_VHDL #----# Buttons_VHDL #
|
25 |
|
|
# 512 MBit # # # # #
|
26 |
|
|
# # # # ################
|
27 |
|
|
############### # #
|
28 |
|
|
# # ################
|
29 |
|
|
# # # #
|
30 |
|
|
# #----# Clock_VHDL #
|
31 |
|
|
# # # #
|
32 |
|
|
# # ################
|
33 |
|
|
# #
|
34 |
|
|
############### # # ##################### ###################
|
35 |
|
|
# # # # # # # #
|
36 |
|
|
# Eingabe : # # # # DDR2_Control_VHDL #----# DDR2_READ_VHDL #
|
37 |
|
|
# 4 Buttons #---------# # # # # #
|
38 |
|
|
# 4 Schalter # # #----# # ###################
|
39 |
|
|
# # # # # #
|
40 |
|
|
############### # # # # ###################
|
41 |
|
|
# # # # # #
|
42 |
|
|
################### # # # #----# DDR2_Write_VHDL #
|
43 |
|
|
# # # # # # # #
|
44 |
|
|
# Ausgabe : #-----# # # # ###################
|
45 |
|
|
# 8 LEDs (Data) # # # #####################
|
46 |
|
|
# 1 LED (Status) # # #
|
47 |
|
|
################### # # #######################
|
48 |
|
|
# #----# #
|
49 |
|
|
############### # # # DDR2_RAM_CORE.vhd #
|
50 |
|
|
# Clock : #---------# # # MIG 3.6.1 #
|
51 |
|
|
# 133 MHz # # # # (27 Dateien) #
|
52 |
|
|
# # # # # + UCF-File #
|
53 |
|
|
############### ######################### #######################
|
54 |
|
|
|
55 |
|
|
|
56 |
|
|
|
57 |
|
|
Zweck :
|
58 |
|
|
========
|
59 |
|
|
|
60 |
|
|
> Dieses Projekt ist ein Beispiel wie ein DDR2-SDRAM auf einem Xilinx FPGA Board
|
61 |
|
|
eingebunden wird
|
62 |
|
|
|
63 |
|
|
|
64 |
|
|
|
65 |
|
|
Hinweise zur DDR2-RAM-Einbindung :
|
66 |
|
|
===================================
|
67 |
|
|
|
68 |
|
|
> das ganze Projekt basiert auf der Einbindung der vom MIG
|
69 |
|
|
generierten Files für ein DDR2-SDRAM (MIG 3.6.1)
|
70 |
|
|
|
71 |
|
|
> Hinweis zu den Einstellungen vom MIG :
|
72 |
|
|
- Typ = DDR2-SDRAM
|
73 |
|
|
- Frq = 133MHz
|
74 |
|
|
- Write Pipe Stages = 4
|
75 |
|
|
- Memory Part = MT47H32M16XX-3 (für das Spartan-3A Board)
|
76 |
|
|
- Data Width = 16
|
77 |
|
|
- Data-Mask = Ja
|
78 |
|
|
- SystemClock = Single-Ended
|
79 |
|
|
- Signale auf : Bank3 (komplett) , Bank2 (V12)
|
80 |
|
|
- Bank2 = System-Clock / Bank3 = Adrees-Control+Data+System-Control
|
81 |
|
|
- sonst alles auf "Default"
|
82 |
|
|
|
83 |
|
|
> Hinweise zum DDR2_RAM_CORE :
|
84 |
|
|
|
85 |
|
|
- es wurden nur die VHDL-Files
|
86 |
|
|
vom Ordner "User_Design/RTL" benutzt.
|
87 |
|
|
- alle anderen vom MIG generierten Files
|
88 |
|
|
sind für das Projekt nicht notwendig
|
89 |
|
|
|
90 |
|
|
> Hinweis zum UCF-File für das DDR2-RAM :
|
91 |
|
|
|
92 |
|
|
- ohne die Richtigen Settings im UCF-File,
|
93 |
|
|
kommt es zu Timing problemen beim lesen oder
|
94 |
|
|
schreiben
|
95 |
|
|
- das vom MIG generierte UCF muss auf die
|
96 |
|
|
Pinbelegung vom Spartan-3A Board angepasst
|
97 |
|
|
werden
|
98 |
|
|
- aus dem Grund habe ich das UCF-File
|
99 |
|
|
aus dem Xilinx-Example für Spartan-3A Boards
|
100 |
|
|
benutzt und für das Projekt angepasst
|
101 |
|
|
das DDR2-Example bekommt man durch einen Link
|
102 |
|
|
vom MIG -> "Xilinx Reference Boards" unter
|
103 |
|
|
"http://www.xilinx.com/products/boards/s3astarter/reference_designs.htm"
|
104 |
|
|
der Name ist "DDR2 MIG Reference Design"
|
105 |
|
|
|
106 |
|
|
|
107 |
|
|
Beschreibung der Funktion :
|
108 |
|
|
============================
|
109 |
|
|
|
110 |
|
|
> der Schalter-0 (SW0) dient als Reset-Schalter (High = Reset)
|
111 |
|
|
|
112 |
|
|
> das "TOP_Modul" routet alle Signale zwischen den Modulen
|
113 |
|
|
|
114 |
|
|
> die "Buttons_VHDL" dient nur zum entprellen der Tasten und zum erzeugen
|
115 |
|
|
eines "On-Click-Events" damit die Read/Write-Funktionen nur
|
116 |
|
|
einmal gestartet werden
|
117 |
|
|
|
118 |
|
|
> das "DDR2_Control" enthaellt eine State-Machine mit folgenden Funktionen :
|
119 |
|
|
|
120 |
|
|
1. Initialisieren vom DDR2-RAM
|
121 |
|
|
2. Beschreiben des DDR2-RAM mit 16 Datenwerten (mit je 64Bit breite)
|
122 |
|
|
3. Auslesen des ersten Datenwertes
|
123 |
|
|
4. Warten auf Tasteneingaben
|
124 |
|
|
|
125 |
|
|
5a. Bei Taste 1 (North) -> erhoehen des Adresszeigers (ROW) um 1
|
126 |
|
|
5b. Bei Taste 2 (South) -> veringern des Adresszeigers (ROW) um 1
|
127 |
|
|
5c. Bei Taste 3 (West) -> schreiben eines einzelnen (fixen) Datenwertes in die aktuelle Adresse
|
128 |
|
|
5d. Bei Taste 4 (East) -> lesen eines einzelnen Datenwertes aus der aktuellen Adresse
|
129 |
|
|
|
130 |
|
|
> das "DDR2_Control" uebernimmt auch die Aufbereitung fuer die Anzeige :
|
131 |
|
|
|
132 |
|
|
- SW1 bis SW3 dient zum auswählen eines der 8 Bytewerten des 64Bit breiten Datenwortes
|
133 |
|
|
|
134 |
|
|
SW3=0 + SW2=0 + SW1=0 -> Anzeige von Datenbits (D7...D0)
|
135 |
|
|
SW3=0 + SW2=0 + SW1=1 -> Anzeige von Datenbits (D15...D8)
|
136 |
|
|
SW3=0 + SW2=1 + SW1=0 -> Anzeige von Datenbits (D23...D16)
|
137 |
|
|
SW3=0 + SW2=1 + SW1=1 -> Anzeige von Datenbits (D31...D24)
|
138 |
|
|
SW3=1 + SW2=0 + SW1=0 -> Anzeige von Datenbits (D39...D32)
|
139 |
|
|
SW3=1 + SW2=0 + SW1=1 -> Anzeige von Datenbits (D47...D40)
|
140 |
|
|
SW3=1 + SW2=1 + SW1=0 -> Anzeige von Datenbits (D55...D48)
|
141 |
|
|
SW3=1 + SW2=1 + SW1=1 -> Anzeige von Datenbits (D63...D56)
|
142 |
|
|
|
143 |
|
|
das ausgewählte Byte wird an den 8 LEDs angezeigt
|
144 |
|
|
|
145 |
|
|
> das "DDR2_Read" enthaellt eine State-Machine um ein Datenwort (64Bit)
|
146 |
|
|
aus dem RAM zu lesen
|
147 |
|
|
|
148 |
|
|
> das "DDR2_Write" enthaellt eine State-Machine um ein Datenwort (64Bit)
|
149 |
|
|
ins RAM zu schreiben
|
150 |
|
|
|
151 |
|
|
|
152 |
|
|
Ram Inhalt nach dem Initialisieren :
|
153 |
|
|
=====================================
|
154 |
|
|
|
155 |
|
|
> nach der Init-Funktion stehen 16 Datenwerte (je 64Bit) im RAM
|
156 |
|
|
|
157 |
|
|
ADR 0 = 0123456789ABCDEF
|
158 |
|
|
ADR 1 = 123456789ABCDEF0
|
159 |
|
|
ADR 2 = 23456789ABCDEF01
|
160 |
|
|
ADR 3 = 3456789ABCDEF012
|
161 |
|
|
ADR 4 = 456789ABCDEF0123
|
162 |
|
|
ADR 5 = 56789ABCDEF01234
|
163 |
|
|
ADR 6 bis ADR 15 = 639CC6398C7318E7
|
164 |
|
|
|
165 |
|
|
|
166 |
|
|
Ablauf :
|
167 |
|
|
=========
|
168 |
|
|
|
169 |
|
|
|
170 |
|
|
> nach dem Init und Schreiben von 16 Werten wird die Adr 0 ausgelesen
|
171 |
|
|
und an den LEDs ausgegeben
|
172 |
|
|
|
173 |
|
|
> Mit dem Button North und South kann der ADR-Counter verändert werden
|
174 |
|
|
|
175 |
|
|
> Button EAST liest das RAM an der aktuellen Adresse aus
|
176 |
|
|
|
177 |
|
|
> Button WEST schreibt den 64Bit-Wert "31CE629DC43B8877" in die aktuelle Adresse
|
178 |
|
|
|
179 |
|
|
|
180 |
|
|
|
181 |
|
|
Infos zum RAM :
|
182 |
|
|
================
|
183 |
|
|
|
184 |
|
|
> das DDR2-RAM auf dem Spartan-3A Board hat eine groesse von 512MBit (64MByte)
|
185 |
|
|
|
186 |
|
|
> das RAM ist in 4 Bloecke (BANKs) unterteilt,
|
187 |
|
|
jeder Block ist in 8192 Reihen (ROWs) und 1024 Zeilen (COLs) aufgeteilt
|
188 |
|
|
eine einzelne Zelle ist 16bit breit
|
189 |
|
|
|
190 |
|
|
das Ergibt 4x8192x1024x16bit = 512MBit
|
191 |
|
|
|
192 |
|
|
> fuer die BANK_Adresse werden 2Bit benoetigt
|
193 |
|
|
fuer die ROW_Adresse werden 13Bit benoetigt
|
194 |
|
|
fuer die COL_Adresse werden 10Bit benoetigt
|
195 |
|
|
|
196 |
|
|
> der Adresszeiger fuer eine einzelne Zelle setzt sich so zusammen :
|
197 |
|
|
|
198 |
|
|
ADR = ROW & COL & BANK
|
199 |
|
|
|
200 |
|
|
damit ist der Adresszeiger 13+10+2 = 25bit breit
|
201 |
|
|
|
202 |
|
|
|
203 |
|
|
Einschraenkungen in dem Projekt :
|
204 |
|
|
==================================
|
205 |
|
|
|
206 |
|
|
> VORSICHT !! der BURST-MODE ist fest auf "4" eingestellt,
|
207 |
|
|
damit werden bei jedem Write Zyklus
|
208 |
|
|
4 Zellen (also 4x16Bit=64Bit) beschrieben !!
|
209 |
|
|
|
210 |
|
|
> damit keine Daten überschrieben werden, muss
|
211 |
|
|
der COL-Pointer immer in 4er Schritten erhöht/verringert werden
|
212 |
|
|
(0,4,8,12 usw)
|
213 |
|
|
|
214 |
|
|
|
215 |
|
|
Geschwindigkeit :
|
216 |
|
|
==================
|
217 |
|
|
|
218 |
|
|
> bei einer Speedmessung (per VHDL-Code) wurde
|
219 |
|
|
die Anzahl der notwendigen Clockzyklen ermittelt
|
220 |
|
|
|
221 |
|
|
> Read (von einem 64Bit Wert) = 22 Clockzyklen
|
222 |
|
|
(bei 133MHz -> 165 ns => 46 MByte/sec)
|
223 |
|
|
|
224 |
|
|
> Write (von einem 64Bit Wert) = 25 Clockzyklen
|
225 |
|
|
(bei 133MHz -> 188 ns => 40 MByte/sec)
|
226 |
|
|
|
227 |
|
|
|
228 |
|
|
Hinweise :
|
229 |
|
|
===========
|
230 |
|
|
|
231 |
|
|
> das Projekt ist von "privat" und nicht fuer
|
232 |
|
|
kommerzielle Zwecke gedacht
|
233 |
|
|
|
234 |
|
|
> das Projekt ist nicht frei von Fehlern
|
235 |
|
|
und ich kann daher keine Garantie
|
236 |
|
|
fuer eventuell auftretende Schaeden geben
|
237 |
|
|
|
238 |
|
|
> das Projekt ist frei kopier- und verwendbar
|
239 |
|
|
|
240 |
|
|
> bei gefundenen Fehlern bitte eine EMail an mich
|
241 |
|
|
|
242 |
|
|
|
243 |
|
|
|
244 |
|
|
08.08.11 / UB
|
245 |
|
|
|