Forum: FPGA, VHDL & Co. Warum überhaupt DDR-Zellen?


von FPGA-Sultan (Gast)


Lesenswert?

Ich schreibe den Beitrag, weil ich inzwischen ein grundsätzliches 
Verständnisproblem habe:

Hier Beitrag "doppelt schnell synchronisieren" haben wir über 
Synchronsiation mit DDR-Zellen am Ausgang gesprochen. Bislang war mit 
das nur bekannt, daß man die nutzen kann/muss, um z.B. einen Takt 
rauszugeben.

Nun habe ich aber mal testweise keine Zellen verwendet und komme (mit 
einer Warning) trotzdem hin: Systemtakt raus und es klappt! Wieso 
brauche ich jetzt noch die DDR-Zellen?

Und wie verhält sich das mit der Verdrahtung? Die Zellen am Ausgang 
eines Pins brauchen ja bei Nutzung einer DDR-Zelle ein Clocknetz an der 
Zelle. Wie geht es dann in Richtung Pin ?

Ich hatte mir überlegt, gleich das Clocknetz über einen Buffer 
rauszugeben, der im Pin sitzt.

von Roger S. (edge)


Lesenswert?

Der Haupteinsaztzweck der DDR IOs ist zum anbinden von DDR(2)-SDRAM. Und 
nicht fuer den Takt sondern den Daten, da die ja eben bei positiver und 
negativer Taktflanke wechseln -> ergo doppelte Datenrate.
Macht ja sonst keinen Sinn.

von Morin (Gast)


Lesenswert?

Die DDR-Zellen bekommen das DDR-Timing garantiert und ohne großen 
Aufwand richtig hin. Bei "selbstgebautem" DDR müsstest du die beiden 
Pfade einzeln verfolgen und sicherstellen, dass alles wasserdicht ist.

Ansonsten: Klar geht es sicher auch anders, aber warum? Genauso wie du 
wissen willst, warum man DDR-Zellen dafür nimmt, könnte ich fragen, 
warum man Logikzellen nehmen sollte. Und letztere sind nicht mal für 
DDR-Behandlung gedacht.

von Da M. (damicha)


Lesenswert?

Hallo.

Xilinx empfiehlt einen Takt über Pins im DDR Mode auszugeben. Hierbei 
wird der Takt an das Register in dem Outputbuffer des Pins 
angeschlossen. Die beiden Dateneingänge des DDR Registers werden mit 1 
und 0 belegt. Bei einer steigenden Taktflanke wird am Buffer 1 und bei 
einer fallende 0 ausgegeben.
Der Vorteil ist, dass das Taktnetzwerk an einem Takteingang eines 
Registers endet und dass der Ausgang des Outputbuffers von einem 
Register getrieben wird. Das beides zusammen garantiert eine minimale 
Verzögerungszeit für die Flanken des Taktsignal. Die Verzögerung liegt 
vielleicht so 1 bis 2ns für nen Virtex 4/5.
Gibt man zusätzlich zum Takt auch Daten aus, die idealer Weise auch von 
den Registern der IOBs gebuffert werden, so sind Takt und Daten an den 
Pins synchron zueinander.

Gruß DaMicha.

von FPGA-Sultan (Gast)


Lesenswert?

So hatte ich mir das auch überlegt, weil der interne Takt ja schneller 
ist und früher käme, als die Daten aus den zugehörigen Registern.

>Xilinx empfiehlt ...
Das ist aber deshalb kein Xilinx-spezifisches Problem, oder?

von Fragi (Gast)


Lesenswert?

Wie instanziiert man DDR2-Zellen bei Xilinx? ich kenne es nur vom 
Megawizzard bei Altera, der eine Zelle bereitstellt. Beim CoreGen finde 
ich aber nichts.

Ich denke, dass es eine Buffer-Primtivie ist, habe aber die Hilfen und 
Dokumente ergebnislos durchsucht, wie schon so oft bei Xilinx.

Wo könnte man da was finden?

von Thorsten S. (thosch)


Lesenswert?

Fragi schrieb:
> Wie instanziiert man DDR2-Zellen bei Xilinx? ich kenne es nur vom
> Megawizzard bei Altera, der eine Zelle bereitstellt. Beim CoreGen finde
> ich aber nichts.

CoreGen ist ja auch die völlig falsche Stelle.
Hier geht es um ein FlipFlop-Primitiv der IO-Zellen, namens ODDR2.

Schau einfach im LibrariesGuide der entsprechenden FPGA-Familie nach, da 
ist das beschrieben. Inclusive einem Template für die Instanziierung,
hier z.B. aus dem Spartan-6 Libraries Guide for HDL Designs
(Dokument UG615):
1
Library UNISIM;
2
use UNISIM.vcomponents.all;
3
-- ODDR2: Output Double Data Rate Output Register with Set, Reset
4
-- and Clock Enable.
5
-- Spartan-6
6
-- Xilinx HDL Libraries Guide, version 13.4
7
ODDR2_inst : ODDR2
8
generic map(
9
DDR_ALIGNMENT => "NONE", -- Sets output alignment to "NONE", "C0", "C1"
10
INIT => '0', -- Sets initial state of the Q output to '0' or '1'
11
SRTYPE => "SYNC") -- Specifies "SYNC" or "ASYNC" set/reset
12
port map (
13
Q => Q, -- 1-bit output data
14
C0 => C0, -- 1-bit clock input
15
C1 => C1, -- 1-bit clock input
16
CE => CE, -- 1-bit clock enable input
17
D0 => D0, -- 1-bit data input (associated with C0)
18
D1 => D1, -- 1-bit data input (associated with C1)
19
R => R, -- 1-bit reset input
20
S => S -- 1-bit set input
21
);
22
-- End of ODDR2_inst instantiation


> Ich denke, dass es eine Buffer-Primtivie ist, habe aber die Hilfen und
> Dokumente ergebnislos durchsucht, wie schon so oft bei Xilinx.

Es ist ein Flip-Flop Primitiv. Kein Buffer.
Wenn es um (wie Du schon richtig vermutetest) Primitiva geht, stets das 
zum benutzten FPGA passende "Libraries Guide" durchsuchen.
Eine einfache Suche darin nach dem Begriff "DDR Flip-Flop" führt direkt 
zu den Primitiva IDDR2 und ODDR2. Selbst eine Suche nach "DDR" braucht 
nur wenige Mausklicks mehr...

BTW: Du weißt schon, daß Xilinx einen globalen Suchindex mitliefert, mit 
dem sich in sämtlichen PDF-Dokumenten, die die ISE-Installation 
mitbringt, dokumentübergreifend suchen läßt?
Muß man nur im Adobe-Reader eintragen...

Gruß,
Thorsten

von Fragi (Gast)


Lesenswert?

Ich habe jetzt selber die LIB durchsucht und bin auf den hier gekommen:
"OFDDRRSE". Die Instanz sieht änhlich aus, wie oben.

Einen "ODDR2" gibt es da nicht.

Thorsten S. schrieb:
> Eine einfache Suche darin nach dem Begriff "DDR Flip-Flop" führt direkt
> zu den Primitiva IDDR2 und ODDR2

Ich habe nach DDR FF gesucht und auch Flip Flop, bei mir findet die 
Suche nichts. Welches Dokument benutzt du?

Thorsten S. schrieb:
> BTW: Du weißt schon, daß Xilinx einen globalen Suchindex mitliefert
Wo und wie?

Ich habe den Xilinx Documentmanager und auch die Hilfe konsultiert. Wenn 
man mal bei ISE (14.1) search oder den index nutzt, ist unter DDR2 weit 
und breit nichts zu finden, jedenfalls kein FF.

von Thorsten S. (thosch)


Lesenswert?

Fragi schrieb:
> Ich habe jetzt selber die LIB durchsucht und bin auf den hier gekommen:
> "OFDDRRSE". Die Instanz sieht änhlich aus, wie oben.
Ok, Du benutzt offenbar einen Spartan-3 oder etwas aus vergleichbarer 
Generation...
Da gibts kein ODDR2 sondern verschiedene OFDDRxxxx

In neuern Xilinx FPGAs gibts stattdessen ODDR2.
Ich bezog mich (wie übrigens bereits im letzten Post erwähnt) auf 
Spartan-6


> Ich habe nach DDR FF gesucht und auch Flip Flop, bei mir findet die
> Suche nichts. Welches Dokument benutzt du?
Ok. Wenn eine Suche gar nix liefert, ist ein Hauch Kreativität gefragt.
Normalerweise erstmal, indem man den Suchbegriff abspeckt.
Mit Suche nach "DDR" hast Du ja die entsprechenden Teile gefunden.


> Thorsten S. schrieb:
>> BTW: Du weißt schon, daß Xilinx einen globalen Suchindex mitliefert
> Wo und wie?

Den Suchindex installiert die ISE normalerweise unter
[Xilinx-Dir]\ISE_DS\ISE\doc\usenglish\isehelp\search

dort liegt eine *collection.pdx* zum Installieren im Adobe-Reader
und der eigentliche Index in einem Unterverzeichnis.

Im Adobe-Reader öffnest Du die Erweiterte Suche (mit Klick auf den 
Fernglas-Button). Im dann offenen Suchfenster wählst Du zuerst unten 
"Mehr Optionen anzeigen"  und dann unter "Suchen in:".
Dort wählst Du "Index auswählen...", woraufhin sich ein Fenster 
Indexauswahl öffnet.
Dort klickst Du rechts auf den Button "Hinzufügen" und wählst dann dort 
die Datei *collection.pdx* in dem oben genannten Pfad aus.
Der Index steht jetzt im Adobe-Reader zur Verfügung.

Danach kannst Du in der erweiterten Suche den Index als Punkt unter "Was 
soll durchsucht werden?" auswählen.

Um einmalig im Index zu suchen reicht auch ein Doppelklick auf 
*collection.pdx* im Explorer. (oder auf eine auf den Desktop gelegte 
Verknüpfung darauf).

OK, wie ich soeben feststelle, hat Xilinx den Index anscheinend 
abgespeckt... Die ISE_13.1 enthielt noch die Libraries Guides sämtlicher 
aktueller Familien, bei ISE_13.4 fehlen die Libraries Guides und der 
Index ist nur noch 1/4 so groß wie bei der 13.1

Die Umstellung auf 14.1 hab ich mir allerdings noch nicht angetan. Kann 
also nichts dazu sagen, wie umfangreich die mitgelieferten PDF-Dokus 
noch sind.

Befürchte allerdings, daß Xilinx den Umfang der mit dem Installer 
mitgelieferten PDFs reduziert hat, um die Größe zu verringern...
Aber die aktuellen Versionen passen eh auf keine DVD mehr, also was soll 
der Geiz. ;-)

Schade eigentlich...




Zurück zum Thema: Ich kann Dir nur raten, Dich mit der Architektur des 
von Dir benutzten bzw. zu benutzenden FPGAs intensiv zu beschäftigen.
D.h. sämtliche UserGuides und das Datenblatt lesen und verstehen.
In den UserGuides sind alle Ressourcen des FPGAs beschrieben.
Infos zu den I/O-Zellen und ihren Möglichkeiten findest Du im 
entsprechenden UserGuide unter dem Stichwort IOB bzw. Select I/O.

Wie man bestimmte Ressourcen korrekt benutzt, initialisiert usw. steht 
alles in den User Guides. (bei älteren FPGA-Familien gibts nur eins, bei 
neueren ist das aufgespalten worden auf die einzelnen Ressourcen...)
Wenn es dann um konkrete Fragen der Instanziierung geht -> Nachschlagen 
im Libraries Guide.

Hatte bislang nie Probleme, die benötigten Informationen so zu finden.

Gruß,
Thorsten

von Fragi (Gast)


Lesenswert?

Thorsten S. schrieb:
> Mit Suche nach "DDR" hast Du ja die entsprechenden Teile gefunden.

nö, "DDR" liefert fast nichts.

Thorsten S. schrieb:
> Den Suchindex installiert die ISE normalerweise unter
>
> [Xilinx-Dir]\ISE_DS\ISE\doc\usenglish\isehelp\search
>
>
>
> dort liegt eine *collection.pdx* zum Installieren im Adobe-Reader
>
> und der eigentliche Index in einem Unterverzeichnis.

DAS! ist mal ein Tipp, werde ich versuchen.


Noch eine Frage:

>C0 => C0, -- 1-bit clock input
>C1 => C1, -- 1-bit clock input

ich habe an c1 den negierten Takt angelegt. Das will er nicht, sondern 
empfiehlt, einen buffer zu nehmen.

Ich denke, es ist besser, ich lasse mir aus der DCM noch einen negierten 
Takt geben, oder?

Ich finde das bei Xilinx extrem lästig und kompliziert, sowohl die 
Suche, als auch das Designen. Bei Altera braucht es keinen zweiten Takt.

von Christian R. (supachris)


Lesenswert?

FPGA-Sultan schrieb im Beitrag #871453:
> Nun habe ich aber mal testweise keine Zellen verwendet und komme (mit
> einer Warning) trotzdem hin: Systemtakt raus und es klappt! Wieso
> brauche ich jetzt noch die DDR-Zellen?

Wenn du die Warnung richtig liest, merkst du sogar, dass dann das 
gesamte Taktnetz nicht mehr sinnvoll geroutet werden kann, denn um auf 
den IO-Pin direkt zu kommen, muss der gesamte Takt in ein langsames 
Logik-Netz verlegt werden. Daher die Sache mit dem ODDR.

Fragi schrieb:
> Ich finde das bei Xilinx extrem lästig und kompliziert, sowohl die
> Suche, als auch das Designen. Bei Altera braucht es keinen zweiten Takt.

KOmmt drauf an welchen FPGA man nimmt. Der ODDR am Virtex 4 braucht auch 
keinen 2. Takt. Generierung mit DCM ist im Zweifelsfall besser, es geht 
aber (zumindest Beim Spartan 3e, 6...) auch mit einer einfachen 
Negierung des CLK-Signals. Laut User Guide wird dann der auf dem IOB 
befindliche Clock-Inverter genutzt (der auch für falling_edge genommen 
werden kann), das schadet dem Clock-Netz nicht.

Solche Sachen lernt man halt erst mit der Zeit, gerade solche 
Spezialitäten sind ja wirklich bei jedem Hersteller anders.
Und die Bedienbarkeit...nunja, da kann Xilinx wirklich noch einiges 
verbessern. Ich arbeite sehr viel mit Eclipse und Veditor mittlerweile, 
nach dem Aufsetzen des Projektes lasse ich das meistens über die Command 
Line Tools generieren.

von Duke Scarring (Gast)


Lesenswert?

Fragi schrieb:
>> Den Suchindex installiert die ISE normalerweise unter
[...]
>>
>> dort liegt eine *collection.pdx* zum Installieren im Adobe-Reader
>> und der eigentliche Index in einem Unterverzeichnis.
> DAS! ist mal ein Tipp, werde ich versuchen.

Es gibt inzwischen ein eigenes Programm/Tool für die Dokumentation:
Xilinx Documentation Navigator (DocNav) [1]

Es benötigt Adobe Air und ist leider nur für Windows.
Insgesamt macht es einen ganz brauchbaren Eindruck, wenn man sich 
erstmal mit der Bedienung etwas angefeundet hat.

Duke

[1] 
http://www.xilinx.com/support/documentation/navigator/xilinxdocnav_win.zip

von Fragi (Gast)


Lesenswert?

Es geht weder des eine noch das andere. Ich bekomme einen Mapping error, 
wenn ich aus der DCM den 180 Grad Takt entnehmen will.

von Christian R. (supachris)


Lesenswert?

Dann sind vielleicht alle internen Taktnetze bzw. BUFG-Netze schon 
verbraucht. Wie viele Takte hast du denn in deinem Design, und was ist 
die Meldung aus dem Mapper?

von Fragi (Gast)


Lesenswert?

Er hat wohl insgesamt ein Grossenproblem. Die BRAMs werden nicht 
gemappt.

Wenn ich z.B. ein Register-RAM weglasse oder den ChipsScope verkleinere, 
mappt er es: Das Design läuft durch. Ich habe nur noch keine praktisch 
Bestätigung der ODDR2-Funktion, kann da momentan nichts messen. Die 
Takte kommen aber wohl in 180 Grad, wie ich im Chips Scope sehe, sollte 
also gehen.

Verwunderlich ist für mich nur, dass nun, durch die Hinzunahme des 
zusätzlichen Taktes in Verbindung mit dem DDR, das Design aufgrund der 
BRAMs übermapped sein sollen.

Das war ohne das DDR und den Takt nicht der Fall. Seltsam!

Ich habe jetzt übrigens ein "ODDR2" genommen und nicht das OFDDRRSE, das 
ich zunächst gefunden habe, scheint aber keinen Unterschied zu machen.

von Christian R. (supachris)


Lesenswert?

Was sagt denn die Simulation? Vielleicht liegts einfach an den 
ausgehenden Routing-Ressourcen, dann solltest du vielleicht lieber den 
lokalen Inveter für den 180° Takt nutzen.

von Fragi (Gast)


Lesenswert?

Ich danke Dir schon mal herzlich. für Deine Mühe.

Es scheint eine qualitative Auslastung des Chips zu sein, ein bissl das 
falsche Signal ins ChipsScope und es geht nichts mehr. Ich sample dort 
u.a. externe Daten einer anderen Domain ab, gfs ist es das.

Keine Ahnung!

Christian R. schrieb:
> Was sagt denn die Simulation? Vielleicht liegts einfach an den
>
> ausgehenden Routing-Ressourcen, dann solltest du vielleicht lieber den
>
> lokalen Inveter für den 180° Takt nutzen.Beitrag melden Bearbeiten Löschen

die Simulation is bestens

den lokalen Inverster würde ich nehmen, weiss aber nicht, wie ich das 
buffern soll. Ich meinte eigentlich,dass ich einen BUFG nehmen müsste, 
aber es haut nicht hin.

Brauche ich zwei? Einen vor und einen hinter dem Inverter? Das MAPing 
sagt (wie erwartet), ich darf mit dem Takt keine direkte Logik treiben 
(den inverter).

von Christian R. (supachris)


Lesenswert?

Fragi schrieb:
> den lokalen Inverster würde ich nehmen, weiss aber nicht, wie ich das
> buffern soll. Ich meinte eigentlich,dass ich einen BUFG nehmen müsste,
> aber es haut nicht hin.

Um welches FPGA gehts denn bri dir jetzt? Irgendwie ist das hir langsam 
etwas durcheinander. Beim Spartan 3e kann man zumindest einfach den Takt 
über "not" negieren und an C1 anschließen. Da braucht man weder davor 
noch dahinter einen Buffer. Siehe UG331, Seite 116 und dann nochmal auf 
Seite 328 ff. Da steht dass es geht, aber eben Verzerrungen geben kann, 
wenn der Takt hoch ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.