Verzögerung aller eingehenden Signale um 2 ms mit VHDL

Ich habe zwei eingehende Signale, zwischen denen ich die Übereinstimmung testen möchte. Ich möchte aber zunächst alle Signale eines Kanals um die Sendezeit der Signale (2 ms) verzögern und so die Koinzidenz vergleichen. Im Grunde möchte ich also die Echtzeitinformationen für 2 ms speichern und sie dann wiedergeben, sobald sie mit dem Sammeln fertig sind, und diesen Prozess immer weiter fortsetzen. Ist dies mit einem FPGA machbar? Ich dachte daran, eines der folgenden zu verwenden:

outputA <= inputA after 2 ms; outputA <= inertial inputA after 2 ms; outputA <= transport inputA after 2 ms;

Aber soweit ich weiß, werden diese nur zur Simulation verwendet? Welche andere(n) Methode(n) wären besser geeignet, um eine solche Aufgabe zu erfüllen? Mit einem Schieberegister oder ähnlichem?

bearbeiten:

In meinem Setup habe ich zwei Detektoren (Einzelphotonenzählmodule), die Lichtphotonen in ein digitales Signal umwandeln (3,3 V, etwa 50 ns Impulsbreite). Die Signale werden dann an ein Altera DE2-Board gesendet, wo sie mit UND-Gattern auf Koinzidenz getestet werden (beachte, die Signale werden vorher von 50 ns auf etwa 15 bis 25 ns gekürzt, mit interner Logik und ohne Timing-Verlust). Der Takt auf dieser Platine läuft mit 50 MHz, was alle 20 ns eine steigende Flanke hat. Der Laser sendet alle 2 ms einen Puls. Die tatsächlichen Zählungen und zufälligen Rauschzählungen von diesen Detektoren folgen keinem Takt, so dass sie nicht notwendigerweise eine ansteigende oder abfallende Flanke genau mit dem 50-MHz-Takt teilen.Das Testen der Koinzidenz ist nicht das Problem, das ich habe, was ich jetzt tun muss, ist, eines der Signale um die Periode des Lasers zu verzögern und dann die Koinzidenz zu testen. Da der Laser so langsam ist, ist es unpraktisch, das Signal physikalisch zu verzögern (es würde etwa 1 km Glasfaser erfordern). Also versuche ich, diese Verzögerung durch das FPGA selbst zu erreichen. Um meine Fragen jetzt nochmal zu formulieren:

(1) Ist es möglich, die zeitliche Genauigkeit (bis auf sehr wenige Nanosekunden) beizubehalten, wenn ein FIFO-Puffer verwendet wird, um eines der eingehenden Signale zu verzögern , oder verliert das Senden der Signale in den Puffer diese Genauigkeit und teilt nur steigende / fallende Flanken mit my Uhr? (Sagt der Puffer, dass der Datenblock entweder vollständig null oder vollständig 1 ist, je nachdem, ob das Signal an der steigenden Flanke der Uhr in einem hohen oder niedrigen Zustand war, als er die Daten sammelt?)

(2) Wie würde ich anfangen, Code für einen solchen Puffer zu schreiben, kann ich davon eine Kopie online finden oder gäbe es "Puffer-Assistenten", die ich mit einem VHDL-Programm wie Quartus II erstellen kann?

Haben Sie einen mit Ihren Daten synchronisierten 0,5-kHz-Takt zur Verfügung?
Was ist Ihre Datenrate oder Abtastrate?
Wie viele Bits in Ihrem Schieberegister und wie hoch ist die Taktfrequenz?
Die verzögerten Zuweisungen in VHDL sind lediglich eine Annehmlichkeit, die in der Simulation bereitgestellt wird. Denken Sie daran, dass VHDL keine Programmiersprache zum Ausführen von Anweisungen auf einer CPU ist, sondern eine Deskriptorsprache zum Entwerfen digitaler Logikschaltungen, wie es ein Schaltplan tut. Sie müssen sich also die digitale Logikschaltung vorstellen, die Ihre Verzögerungsoperation erzeugen kann, und dann die VHDL schreiben, um diese Schaltung zu implementieren. Ein Schieberegister, das von einer Teilerschaltung läuft, die eine Schiebefreigabe erzeugt, erscheint sinnvoll. Denken Sie daran, machen Sie keine Uhr, indem Sie Ihre Logikuhr herunterteilen - machen Sie eine Aktivierung. Ich hoffe, Ihre Erfahrung macht dies vertraut.
Ich habe einen internen Takt von 50 MHz und bin mir über die Bits im Schieberegister nicht sicher. Ist das etwas, das durch die Hardware begrenzt ist oder etwas, das Sie programmieren? Und warum teilt man eine Logikuhr nicht herunter? Ich bin relativ neu in der VHDL-Programmierung, daher ist meine Erfahrung begrenzt. Ich werde mich jetzt mit der Erstellung einer Aktivierung befassen.
Mein Laser sendet alle 2 ms einen Impuls, aber der Detektor, den wir verwenden, sendet zwischen diesen Perioden auch zufällige Signale.
"Ich möchte den Zufall testen" - wie genau möchten Sie den Zufall "testen", dh. Welche Timing-Auflösung willst du?
Die ankommenden Impulse sind 50 ns breit, werden aber zuerst intern auf 5-15 ns kurzgeschlossen, bevor ich logische UND-Gatter verwende, um auf Koinzidenz zu testen.
Nein, eine FIFO-Verzögerung bietet keine Zeitauflösung, die feiner als das Taktintervall ist. Wenn Sie Ihren Bedarf nicht neu definieren können, sind wahrscheinlich ziemlich "exotische" Techniken erforderlich. Es hört sich so an, als ob Sie sich in einem akademischen oder formellen Forschungsumfeld befinden, vielleicht haben Sie lokale Instrumentierungsexpertise, mit der Sie das gesamte Experiment besprechen könnten? Möglicherweise gibt es eine Möglichkeit, es neu zu gestalten, damit die Messung besser für verfügbare Technologien geeignet ist.
Die Existenz von Gigasample-Oszilloskopen im mittleren Preissegment kann einen Hinweis geben; Ihre Daten scheinen nicht wirklich analog zu sein, aber ein Teil ihrer Funktionsweise besteht darin, den schnellen Pfad zu multiplexen, dh Sie können möglicherweise einen deserializerFunktionsblock verwenden, um ein Hochgeschwindigkeits-1-Bit-Signal in ein breiteres Niedriggeschwindigkeitssignal aufzuteilen und zu speichern mit moderaterer Geschwindigkeit in einem viele Bit breiten Speicher. Wenn Sie dann den Puffer in Ruhe untersuchen, ist die Zeit, zu der etwas passiert ist, die Wortadresse mal die Wortbreite plus die Position des Bits im Wort, alles multipliziert mit dem Gigahertz oder einem anderen Abtastintervall.
Bitte schauen Sie sich meine aktualisierte Antwort an.
Möchten Sie ein einzelnes, gut definiertes Ereignis verzögern, oder möchten Sie irgendwo ein paar Geräusche verzögern, in denen sich Ihr Signal versteckt? Die Deserializer-Idee kann beides tun, aber für ein einzelnes Ereignis gibt es möglicherweise einfachere Schemata.
@ChrisStratton Ich möchte ein paar Geräusche verzögern, wobei das Signal irgendwo darin versteckt ist. Schlagen Sie in Ihrem obigen Kommentar vor, eine schnellere externe Uhr zu verwenden?
Suchen Sie nach SERDES. Sie benötigen nur den Deserializer. Wenn Sie einen schnellen Stream in 8 parallele Bits aufteilen, können Sie aus dem Speicher ein Gigasample-FIFO aufbauen, das nur ein Achtel so schnell läuft. Das ist im Konzept, es müssen praktische Details ausgearbeitet werden, da Sie keine Standard-Kommunikationsschnittstelle als Quelle haben. Oder vielleicht reicht eine Auflösung von 8 ns aus, und Sie können diesen Speicher einfach direkt verwenden. Irgendwo gibt es eine Kombination von Techniken und Technologiegeschwindigkeiten, die tun sollten, was Sie wollen.

Antworten (1)

Jeder Zeitwert kann von einem FPGA nicht synthetisiert werden, da ein FPGA das Konzept "Zeit" nicht kennt. Tatsächlich ist sich kein elektronischer Schaltkreis unseres Zeitbegriffs bewusst. In Computern und dergleichen wurden spezielle Bibliotheken entwickelt, um das Programmieren mit der Zeit zu erleichtern.

Allerdings wird Synchronelektronik – wie ein FPGA – üblicherweise getaktet: von einem Oszillator angesteuert. Dieser Oszillator hat eine bestimmte Eigenperiode: die Taktfrequenz. Sie können diese Frequenz verwenden, um einen bestimmten Zeitraum zu messen. Dh ein Oszillator von 50 MHz wird 100000 mal in 2 ms oszilliert haben.

Wenn Sie ein Signal verzögern möchten, müssen Sie einen Speicher in das System einführen, der die Informationen für einen bestimmten Zeitraum enthält. In diesem Fall 100000 Taktzyklen. Sie haben dort eine Reihe von Optionen, eine davon ist eine Spalte mit 100000 n-Bit-Registern. Die Verwendung separater FPGA-Register ist jedoch ziemlich ineffizient.

Eine andere Lösung wäre die Verwendung eines vor nicht allzu langer Zeit eingeführten Features von FPGAs: Es ist möglich, die LUTs (Look-Up-Tables) als Schieberegister zu verwenden. Dies ist viel effizienter als die Verwendung separater Register. Im Fall von 100000 Taktzyklen ist dies jedoch wahrscheinlich immer noch nicht so ineffizient.

Sie erstellen tatsächlich einen FIFO-Puffer (First-In-First-Out) mit einer festen Verzögerung. Da die Verzögerung größer ist, ist es in diesem Fall üblich, einen Dual-Port-RAM-Block zu verwenden: Auf der A-Seite schreiben Sie die Eingangsdaten in einer Endlosschleife und auf der B-Seite lesen Sie diese Daten mit ein Adress-Offset von 100000.

nach deiner Bearbeitung:

Ok, Sie scheinen also zu versuchen, die Zeit zwischen zwei Impulsen zu bestimmen. Das ist etwas anderes – und viel einfacher – als die Zeitverschiebung von Daten zu bestimmen. Dies wird tatsächlich häufig in Radar- und Lidar-Anwendungen usw. durchgeführt. Die Komponente, die das tut, ist ein Time-to-Digital-Konverter . Es bestimmt einfach die Zeit zwischen Impuls 1 (Start) und Impuls 2 (Stopp), wie es eine Stoppuhr tut.

Wenn Sie die Zeit genauer bestimmen möchten, dh mit einem Intervall von einer Subuhrperiode, schlage ich vor, dass Sie sich die hybride Lösung (dh die Nutt-Methode) ansehen. Dieser kombiniert einen einfachen Zähler mit einem Nonius-Interpolator. A. Aloisio et al. haben in "FPGA Implementation of High-Resolution Time-to-Digital Converter" (ich hoffe, Sie haben Zugang zu IEEE) eine nette FPGA-Implementierung vorgeschlagen.

Ein 50-MHz-Takt hat tatsächlich 100.000 steigende Flanken in 2 ms. Wird diese Größe mit einem Dual-Port-RAM-Block noch machbar sein?
@ Cody495 100k klingen für einen RAM nicht groß, oder? Ob Sie wirklich alle Daten behalten wollen, Sie haben keine Wahl. Aber sampeln Sie wirklich mit 50 MHz? Du solltest dein Problem besser erklären. Was ist zum Beispiel „das Signal“?
Ich habe meinen ursprünglichen Beitrag bearbeitet, hoffentlich ist diese Erklärung nützlicher
Bis zu einem sehr begrenzten Ausmaß ist der "Zeitwert" tatsächlich synthetisierbar, nicht aus der HDL selbst, sondern in Bezug auf minimale und maximale Beschränkungen, die für die spätere Place & Route-Phase auferlegt werden können. Die Software verfügt über ein Modell der Leistung des FPGA und versucht, einen Pfad zu finden, der die Anforderungen erfüllt. Aber das wird keine offensichtliche Lösung für das offensichtliche Problem der Frage bieten.
@ChrisStratton stimmt, obwohl das FPGA das Konzept der "Zeit" damit immer noch nicht kennt. Das Synthese-, Place&Route-Tool löst das für Sie. Außerdem, wie Sie sagten: 2 ms sind so nicht erreichbar.
Ich glaube immer noch, ich war etwas unklar, ich brauche keine Hilfe beim Zählen der Zufälle (obwohl die von Ihnen bereitgestellten Links interessant sind!), Ich brauche Hilfe, um eines der Signale um 2 ms zu verzögern. Ich habe zur Verdeutlichung noch eine Bearbeitung vorgenommen.
@Cody495 verwenden Sie dann einfach den Block-RAM. Oder haben Sie zwei Datengeneratoren, die dieselben Daten zeitversetzt erzeugen.
@JHBonarius Wie würde ich dann den Code schreiben, um den Bock-RAM zu verwenden? Wie ich oben gefragt habe, ist dies nur ein Standardcode, den ich online finde, oder verwende ich einen Assistenten zum Erstellen?
@Cody495 Lesen Sie die Codierungsrichtlinien des Herstellers zum Instanziieren eines Block-RAM