Forum: FPGA, VHDL & Co. ext. Datensignal mit ext. Clk richtig einlesen (Constraints)


von FPGA (Gast)


Angehängte Dateien:

Lesenswert?

Ausgangslage:

Verwendeter FPGA: VIRTEX 5
Verwendete Software: ISE

Ziel:

Ein Datensignal mit einer Breite von 7 Bit (LVDS) liegt am FPGA an. 
Synchron zu diesem Datensignal liegt ein Clocksignal an einem Global 
Clock Pin des FPGA an.  Es werden sowohl bei der steigenden als auch der 
fallenden Flanke des Clk-Signals Daten übernommen. Bei der steigenden 
Flanke werden die Even-Bits und bei der fallenden Flanke die Odd-Bits 
eingelesen und zu einem 14-Bit Wert zusammengesetzt. Ich mache das über 
zwei Prozesse. Ein Prozess für die steigende und einer für die fallende 
Flanke.

Geschwindigkeit:
Das Clocksignal hat eine Frequenz von 100 MHz (das heißt es werden alle 
5ns jeweils 7 Bits eingelesen)

Mein Vorgehen: Das Clocksignal wird über einen IBUFGDS eingespeist und 
das Datensignal über 7X IBUFDS.

Jetzt ist meine Frage wie ich die Constraints setzen muss, damit das 
Timing passt. Ich habe mir hierzu das  Timing Constraints User Guide 
hergenommen und entsprechend dem Beispiel von Seite 12 Constraints 
formuliert:

NET "SysCLk" TNM_NET = "SysClk";
TIMESPEC "TS_SysClk" = PERIOD "SysClk" 10 ns HIGH 50%;
OFFSET = IN 2.5 ns VALID 5 ns BEFORE "SysClk" RISING;
OFFSET = IN 2.5 ns VALID 5 ns BEFORE "SysClk" FALLING;

Ist das so korrekt? Muss ich die Dateneingangssignale nicht irgendwo 
noch angeben?
Ich bin für Hinweise bezüglich der Richtigkeit meiner Gedankengänge 
dankbar. Habe ich etwas übersehen? Bin ich irgendwo auf dem Holzweg?

Hier das Manual
http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_1/ug612.pdf

von Christian R. (supachris)


Lesenswert?

FPGA schrieb im Beitrag #3835861:
> Ich mache das über
> zwei Prozesse. Ein Prozess für die steigende und einer für die fallende
> Flanke.

Hat dein FPGA keine IDDR Register? Sowas ist doch total unsauber. 
IDDR(2) haben doch mittlerweile alle halbwegs aktuellen Xilinx FPGA.

FPGA schrieb im Beitrag #3835861:
> Ist das so korrekt? Muss ich die Dateneingangssignale nicht irgendwo
> noch angeben?

Klar musst du das Constraint auch an die Datensignale hängen:

http://www.xilinx.com/support/documentation/white_papers/wp237.pdf

von FPGA (Gast)


Lesenswert?

> Hat dein FPGA keine IDDR Register? Sowas ist doch total unsauber.
> IDDR(2) haben doch mittlerweile alle halbwegs aktuellen Xilinx FPGA.

Dachte mir schon, dass es eleganter gehen muss. Ich schau mir das mal 
an.

> Klar musst du das Constraint auch an die Datensignale hängen:

In dem Example fehlt das jedoch und da steht:

----------------------
For this example, the complete OFFSET IN specification with associated 
PERIOD
constraint is:

NET "SysCLk" TNM_NET = "SysClk";
TIMESPEC "TS_SysClk" = PERIOD "SysClk" 5 ns HIGH 50%;
OFFSET = IN 1.25 ns VALID 2.5 ns BEFORE "SysClk" RISING;
OFFSET = IN 1.25 ns VALID 2.5 ns BEFORE "SysClk" FALLING;

This global constraint covers both the data bits of the bus
----------------------

Da ist nirgendwo die Rede davon, dass man die Datensignale noch mit 
angeben muss. Habe ich da was falsch interpretiert? Sorry ich bin da 
noch relativ neu im Thema Constraints.

Danke schonmal!

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


Lesenswert?

FPGA schrieb im Beitrag #3836011:
> Da ist nirgendwo die Rede davon, dass man die Datensignale noch mit
> angeben muss.
Dieses Constraint betrifft alle Signale, die mit Sys_clk getaktet 
werden.

von FPGA (Gast)


Lesenswert?

Lothar Miller schrieb:
> FPGA schrieb im Beitrag #3836011:
>> Da ist nirgendwo die Rede davon, dass man die Datensignale noch mit
>> angeben muss.
> Dieses Constraint betrifft alle Signale, die mit Sys_clk getaktet
> werden.

Hallo Lothar,
Danke für die Rückmeldung,

genau das habe ich mir gedacht. Wenn ich nun will, dass es nicht global, 
sondern nur für ausgewählte Datensignale gilt, muss ich es dann so 
formulieren?

NET "SysCLk" TNM_NET = "SysClk";
TIMESPEC "TS_SysClk" = PERIOD "SysClk" 5 ns HIGH 50%;
OFFSET Datensignal = IN 1.25 ns VALID 2.5 ns BEFORE "SysClk" RISING;
OFFSET Datensignal = IN 1.25 ns VALID 2.5 ns BEFORE "SysClk" FALLING;

von Christian R. (supachris)


Lesenswert?

Für sowas nimmt man dann so eine TIMEGRP Gruppe und hängt die an die 
Einzelsignale.

von FPGA (Gast)


Lesenswert?

Hallo Christian,

danke für deine Rückmeldungen. Ich habe noch eine Frage zu den 
IDDR-Registern. Ich bin grade dabei das zu implementieren. Es gibt da 3 
Modi:

- OPPOSITE_EDGE
- SAME_EDGE
- SAME_EDGE_PIPELINED

Die unterschiede im Timing sind mir klar. Geht aus dem User Guide auf 
Seite 320 hervor. Allerdings bin ich mir nicht ganz sicher was da die 
vor und Nachteile sind. Ich nehme an SAME_EDGE_PIPELINED wird schneller 
sein (Pipline) als die anderen beiden Modi. Im Prinzip passt 
OPPOSITE_EDGE in mein Konzept. Rein aus Neugier wüsste ich jedoch gerne 
wann man die anderen beiden Modi nutzt.

Danke und Gruß
FPGA

von Trundle Trollkönig (Gast)


Lesenswert?

Hier nur mit anderen Signalen/-Namen, müsste funktionieren:

NET "PHY_GMII_RXCLK" IOSTANDARD = LVCMOS18;
NET "PHY_GMII_RXCTRL" IOSTANDARD = LVCMOS18;
NET "PHY_GMII_RXD[0]" IOSTANDARD = LVCMOS18;
NET "PHY_GMII_RXD[1]" IOSTANDARD = LVCMOS18;
NET "PHY_GMII_RXD[2]" IOSTANDARD = LVCMOS18;
NET "PHY_GMII_RXD[3]" IOSTANDARD = LVCMOS18;
NET "PHY_GMII_RXD[4]" IOSTANDARD = LVCMOS18;
NET "PHY_GMII_RXD[5]" IOSTANDARD = LVCMOS18;
NET "PHY_GMII_RXD[6]" IOSTANDARD = LVCMOS18;
NET "PHY_GMII_RXD[7]" IOSTANDARD = LVCMOS18;

NET "PHY_GMII_RXCLK" TNM_NET = "PHY_GMII_RXCLK";
TIMESPEC TS_PHY_GMII_RXCLK = PERIOD "PHY_GMII_RXCLK" 125 MHz HIGH 50 %;


INST "PHY_GMII_RXCTRL" TNM = "RX_SIGS";
INST "PHY_GMII_RXD*" TNM = "RX_SIGS";
TIMEGRP "RX_SIGS" OFFSET = IN 2.5 ns VALID 3 ns BEFORE "PHY_GMII_RXCLK" 
RISING;

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.