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
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)?
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.
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...
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.)
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.
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.
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.
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.
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.
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?
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
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.