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
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
> 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!
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.
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;
Für sowas nimmt man dann so eine TIMEGRP Gruppe und hängt die an die Einzelsignale.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.