Forum: FPGA, VHDL & Co. Verzögerte Signalausgabe


von Papel (Gast)


Lesenswert?

Hallo,

ich habe ein Eingangssignal von einigen Khz, dieses soll an mehreren 
Ausgängen mit jeweils verschiedenen Verzögerungen ausgegeben werden. Die 
Verzögerungen liegen in der Größenordnung von 50 ns bis einigen µS. Wie 
könnte ich das realisieren, bzw. welche Möglichkeiten gibt es dafür, 
wenn man nicht einfach nur D-Flipflops hintereinander hängen möchte. Ich 
habe in der Literatur wenig über Verzögerungsglieder gefunden, könnt ihr 
mir bitte helfen wo ich hier Theorie dazu finde bzw wie nennt man das 
relevante Teilgebiet aus der Digitaltechnik?

Lg und Danke im Voraus

von Gustl B. (-gb-)


Lesenswert?

Da fehlen noch Angaben:

Wie genau muss das sein, müssen das dann z. B. genau 50 ns sein, oder 
dürfen das dann auch 60 oder 40 ns sein? Wie sieht es bei einigen us 
aus, darf es dann ungenauer sein, oder muss es egal bei welcher 
Verzögerung immer gleich genau bleiben?

Was ist das für ein "Signal", analog, digital, 1 Bit oder viele Bits 
parallel (z. B. digitalisiertes Analogsignal)?

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Ein Ringbuffer ist hier das Mittel der Wahl:

https://en.wikipedia.org/wiki/Circular_buffer

Der Abstand zwischen Schreibe- und Lesezeiger entspricht dabei dem 
gewuenschten Delay.

von Jens U. (Gast)


Lesenswert?

Gab es da nicht einmal analoge Verzögerungsketten?

von Gustl B. (-gb-)


Lesenswert?

Ja. In einfachsten Fall ein Stück Kabel.

von Jens U. (Gast)


Lesenswert?

Was ist hier passiert, dass es hier nur noch dämliche Anworten und 
Beiträge gibt? Geht Corona jetzt doch aufs Hirn?

von Gustl B. (-gb-)


Lesenswert?

Was ist denn daran dämlich? Es wurden schon oft Kabel genau dazu 
verwendet um Signale zu verzögern.

Gustl B. schrieb:
> Ja.

Damit wollte ich deine Aussage bestätigen, dass es das in der Tat gab 
ind gibt. Auch komplizierter als nur ein Kabel. Siehe dazu 
https://en.wikipedia.org/wiki/Delay_line_memory .

Genso ist der Hinweis auf den Ringspeicher hier sinnvoll und ich 
verstehe die negative Bewertung nicht. Hier der Thread ist im FPGA 
Unterforum, also geht es vermutlich um ein digitales Signal in einem 
FPGA. Das kann man abtasten, in einen Ringspeicher füttern und abhängig 
von der gewünschten Verzögerung einen alten Wert aus dem Speicher 
ausgeben.
Hier ist aber das Problem mit der Genauigkeit. Eine Signalflanke wird 
dann nicht genau um den gewünschten Wert verzögert, sondern nur der 
Signalzustand zum Abtastzeitpunkt. Ist eben die Frage was hier gewünscht 
ist und, das hatte ich oben gefragt und ebenfalls -1 erhalten.

Jens U. schrieb:
> Geht Corona jetzt doch aufs Hirn?

Es führt nachweisbar zu mehr sinnfreien -1 Bewertungen - nicht nur in 
den Corona Threads.

von Papel (Gast)


Lesenswert?

Danke erstmal für die Antworten. Es handelt sich freilich um ein 
digitales signal, konkret ein pwm Signal. Problem dabei ist dass die 
Verzögerungszeiten variabel sind und auch mal z.b. 50.1 ns gewünscht 
sind. Ps - Verzögerung ist zwar nicht so leicht zu schaffen, mit dem 
verwendeten lattice ice40hx8k werde ich auch kaum über 150 Mhz Takt 
gehen können. Suche halt irgendwie nach dem besten Weg...

von Gustl B. (-gb-)


Lesenswert?

OK, aber was ist denn jetzt die gewünschte Genauigkeit? Und was ist die 
maximale Frequenz deiner PWM?

Prinzipiell könnte man natürlich einen Ringspeicher geben, aber bei PWM 
könnte man auch bei jeder Flanke einen Zähler neu starten.

Bei 50 ns Verzögerung und 100 MHz Abtasttakt würde ich bei der 
steigenden Flanke am Eingang den Zähler starten und dann beim Zählerwert 
4 den neuen Pegel ausgeben. Das Einsynchronisieren kostet natürlich auch 
ein paar Takte, das sollte man noch beachten.

Für höhere Auflösung könntest du dir vielleicht Registerketten zur 
Verzögerung bauen. Eine Kette für 1 ns Verzögerung, eine Kette für 2 ns, 
... und eine Kette für 9 ns. Dann gibst du das Signal nach dem Zähler 
auf jeweils die gewünschte Verzögerungskette und von dort geht es auf 
den Ausgang.

Quasi den Zähler als grobe Verzögerung mit 10 ns Auflösung und dann noch 
feinere zuschaltbare Verzögerungen durch Registerkette dahinter.

Gibt aber vermutlich elegantere Lösungen.
(Statt Registerkette könntest du auch ein paar cm Draht zwischen zwei 
IOs setzen^^, ja, das meine ich nicht ernst.)

von Papel (Gast)


Lesenswert?

Das Eingangssignal hat einige kHz, im schlimmsten Fall max 100 (noch 
nicht sicher). Bei der Genauigkeit soll so viel wie möglich rausgeholt 
werden, ist also auch nicht fix.

Ich bin eben nach der Suche nach diesen "eleganten Möglichkeiten", die 
Gustl B. andeutet.

von Gustl B. (-gb-)


Lesenswert?

Interessant wäre noch ob die minimale Pulsdauer immer kleiner als die 
maximale Verzögerung ist.

Papel schrieb:
> Das Eingangssignal hat einige kHz, im schlimmsten Fall max 100 (noch
> nicht sicher).

Ist das die PWM Frequenz? Dann wäre die minimale Pulsbreite wohl 
deutlich kleiner als 10 us.

von Achim S. (Gast)


Lesenswert?

Gustl B. schrieb:
> (Statt Registerkette könntest du auch ein paar cm Draht zwischen zwei
> IOs setzen^^, ja, das meine ich nicht ernst.)

Auch wenn du es als Scherz gemeint hast: manuell platzierte 
Inverterketten mit variablem Abgriff können tatsächlich für sowas 
genutzt werden. Und dann gehen die Laufzeiten auf den Verdrahtungen im 
FPGA recht signifikant ins Ergebnis ein.

Papel schrieb:
> mit dem
> verwendeten lattice ice40hx8k

Hat das Teil sowas wie High-Speed SerDes und einen Clock-Manager, der 
phasenverschobene Taktflanken erzeugen kann? Dann könnte folgendes 
Konzept für dich interessant sein:
- du betreibst den schon vorgeschlagenen Ringbuffer mit den 100MHz, die 
dein FPGA halt so kann.
- Am Eingang betreibst du einen High-Speed Deserializer, um das 
Eingangssingal mit einer vielfachen Frequenz abzutasten. (der Ringbuffer 
hat dann entsprechend eine höhere Bitbreite, je nachdem, welches 
Verhältnis dein Deserializer zulässt). Alle möglichen "Zusatzoptionen" 
(wie z.B. 8b/10b Umcodierung) deaktivierst du.
- Am Ausgang betreibst du einen High-Speed Serializer, um das 
Ausgangssignal wieder mit einem Vielfachen der der 100MHz ausgeben zu 
können.
- Du betreibst Eingangs- und Ausgangsseite mit zwei synchronen, aber 
phasenverschobenen Taktsignalen aus einem Clock-Manager. Den 
"Grob-Delay" stellst du mit der Größe des Ringbuffers ein, den 
Fein-Delay mit der Phasenverschiebung der beiden Takte.

Aber bereite dich schon mal darauf vor, dass du bei deinen 
augenblicklichen Anforderungen viel Arbeit vor dir hast und die 
Ergebnisse im Verhältnis zum Aufwand relativ ernüchternd sein werden.

von Gustl B. (-gb-)


Lesenswert?

Achim S. schrieb:
> Auch wenn du es als Scherz gemeint hast: manuell platzierte
> Inverterketten mit variablem Abgriff können tatsächlich für sowas
> genutzt werden. Und dann gehen die Laufzeiten auf den Verdrahtungen im
> FPGA recht signifikant ins Ergebnis ein.

Eigentlich müsste man so ein Drahtstück auch im FPGA mit Constraints 
hinbekommen. Also berhere verschieden lange Verzögerungen die man dann 
hinter den Ringspeicher in Serie schalten kann je nach gewünschter 
Verzögerung.

Papel schrieb:
> ice40hx8k

Der hat wenn ich das richtig sehe keinen SerDes, wäre aber eine hybsche 
Idee.

von Achim S. (Gast)


Lesenswert?

Gustl B. schrieb:
> Eigentlich müsste man so ein Drahtstück auch im FPGA mit Constraints
> hinbekommen.

Im Prinzip schon. In der Praxis wird es dann aber wahrscheinlich doch 
eher wieder auf handplatzierte Zellen/Routingwege hinauslaufen.

Gustl B. schrieb:
> Der hat wenn ich das richtig sehe keinen SerDes,

Schade.

@TO: es gibt in vielen FPGAs "Spezialhardware", die dir bei deinem 
Projekt helfen könnte. Ein solcher SerDes wäre eine Möglichkeit. Andere 
FPGAs bieten IODelays, mit mehr oder minder genau definierten, fein 
einstellbaren Verzögerungsstufen. Wenn dein FPGA das alles nicht bieten 
sollte (ich habe es jetzt nicht nachgeschaut), dann ist dieses FPGA eine 
eher ungünstige Wahl für das, was du vorhast.

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


Lesenswert?

Papel schrieb:
> Suche halt irgendwie nach dem besten Weg...
Für welches Problem?
Warum willst du da irgendwas um ein paar ps oder auch viel länger 
verzögern?

Papel schrieb:
> Bei der Genauigkeit soll so viel wie möglich rausgeholt werden
Wie definierst du "Genauigkeit" ? Über die Auflösung oder den Jitter 
oder die Stetigkeit oder alles zusammen oder was sonst?

von Papel (Gast)


Lesenswert?

Vielen vielen Dank, besonders an Gustl und Achim, für die konstruktiven 
Beiträge, ja ich habe mir sowas in der Art auch gedacht, ich werde mir 
mal im Datenblatt die Zeiten der Logikelemente anschauen und dann sehen 
was ich machen kann. Es ist ein low-cost FPGA von Lattice, der hat diese 
Spezialfunktionen leider nicht hat, ein anderer steht mir nicht zur 
Verfügung.

Danke auch Lothar für dein Interesse. Ich will hier gar nicht darauf 
eingehen, wozu das ganze etc. Die Genauigkeit ist hier nur als Länge der 
Verzögerung von Bedeutung. Wenn man 50 ns Verzögerung haben will aber 
das System nur 48 oder 52 ns schafft z.B... Jitter etc spielen hier 
natürlich mit, besondere Anforderungen bestehen nicht.

Wenn euch Literatur zum Thema einfällt, die relevant sein könnte, wäre 
ich für einen Tipp dankbar, lg

von auweia (Gast)


Lesenswert?

Als ich mal um 1 us verzoegern musste, taten es 3 8 bit-Schieberegister.
Bei 24 Mhz Takt ergibt sich eine Durchlaufzeit von 1 us.
Da der Takt asynchron zu den Signalen war, gab es natuerlich auch
einen Jitter von 42 ns. Der stoerte aber nicht.

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.