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?
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.
Das Photon
Benutzer3528438
Spehro Pefhany
Toni M
Cody495
Cody495
Bruce Abbott
Cody495
Chris Stratton
Chris Stratton
deserializer
Funktionsblock 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.JH Bonarius
Chris Stratton
Cody495
Chris Stratton