Hallo,
ich habe bisher überhaupt keine Ahnung von FPGAs oder CPLDs, mich würde
aber interessieren, ob es sich eventuell lohnt für ein Projekt mal was
neues zu machen.
Ich brauche im Grunde einen schnellen Delay Generator mit mehreren
Ausgängen. Bei einem Mikrocontroller habe ich das Problem, dass der
Jitter mir etwas zu hoch ist und ich gerne auf Delays uter 1us kommen
würde. Meint ihr sowas wäre mit einem FPGA/CPLD besser möglich? Was für
Delays könnte man wohl realistisch mit günstigeren (<20€) Bauteilen
hinbekommen?
Timer schrieb:> Bei einem Mikrocontroller habe ich das Problem, dass der> Jitter mir etwas zu hoch ist und ich gerne auf Delays uter 1us kommen> würde.
Wieviel Jitter ist denn zulässig?
Wenn man einen Zähler im FPGA mit 100 MHz taktet (was bei allen
aktuellen FPGA realisierbar sein sollte), hat man eine
Granularität/Auflösung von 10 ns.
Reicht das?
> Was für> Delays könnte man wohl realistisch mit günstigeren (<20€) Bauteilen> hinbekommen?
Der Preis ist nur für das Bauteil oder das ganze Evaluationboard?
Duke
Timer schrieb:> Meint ihr sowas wäre mit einem FPGA/CPLD besser möglich?
Auf jeden Fall
Timer schrieb:> Was für> Delays könnte man wohl realistisch mit günstigeren (<20€) Bauteilen> hinbekommen?
von einstelligen Nanosekunden bis theoretisch unendlich
Timer schrieb:> ich habe bisher überhaupt keine Ahnung von FPGAs oder CPLDs
Dann ein Tipp: achte auf die Spannungen, 5V gibts da nicht.
> Bei einem Mikrocontroller habe ich das Problem, dass der Jitter mir> etwas zu hoch ist und ich gerne auf Delays uter 1us kommen würde.
Kannst du da was zur Herkunft dieses Signals sagen, und warum und wie
lang es "verzögert" werden muss. Halt einfach ein paar Zahlen statt "zu
hoch" und "unter 1µs"...
Und dann noch, wie genau diese Verzögerungszeit eingehalten werden muss:
muss das Signal z.B. genau um 850ns verzögert werden, oder können das
auch mal 800ns oder 900ns sein, nur eben auf 10ns einstellbar?
Willst du die Verzögerung während des Betriebs umstellen können? Falls
ja: wie? Taster, µC,...?
> Meint> ihr sowas wäre mit einem FPGA/CPLD besser möglich? Was für Delays könnte> man wohl realistisch mit günstigeren (<20€) Bauteilen hinbekommen?
Ich würde einen MachXO2 nehmen: single Chip mit 3,3V und internem
Oszillator (falls die absolute Genauigkeit nicht so wichtig ist) oder
eben einem externen Oszillator (wenn es genau 850ns sein müssen).
Timer schrieb:> FPGA/CPLD als schellen timer
Passend zur fünften Jahreszeit... ;-)
https://fasching-de.buttinette.com/shop/a/schelle-63449
Für ca 25€ bekommst du bei Mouser ein Nucleo F746 Board mit eingebautem
Programmer, USB und Ethernet.
Der Stm32F746 taktet mit 216Mhz damit erreichtst du eine Auflösung < 5ns
und ein Jitter in Bezug auf deinen externen Eingangstrigger < 10ns. Die
Ausgänge zueinander sind Taktsynchron. Der Takt Jitter durch die PLL ist
< 500ps. Durch die interne Verdrahtungslogik der Timer läuft das ganze,
nach Initialisierung, ohne CPU Beteiligung. Damit sind zb. 15 Ausgänge
mit 4 Timern machbar.
Hey miteinander,
schon einmal vielen Dank für die Hinweise!
Um das mal etwas genauer zu fassen: Es soll von einem Eingangssignal aus
einem Schmitt-Trigger 16 Signale mit viariabler Verzögerung und
Pulsweite erzeugt werden. Dabei ist nicht eine minimale Verzögerung
zwischen dem Ein- und Ausgang wichtig (t_0), sondern, dass man die
Verzögerung möglichst fein einstellen kann (t = t_0 + n*dt) und sie
möglichst reproduzierbar ist. Schritte von dt=1ns wäre toll, aber ich
bin mir bewusst, dass es nicht so einfach möglich ist. Maximal wäre eine
Verzögerung von t=10s gut. Der Jitter sollte einfach kleiner als dt
sein.
Ich hatte gedacht, ob man einfach einen 100MHz ~40 bit Timer
konfigurieren kann, der mit mehreren einstellbaren Vergleichswerten
Ausgangs-Pins ein- oder ausschalten kann. Im Prinzip wäre das alles was
notwendig wäre, da zusätzlich noch ein ARM7-Controller vorhanden ist,
der alles steuert.
Hans-Georg L. schrieb:> Der Stm32F746 taktet mit 216Mhz damit erreichtst du eine Auflösung < 5ns> und ein Jitter in Bezug auf deinen externen Eingangstrigger < 10ns. Die> Ausgänge zueinander sind Taktsynchron. Der Takt Jitter durch die PLL ist> < 500ps. Durch die interne Verdrahtungslogik der Timer läuft das ganze,> nach Initialisierung, ohne CPU Beteiligung. Damit sind zb. 15 Ausgänge> mit 4 Timern machbar.
Falls es keinen großen Vorteil von FPGA/CPLD gibt, werde ich es wohl
ähnlich machen. Es läuft sowieso zufälliger Weise ein STM32F746, der
zusätzlich ein Display (24bit LCD), 4xSPI, USB und/oder Ethernet
bedienen muss. Bisher habe ich einen 32 Bit Timer benutzt um zu
bestimmten Zeitpunkten (n*1us) die Pins auf einem dedizierten GPIO-Port
gleichzeitig zu schalten (wobei ich gleichzeitge Ereignisse im Vorfeld
zusammenfasse), allerdings benötige ich weiterhin eine Schaltung aus
externen 74er ICs für weitere externe Signale, die ich eventuell in
einen schnellen FPGA/CPLD integrieren könnte (das über den
Mikrocontroller laufen zu lassen wäre nicht schnell genug). Jeden
Ausgang über einen einzelnen Timer-Channel laufen zu lassen würde wegen
der vielen 16-Bit-Timer schwierig sein, oder kann man das einfach lösen
ohne zwischendurch irgendwelche Totzeiten beim Verändern der
Timereigenschaften zu haben?
Lothar M. schrieb:> Willst du die Verzögerung während des Betriebs umstellen können? Falls> ja: wie? Taster, µC,...?
Ups, ganz vergessen: sie würden von einem Mikrocontroller per SPI o.Ä.
eingestellt werden sollen.
Duke Scarring schrieb:> Der Preis ist nur für das Bauteil oder das ganze Evaluationboard?
Alleine für das Bauteil. Ich habe wegen dem nichtflüchtigen Speicher (um
es nicht noch komplizierter zu machen als es sowieso schon ist ;-)) an
die Spartan3AN oder MAX10 Serie gedacht, wobei mir Intel wegen der
offeneren IDE lieber wäre. Gibts bessere Alternativen?
Zum MAX10 kann ich sagen, dass mit entsprechend sorgfältige Designs
locker 2ns Schrittweite schaffen sollten, vielleicht bis zu ~1.2ns.
"Einfach" ist das dann aber nicht mehr unbedingt.
GT schrieb:> Schritte von dt=1ns wäre toll
Das wirst du wahrscheinlich auch nicht mit einem FPGA schaffen.
Wenn du mit 8*32Bit Kanälen und 8*16 bit Kanälen hinkommst, die
Impulsbreite nur für 4 Kanäle gleichzeitig einstellbar ist und dein dein
STM32F746 viele Pin hat könnte es mit den Timern ohne Umprogrammierung
während der Laufzeit funktionieren.
Wahrscheinlich brauchst du einen 5. Timer weil, soweit ich mich
erinnere, Trigger Eingang sich den Pin mit einem Kanal teilt.
Mit zusätzlicher Umprogrammierung der Compare Register kannst du alles
machen.
ich schrieb:> Zum MAX10 kann ich sagen, dass mit entsprechend sorgfältige Designs> locker 2ns Schrittweite schaffen sollten, vielleicht bis zu ~1.2ns.
Rein aus Interesse:
Wie würdest du das prinzipiell anstellen?
Maximale PLL Ausgangfrequenz ist 472MHz. Damit ist ein Takt schon länger
als 2ns.
Mein erster (na ja, eher dritter) Gedanke:
Man könnte jetzt mit mehreren phasenverschobenen Takten parallel
arbeiten und über eine ausgeklügelte Logik erkennen, welchen "Strang"
man auf den Output schaltet. Damit wäre es vielleicht möglich.
z.B:
Zwei 250MHz Takte um 180 Grad phasenverschoben aus der PLL holen und
dann beide Flanken benutzen.
Damit hat man 4 Taktdomänen, die 1ns versetzt zueinander laufen.
Dazu jeweils eine Logik, die auf der jeweiligen Domain läuft und eine
übergeordnete Logik, die (so Quartus will) klein genug ist, dass die
kritischen Pfade unter 1ns Laufzeit haben (kürzester Pfad zwischen zwei
Domains). Eventuell kann man an der Stelle noch was über multicycles
relaxen.
Dazu muss aber der Skew zwischen FPGA-Eingang und den Registern der 4
Domänen quasi Null sein, sonst wird durch die unterschiedliche arrival
Time an den ersten Registern der Domänen das Timing verfälscht. Das
könnte man erreichen, indem man die jeweils ersten Register in 4 Pads
legt und diese Pins auf der Leiterplatte parallel schaltet.
Das mit dem Skew gilt natürlich auch für den Ausgang. Es wird 4
Ausgangsregister geben, die man wegen der Skew-freiheit zueinander dann
in die Pad-Zellen von 4 Pins legen muss und auf der Leiterplatte
parallel schaltet.
Die Steuerlogik enabled dann nur den jeweiligen Ausgang und schaltet die
anderen auf "Z".
Das wird sehr sportlich aber klingt nach ner schönen Herausforderung;-)
Wie wäre dein Ansatz, um auf so kleine Schritte zu kommen?
GT schrieb:> Um das mal etwas genauer zu fassen: Es soll von einem Eingangssignal aus> einem Schmitt-Trigger 16 Signale mit viariabler Verzögerung und> Pulsweite erzeugt werden. Dabei ist nicht eine minimale Verzögerung> zwischen dem Ein- und Ausgang wichtig (t_0), sondern, dass man die> Verzögerung möglichst fein einstellen kann (t = t_0 + n*dt) und sie> möglichst reproduzierbar ist.
Das eigentliche Signal soll also insgesamt erhalten bleiben, aber bis zu
10 Sekunden verzögert ausgegeben werden? Oder soll es noch "geformt"
(z.B. auf eine Mindestzeit verlängert oder eine feste Impulslänge oder
auch gekürzt) werden?
Im ersten Fall muss nämliche nicht nur ein Zeitstempel für den
"Impulsstart" genommen werden, sondern auch einer für das "Impulsende".
> Schritte von dt=1ns wäre toll, aber ich bin mir bewusst, dass es nicht> so einfach möglich ist.
Es ist ziemlich kompliziert, wenn auf der anderen Seite die maximale
Verzögerungszeit 10s sein soll. Denn der Zähler dafür muss ja auf
10000000000 zählen können. Und dieser Zähler (und Vergleicher) mit 34
Bit ist schon bei 100MHz eine nicht allzu simple Angelegenheit.
> Maximal wäre eine Verzögerung von t=10s gut.
Können während der Verzögerungszeit meherere Eingangsimpulse kommen, die
dann alle um max. 10s verzögert ausgegeben werden müssen? Dann wäre ein
Fifo für die Zeitpunkte der steigenden und fallenden Flanken nötig.
> Der Jitter sollte einfach kleiner als dt sein.
Also gut, dann +-dt/2 ;-)
Oder du machst ein Oversampling, womit logischerweise die minimale dt
verdoppelt (oder noch weiter vermehrfacht) wird. Du merkst: dein Geld
ist weg, egal ob du es aus der rechten Hosentasche oder der linken
Hosentasche herausnimmst.