Forum: FPGA, VHDL & Co. Problem mit input delay


von TMTue (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgendes Problem. Ich möchte eine bidirektionalen Bus zwischen
einem FPGA (Altera DE2-115 Board) und einem TDC (Time to Digital 
Converter) realisieren.
Das Schreiben auf den Bus funktioniert meistens auch einwandfrei, jedoch 
bereitet mir das Lesen echte Probleme. Und zwar soll der FPGA immer dann 
lesen wenn der TDC anzeigt, dass er Daten in seinem FiFo hat. Es geht 
also die Empty-Flag auf Low und der FPGA zieht Read auf High. Das tut 
auch so weit und es der TDC schreibt dann auch Daten auf den Bus. Habe 
das alle soweit mit dem Oszi überprüft.
Das Problem ist nun folgendes, dass die Daten vom TDC einen Delay von 
etwa 10 ns haben.
Das wollte ich im sdc-File des Projektes berücksichtigen. Jedoch wenn 
ich das tue hält der FPGA die Leseanfrage über zwei Clock-Takte hinweg. 
Lösche ich das sdc-File wieder, mach er es wie gewollt nur ein Takt.

Hatte von euch jemand schon ein ähnliches Problem bzw. hat einen Tipp 
für mich?
Wäre über jede Hielfe sehr dankbar.
Ich bin leider kein Experte in Elektronik und FPGA. Ich bin nur Physiker 
und brauche die Schaltung für einen Messaufbau gür meine Masterarbeit.

Beste Grüße

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


Lesenswert?

TMTue schrieb:
> wenn ich das tue hält der FPGA die Leseanfrage über zwei Clock-Takte
> hinweg.
Und wie wird diese "Leseanfrage" im FPGA erzeugt? irgendwer muss dort 
ja einen 2. Taktzyklus (bzw. Waitstate) einfügen...

> Das wollte ich im sdc-File des Projektes berücksichtigen.
Und wie hast du das da drin gemacht?

von TMTue (Gast)


Lesenswert?

Ja genau. Im FPGA habe ich eine State Machine, welche beim 
Zustandswechsel
eine Leseanfrage stellt, wenn die Empty-Flag des TDCs auf Low ist. Ist 
die Empty-Flag auf High, wird keine Leseanfrage gestellt beim 
Zustandswechsel.

Zu meinem SDC-File:

#**************************************************************
# Time Information
#**************************************************************

set_time_format -unit ns -decimal_places 3

#**************************************************************
# Create Clock
#**************************************************************

create_clock -name {CLOCK_50} -period 20.000 -waveform { 0.000 10.000 } 
[get_ports {CLOCK_50}]

#**************************************************************
# Create Generated Clock
#**************************************************************

create_generated_clock -name 
{pll40Simple_1|altpll_component|auto_generated|pll1|clk[0]} -source 
[get_pins {pll40Simple_1|altpll_component|auto_generated|pll1|inclk[0]}] 
-duty_cycle 50.000 -multiply_by 4 -divide_by 5 -master_clock {CLOCK_50} 
[get_pins {pll40Simple_1|altpll_component|auto_generated|pll1|clk[0]}]

#**************************************************************
# Set Input Delay
#**************************************************************

set_input_delay  -max -clock [get_clocks 
{pll40Simple_1|altpll_component|auto_generated|pll1|clk[0]}]  12.000 
[get_ports {GPIO_1}]
set_input_delay  -min -clock [get_clocks 
{pll40Simple_1|altpll_component|auto_generated|pll1|clk[0]}]  10.000 
[get_ports {GPIO_1}]

Dies ist allerdings das erste mal das ich versucht habe ein sdc-File zu 
schreiben. Sonst waren meine Designs immer relativ einfach, dass sie 
auch ohne Funktioniert haben.
Es kann also gut sein, dass ich einen Fehler gemacht habe.

Beste Grüße und vielen Dank schon mal

von Schlumpf (Gast)


Lesenswert?

Sind TDC und FPGA synchron? Also arbeiten sie mit dem identischen Takt?

von TMTue (Gast)


Lesenswert?

Hallo,

ja TDC und FPGA arbeiten mit dem selben Takt.
Der Takt ist 40 MHz und wird mittels einer PLL aus dem 50 MHz Takt 
generiert,
der dem FPGA-Board zu Verfügung steht.

Beste Grüße

von Schlumpf (Gast)


Lesenswert?

Ok, und du gehst davon aus, dass der Ausgang des TDC dann auch synchron 
zu diesem Takt ist?

von Sigi (Gast)


Lesenswert?

Zum SDC-File: Zum einen wird es bei der Synthese verwendet
(IO-Delays in IO-Komponenten werden gesetzt, soweit möglich),
zum anderen bei der Analyse (TimeQuest etc.).

So auf die Schnelle schaut dein SDC-File schonmal iE korrekt
aus, du erzeugst die PLL-Clocks manuell.

jetzt kommt das Aber: die Delay-Angaben können keine Wunder
bewirken, deine Delay-Werte sind viel zu gross (typische
IO-Zellen bzw. deren Delays haben ein Max. von vlt. ein paar
ns). Synthetisiert wird aber trotzdem. Ohne SDC hast du damit
andere Delays als mit (natürlich in beiden Fällen trotzdem
die Falschen bzw. zu kleinen), deshalb also dein von dir
beschriebenes Phänomen.

In deinem Fall helfen nur Zustandautomaten, die z.B. in einem
Schritt eine Leseanfrage initiieren und in einem Nachfolgezustand
den Wert entgegennehmen. Ein SDC-File wäre trotzdem hilfreich,
denn dort kannst du z.B. einen Takt abziehen und die übrige
Zeit als Delay spezifizieren. Versuchst aber erst man ohne.

von J. S. (engineer) Benutzerseite


Lesenswert?

Wenn es um den Takt gegen die Daten geht, macht man das mit mit dem 
internen Takt und etwas Verschiebung.

Wenn hier nur das Steuersignal mit 10ns kommt, dann vermute ich dass man 
es mit der gegensätzlichen Flanke takten müsste und gfs auch die Daten, 
um die jeweils passend zu haben. So sehen mir die 10ns = 100MHz nämlich 
aus.

Also internen Takt auf 180 Grad stellen und alles einsamplen, schauen ob 
Daten zur selben Zeit wie das Steuersignal wechseln.

von TMTue (Gast)


Lesenswert?

Hallo zusammen,

ich kann ja mal einen kurzen Zwischenstand geben was ich bis jetzt
noch gemacht habe. Naja so richtig weiter hat mich nur eine Sache 
gebracht.
Ich habe jetzt noch den Eingang des bidirektionalen Bus in ein Flip-Flop
eingetaktet und wie es scheint kommt das Flip-Flop mit dem Delay klar.
Denn die Daten werden anschließend erst einmal in einen FiFo geschrieben
und wenn ich mir dann den Ausgang des Flip-Flops und das Steuersignal 
zum schreiben auf den FiFo auf dem Oszi anschaue liegen die Signale 
ziemlich gut auf einander.
Wie robust das Ganze ist kann ich momentan noch nicht sagen.
Es kann gut sein, dass es sinnvoller ist das Problem direkt mit dem 
Zustandsautomat ab zu fangen oder den internen Takt um 180 Gard zu 
verschieben.

Beste Grüße

von TMTue (Gast)


Lesenswert?

Eine Anmerkung habe ich komplett vergessen,
das sdc-File habe ich nicht mehr verwendet.

Beste Grüße

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.