Moin, ich möchte in meinem FPGA einen Analog-Spannung ausgeben. Da ich kein DAC auf meinem Eva-Board habe, möchte ich eine PWM ausgeben und diese anschließend Tiefpass filtern. Ich habe mich von folgendem Paper dazu inspirieren lassen: https://wwwee.ee.bgu.ac.il/~pemic/publications/conf032.pdf Darin wird mit Hilfe eines Ringoszillators, MUX und XOR-Gatter eine 11Bit @ 1.6MHz PWM erzeugt. Diese würde ich gerne nachbauen. Ich habe bisher einen Ringoszillator mit mehreren NOT-Gattern aufgebaut und mittels Oszilloskops vermessen. Es schwingt zwar, aber nicht wie gewünscht (kein Rechteck und die Frequenz zu niedrig). In dem Paper wird der Ring mit Buffern realisiert. Meine Problem/Fragen liegen eigentlich hier: - Kann man einen Ringoszillator simulieren? (da es ja kein logisches, sondern physikalisches Verhalten ist) - Kann man bewusst nur I/O-Buffer instanziieren, die bei der Synthese nicht weg optimiert werden? - Oder habt ihr komplett andere Ideen, wie ich so eine hohe Auflösung und Frequenz PWM erzeugen kann? (FPGA Übertaktung, um Counter laufen lassen zu können?) Meine Hardware: Eva-Board - ARTY S7 mit einem Spartan-7 FPGA Ich beschreibe das System in VHDL
:
Bearbeitet durch User
S. K. schrieb: > 11Bit @ 1.6MHz PWM erzeugt. Dafür wären 3,2GHz notwendig ... Da les ich mal mit, das wird sicher interessant.
Mampf F. schrieb: > Dafür wären 3,2GHz notwendig ... Genau das ist das Problem. Geht eher in Richtung 3,3GHz. Wenn man sich das Paper so anguckt, klingt auch alles ganz logisch und "einfach". Aber den Oszillator zu stabiliseren, um dann eine PWM daraus zu generieren, übersteigt irgendwie meine Fähigkeiten :D Und da wurde das mit einem Cyclone IV gemacht, der müsste bei ca. f=200MHz takten.
Warum so kompliziert? Was sind die Anforderungen an die Analogwerte? Fuer viele Faelle funktioniert ein einfacher Delta-Sigma-DAC. Im einfachsten Fall baust du den so: https://www.fpga4fun.com/PWM_DAC_2.html
Hannes schrieb: > Warum so kompliziert? Was sind die Anforderungen an die Analogwerte? Die Analogwerte dienen als Referenzwert einer stromgesteuerten Regelung eines DCDC-Wandlers. Dafür wird die Ausgangsspannung gemessen und anschließend im Regler zu dem Soll-Strom auf Primässeite geschlossen. Die eigentliche Stellgröße der Halbbrücken ist eine 70kHz PWM. Daher muss mein DAC mit einer relativ hohen Frequenz arbeiten. Meine Vorgabe/Ziel ist es mindestens 10 Werte pro Schaltzyklus zu ermitteln (-> demnach 700kHz). Um möglichst rippelfreie Werte (nach der Filterung) zu bekommen, habe ich die Frequenz erstmal höher angesetzt (runter gehen, kann man ja immernoch). Über die Auflösung bin ich mir selbst noch im unklaren. Meine Stellgrößen PWM arbeitet mit 12 Bit, und in diesem Bereich wollte ich für eine genaue Regelung auch erstmal versuchen zu bleiben. Die beiden Vorschläge schaue ich mir gleich mal an, vielleicht komme ich damit weiter.
Das größte Problem und eher die größte Frage ist eigentlich, ob man so ein Verhalten, wie Ringoszillatoren aus logik-Gattern, simulieren kann. Bei mir wird im Simulator dabei nichts angezeigt, wenn man die Implantation durchführt, kann man das Signal aber messen. Ich vermute, dass es daran liegt, dass es für den Simulator nicht "logisch" erscheint, dass die Schaltung von sich aus zu schwingen beginnt. So wird einem die Entwicklung natürlich stark erschwert, zumal ich kein Oszilloskop mit mehreren 10 GHz Bandbreite habe.
S. K. schrieb: > Das größte Problem und eher die größte Frage ist eigentlich, ob man so > ein Verhalten, wie Ringoszillatoren aus logik-Gattern, simulieren kann. Kann man. Man muss dabei aber im Synthesecode mit symbolischen Zeiten hantieren. Das sieht nicht nur nach "Murks" aus, das ist sogar einer: http://www.lothar-miller.de/s9y/categories/29-Ringoszillator Vor allem habe ich beobachtet, dass zwar der Ringoszillator auf dem FPGA erstaunlich stabil gegen Temperaturschwankungen ist, aber eben auch, dass diese Frequenz nicht "portierbar" ist. Ein anderes FPGA schwingt mit einer völlig anderen Frequenz.
S. K. schrieb: > Bei mir wird im Simulator dabei nichts angezeigt, auf welcher Ebene simulierst du denn? Dass z.B. in einer Verhaltenssimulation nichts realistisches rauskommen kann, fände ich naheliegend (da die von den Verzögerungen der Gatter nichts weiß). S. K. schrieb: > So wird einem die Entwicklung natürlich stark erschwert, zumal ich kein > Oszilloskop mit mehreren 10 GHz Bandbreite habe. Keine Arme, keine Kekse ;-) Oder man nutzt eben doch eine geschicktere Umsetzung, wie sie oben genannt wurden (Delta-Sigma, Pulsdichtemodulation, ..) S. K. schrieb: > Oder habt ihr komplett andere Ideen, wie ich so eine hohe Auflösung > und Frequenz PWM erzeugen kann? wenn es eine hochfrequente, hochauflösende PWM sein soll: du könntest einen Gigabit-IO so füttern, dass deine gewünschte PWM rauskommt. Dann musst du im Logikteil nur mit einem Bruchteil der Frequenz arbeiten. Hoppla, ich sehe gerade, dass du nen Spartan 7 hast. Dann war das mit dem Gigabit-IO wohl keine so gute Idee. (vielleicht auf den Atix umsteigen?) S. K. schrieb: > Die eigentliche Stellgröße der Halbbrücken ist eine 70kHz PWM. Daher > muss mein DAC mit einer relativ hohen Frequenz arbeiten. Meine > Vorgabe/Ziel ist es mindestens 10 Werte pro Schaltzyklus zu ermitteln > (-> demnach 700kHz). Und du musst wirklich über eine analoge Zwischengröße gehen? Bei solchen kaskadierten Regelkreisen hätte ich ein ungutes Gefühl, einen PWM-DAC mit in die Schleife zu nehmen, der grade bei den interessanten Frequenzen Phasenreserve kostet. Wäre es nicht denkbar, die gesamte Regelung ins FPGA zu verlagern und die Halbbrücke digital anzusteuern?
S. K. schrieb: > Da ich kein DAC auf meinem Eva-Board habe S. K. schrieb: > Eva-Board - ARTY S7 mit einem Spartan-7 FPGA Es gibt auch PMOD-Module mit Digital-Analog-Wandlern zum anstecken. Oder wenn genug Pins frei sind R2R-Netzwerk
Ich habe es nun immerhin geschafft, den Oszillator zu simulieren. Lag anscheindend an symbolischen Zeiten. Ansonsten hab ich auch vorher schon Timing Simulationen dafür durchgeführt. Mit geschickter Anordnung habe ich ein Signal mit einer Frequenz von ca. f=1,5GHz erzeugen können. Leider ist meine spätere Auswertung dafür zu träge, womit ich effektiv nur bei 600MHz lande. Ich werde also auf einen diskreten DAC umsteigen, damit das Projekt weiter vorankommt. Aber Danke für die hilfreichen Antworten, wird wohl nicht die letzte Frage bleiben ;)
Ich sehe den Sinn für den Ringoszillator nicht wirklich ein, wenn man nicht mit aller Gewalt über die Taktfrequenzen hinaus will, die mit einem FPGA direkt machbar sind. Ich habe mich selbst mit solchen Oszillatoren befasst und daran herum geforscht: http://www.96khz.org/oldpages/digitalnoisegenerator.htm Daraus abgeleitete Artikel findet man hier: Digitaler Rauschgenerator im FPGA Digitaler Zufallszahlengenerator in VHDL Weiter oben hatte ich schon die Pulsdichtemodulation erwähnt - leider mit Tippfehler, wie ich gerade sehe, also nochmal: Pulsdichtemodulation Solange man nicht davon Gebrauch macht und die Möglichkeiten des verbesserten Spektrums gegenüber einer PWM ausnutzt, bringt die Erhöhung der Taktfrequenz nichts. Ich habe mir die Schaltung im Link angesehen und würde sagen, dass die Phasenmodulation, die sie vorne bekommen (können, bzw. "könnten", wenn sie es noch etwas anders bauen würden) zwar die grundsätzliche Granularität der PWM optimiert, aber trotzdem nicht an die Qualität einer PDM heranreicht, auch wenn man in einem FPGA das Phasenrauschen der PLLs in Betracht zieht. Zudem kann man noch aus einem guten Taktgenerator speisen und hinten das Signal gaten, um sauber zu werden, wenn man will. Ich habe einen konfigurierbaren PDM-Modulator am Laufen, der 768kHz Audio als DSD64, bzw. 96kHz als DSD512 aus dem FPGA schiebt. Die Qualität ist entsprechend um Klassen besser, als z.b. das schnöde 16/24Bit der CD/DVD. Bei 1,5MHz sollte das entsprechend sein.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.