Gibt es eine Möglichkeit, an beiden Taktflanken in FIFO zu schreiben?

Ich verwende Lattice ECP3 FPGA, habe im Internet keine Informationen darüber gefunden. Ich habe einen ADC, der mir an beiden Taktflanken 12-Bit-Daten liefert, also habe ich die Lattice High Speed ​​I/O-Schnittstelle verwendet:Geben Sie hier die Bildbeschreibung ein

Diese Schnittstelle speichert die ADC-Daten auf dem 24-Bit-Bus, der aus den positiven Flankendaten (niedrigere Bits – 11:0) und der negativen Flanke der Daten (höhere Bits – 23:12) besteht. Mein nächster Schritt besteht darin, all diese ADC-Daten in den FFT-Block zu übertragen. Das Problem ist, dass die FFT mit den 12-Bit-Daten arbeiten muss, die vom ADC kommen, und nicht mit den 24 Bit, also muss ich die Daten auf 2 trennen und bei jeder steigenden Flanke von senden Clock eine andere Hälfte der Daten, und es ist wichtig, keine Probe zu verlieren.

Ich habe also bereits ein funktionierendes Design, ich habe 2 FIFOs erstellt, einen für die positiven Flankendaten und einen zweiten für die negativen Flankendaten, Mux erstellt, die ihren Zustand bei jedem Anstiegsflankentakt ändern, und wenn ich die Daten aus den FIFOs in die lesen möchte FFT-Block, ich nehme eine Probe aus dem 1. FIFO und eine 2. Probe aus dem 2. FIFO und so weiter ... Ich habe funktionierende Synthese und Debugging:

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, erhält die Eingabe für den FFT-Block (dire) wie beschrieben adc_data_posedge/negedge_buff. aber ich habe das starke Gefühl, dass diese Art der Implementierung nicht der richtige Weg ist, um dieses Design zu erstellen. Ich habe gelesen, dass die Verwendung von 2 FIFOs für denselben Eingangsblock zu Synchronisierungsproblemen usw. führen kann.

Es könnte besser sein, wenn ich den ADC-Datenbus mit 24 Bit nehmen und in der steigenden Flanke des Takts gleichzeitig in 2 Zellen des FIFO schreiben könnte. Auf diese Weise kann ich einen FIFO mit 12 Bit Breite erstellen und in 2 Zellen gleichzeitig schreiben, ohne dass 2 FIFOs verwendet werden müssen. gibt es da eine möglichkeit?

Eine andere Möglichkeit, meine Frage zu stellen, ist, nehmen wir an, Sie müssen eine Architektur entwerfen, die DDR-ADC-Daten aufnimmt und im FIFO speichert und dann den FIFO-Ausgang als Eingang für den FFT-Block verwendet. wie würdest du es machen?

Geben Sie hier die Bildbeschreibung ein

Sie benötigen eine 2x-Uhr in Ihrem FPGA. Oder wandeln Sie die DDR-Daten mit einem Registerpaar in SDR um (die meisten FPGAs haben solche Register in die IOBs eingebaut), verdoppeln die Breite und verwenden einen einzelnen FIFO, der ebenfalls doppelt so breit ist.
ok danke aber das habe ich schon gemacht. Ich habe die Highspeed-E/A-Schnittstelle von Lattice (GDDRX1) verwendet, die die 12-Bit-DDR-Daten vom Adc genommen und im 24-Bit-Bus gespeichert hat, den ich jetzt verwenden kann. Von hier aus ist es kein Problem, ein 24-Bit-FIFO zu erstellen und dieses Datum dort zu speichern. ABER ich muss den 24-Bit-Bus zweimal pro Taktzyklus verwenden, da in diesem 24-Bit-Bus 2 Abtastdaten (12 msb-Bits und 12 lsb) gespeichert sind. Wie kann ich es tun, ohne 2x Takt zu verwenden?
Du kannst nicht. Sie benötigen entweder eine FFT, die zwei Abtastungen pro Takt akzeptiert, oder Sie können Daten nur mit der halben Geschwindigkeit des ADC an die FFT übertragen.
OK danke. Die Wellenform, die ich im Beitrag angehängt habe, ist also nach meinem Verständnis ein akzeptabler Weg, dies zu tun. (Lattice FFT IP akzeptiert keine zwei Samples pro Takt)
Nein, nicht, wenn ich richtig verstehe, was Sie tun. Sie scheinen am Ausgang der FIFOs einen weiteren DDR-Stream zu erstellen, der sicherlich nicht mit Ihrer FFT kompatibel ist, es sei denn, er hat einen 2x-Takt. Was genau bedeutet „Ich habe bereits ein funktionierendes Design“ ?
Sehen Sie sich die Wellenformen an. Es macht den Job, ich sende all diese Samples an FFT und von dort an CORDIC, im CORDIC-Ausgang kann ich das Spektrum sehen. (Das Problem ist, dass das Design ab -45 dBm + funktioniert, wenn ich eine Welle mit -40 dBm bereitstelle, liefert der CORDIC-Ausgang keine guten Ergebnisse. Aber ich denke, vielleicht liegt es an der FFT-Blockauflösung.) Ich habe ein Bild von Matlab mit den kommenden Daten hinzugefügt den FFT-Eingang und den CORDIC-Ausgang.

Antworten (1)

Meine erste Neigung wäre, zwei FIFOs zu synchronisieren, die jeweils an einer anderen Taktflanke arbeiten, und zusätzliche Schaltkreise hinzuzufügen, um sicherzustellen, dass sie synchron bleiben. Ein zweiter Ansatz wäre die XOR-Verknüpfung des Taktsignals mit einer verzögerten Version von sich selbst, wodurch im Wesentlichen bei jeder Taktflanke ein Impuls erzeugt wird. Wenn Sie jedoch keine schnellere Uhr zur Verfügung haben, wird es eine asynchrone Verzögerung sein, also müssen Sie sicherstellen, dass Sie Ihre Setup-and-Hold-Zeiten unter allen Bedingungen erfüllen.