Forum: FPGA, VHDL & Co. FPGA Ausgänge synchron/zeitlich schalten


von KDC666 (Gast)


Lesenswert?

Moin,

ich hab ein kleines Problem. Ich möchte auf einem Xilinx FPGA 
(Spartan3/6, steht noch nicht ganz fest) folgendes Implementieren:

Mehrere Ausgänge, die Synchron, also ohne/minimalem Delay geschaltet 
werden. Das System läuft mit einem 200 MHz Clock.
D. h. ich habe 5 Signale, die alle zeitlich vom 1 auf 0 geschaltet 
werden sollen. Das ganze soll dann auch noch so gestaltet werden, dass 
ein Delay von x-Takten zwischen den Signalen eingefügt werden kann.
Soweit so gut, das ganze ist halt mit Zählern Implementiert, da es wie 
gesagt ein Delay (aber auch eine bestimmte Breite) für die Pulse geben 
soll.

Alles auch soweit kein Problem. Allerdings habe ich teilweise 1-2 ns 
Delay zwischen zwei Signalen (ungewollt, also wenn die Pulse im gleichen 
Takt kommen sollen). Ich habe dann mit dem Floorplanner rumgespielt und 
habs dann auch hinbekommen, dass der Versatz nur noch ca. 100 ps beträgt 
(das wäre okay). Allerdings eher durch ausprobieren.

U. a. habe ich bei den constraints (Pins) IOB=TRUE genutzt und die 
einzelnen Elemente (Zähler und restliche Logik) für jeden Ausgang 
möglichst gleich angeordnet, das ganze möglichst nahe am entsprechenden 
Ausgang. Leichtes verschieben der Logik im FPGA ändert allerdings recht 
schnell das ganze Verhalten.

Das ganze ist mir irgendwie zu willkürlich. Zugegebener Maßen fehlt mir 
an der Stelle einiges an Hintergrundwissen. Meine eigentliche Frage ist 
auch eher, ist das prinzipiel für mein Problem das richtige Vorgehen 
(Floorplanning) und falls nein, was dann?

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo,

der Spartan6 hat ein iodelay2. Damit kann bei Eingängen eine variable 
Signalverzögerung und für Ausgänge eine feste Signalverzögerung 
einstellen.

http://www.xilinx.com/support/documentation/sw_manuals/xilinx12_1/spartan6_hdl.pdf

Tom

von KDC666 (Gast)


Lesenswert?

Danke, klingt doch gut. Meine das schonmal gehört zu haben bei einem 
älteren Spartan. Allerdings hatte ich dann gelesen, dass das nur die 
Eingänge betrifft. Kann das sein?

Beim Spartan6 gehts ja auf jeden Fall auch für Ausgänge, das teste ich 
mal aus. Wäre auf jeden Fall wenns so geht nen gutes Argument für den 
6er ;-)

von Christian R. (supachris)


Lesenswert?

Vorsicht, die IODELAY am Spartan 6 sind nicht kalibriert und auch nicht 
temperaturstabil. Da musst du genau aufpassen, ob das dann auch passt.
1
Different from the Virtex-5 FPGA structures, the
2
Spartan-6 FPGA delay is not compensated for either temperature or voltage, though there
3
are mechanisms that allow the user to accurately calibrate the delay on an on-going basis.

von KDC666 (Gast)


Lesenswert?

Hmmm, klingt gefährlich und ist dann wahrscheinlich schon ein 
Ausschluss-Kriterium. Ausprobieren werde ich es aber trotzdem.

von Klaus F. (kfalser)


Lesenswert?

Ich denke der sicherste Weg sollte die Verwendung der FFs in den IO 
Blöcken sein.
Die Ausgangsignale werden mit dem gemeinsamen Takt in den IOBs nochmal 
abgetaktet, damit sind sie alle "synchron" (was immer man darunter 
versteht, aber in jedem Fall in der Größenordung von 100 ps).
Die Routing-Delays von intern zu den IOBs spielen dann keine Rolle mehr.

von KDC666 (Gast)


Lesenswert?

Wenn ich mich nicht täusche macht IOB = TRUE doch genau das, oder? Also 
im .ucf file z. B.

INST "OUT1_O" IOB = TRUE;

oder?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Ich denke der sicherste Weg sollte die Verwendung der FFs in den IO
> Blöcken sein.
Das würde ich auch sagen. "Synchroner" und vor allem reproduzierbarer 
geht es auf jeden mit Floorplan-Tricksereien nicht.

> Wenn ich mich nicht täusche macht IOB = TRUE doch genau das, oder?
Nur, wenn dein Design das hergibt, und tatsächlich ein FF (und nicht 
eine logische Verknüpfung wie z.B. ein Mux) auf den Ausgang geht. Aber 
das kann man nur an deinem Code sehen. Evtl. mußt du nochmal alle 
betroffenen Ausgangssignale über Register leiten...

von KDC666 (Gast)


Lesenswert?

Hatte ich eigentlich beides gemacht, ich schau mir auch das nochmal 
genau an. Danke.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> U. a. habe ich bei den constraints (Pins) IOB=TRUE genutzt
Aus 
http://www.xilinx.com/itp/xilinx7/books/data/docs/cgd/cgd0106_67.html
1
The IOB constraint, when associated with a flip-flop or latch, tells the 
2
mapper to pack that instance into an IOB type component if possible.
Dieses Constraint kannst du nicht einfach so auf Pins anwenden, sondern 
nur auf FFs, die dann in den Pintreibern lokalisiert werden.

von KDC666 (Gast)


Lesenswert?

Ja, scheint so hin zu hauen, danke!

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.