Forum: FPGA, VHDL & Co. FPGA/CPLD als schellen timer


von Timer (Gast)


Lesenswert?

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?

von Duke Scarring (Gast)


Lesenswert?

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

von Schlumpf (Gast)


Lesenswert?

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

von fixStackPointer (Gast)


Lesenswert?

sowas + ein paar spaßige Tage
https://www.latticestore.com/products/tabid/417/categoryid/59/productid/55244/default.aspx
such mal nach:

-ecl-gatter
-impuls-generator
-pic-microkontroller timer

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


Lesenswert?

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

: Bearbeitet durch Moderator
von Hans-Georg L. (h-g-l)


Lesenswert?

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.

: Bearbeitet durch User
von GT (Gast)


Lesenswert?

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?

von GT (Gast)


Lesenswert?

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?

von ich (Gast)


Lesenswert?

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.

von user (Gast)


Lesenswert?

zum Anfangen wäre so ein FPGA-Board sicherlich interessant:
http://www.latticesemi.com/en/Products/DevelopmentBoardsAndKits/HimaxHM01B0

von user (Gast)


Lesenswert?

Hier kann man den Upduino2 bestellen:
http://www.gnarlygrey.com/

von Hans-Georg L. (h-g-l)


Lesenswert?

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.

von Schlumpf (Gast)


Lesenswert?

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?

von Schlumpf (Gast)


Lesenswert?

Sorry, die Takte müssen natürlich um 90 Grad verschoben sein...

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


Lesenswert?

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.

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.