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
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?
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
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
Ok, und du gehst davon aus, dass der Ausgang des TDC dann auch synchron zu diesem Takt ist?
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.