Hallo allerseits Für ein Studiumsprojekt soll ich einen PI Regler aufbauen. Damit ein Vergleich mit der Simulation und der Fix-Punkt Umsetzung gemacht werden kann, soll dieser in Simulink aufgebaut werden. Und anschliessend über den Workflow-Adviser den HDL Beschreibung generieren. Die Simulation des Reglers mit der Reglerstrecke habe ich bereits umgesetzt. Dazu habe ich auch schon die HDL-Blöcke verwendet. Weil die Umsetzung nicht zufriedenstelltend war, hat mir ein Prof den Xilinx System Generator empfohlen. Nachdem ich etwas Mühe hatte, diesen zu installieren, habe ich alle Blöcke des Reglers durch die Xilinx Blocksets ersetzt. Und nun geht gar nichts mehr. Weder die Simulation noch den HDL-Workflow advicer. Kennt sich jemand damit aus, der mir ein paar Tipps geben könnte? Auch was die Optimierung anbelangt? Besten Dank, Patrick
Patrick B. schrieb: > Weil die Umsetzung nicht zufriedenstelltend war, Was war daran unbefriedigend? > hat mir ein Prof den Xilinx System Generator empfohlen. > Nachdem ich etwas Mühe hatte, diesen zu installieren, habe ich alle > Blöcke des Reglers durch die Xilinx Blocksets ersetzt. Um welche "Blöcke" geht es denn dabei? Wie granular ist dein Regler aufgebaut? Patrick B. schrieb: > Damit ein Vergleich mit der Simulation und der Fix-Punkt Umsetzung > gemacht werden kann, soll dieser in Simulink aufgebaut werden. Warum verstehe ich diesen Satz auch beim wiederholten Lesen nicht?
Lothar M. schrieb: > Patrick B. schrieb: >> Weil die Umsetzung nicht zufriedenstelltend war, > Was war daran unbefriedigend? Die Umsetzung des generischen Simulink-Modells erfolgte fast ausschliesslich kombinatorisch. Die Multiplikationen ebenfalls. Hier setzte Simulink im Diskreten Integrator eine Multiplikation mit Ts ein (ist eigentlich korrekt), aber das Resultat war satte 128Bit breit. Und da habe ich keine Möglichkeit gefunden, dort einzugreifen. Dies fürhte dazu, dass die Timing-Analys nicht erfolgreich bestanden wurde: Der die Multiplikation wurde über ~60 Stufen kombinatorisch durchgeführt. Ich habe mal den Regler in den Anhang gepackt... Beide Regelstrecken sind identisch (auch die simulierten Störgrössen, sowie die Wertebereiche). Einzig dis misc-Version ist mit den Standardblöcken (HDL) von Simulink erstellt worden, und der andere mit dem Xilinx Blockset des System Generators. Lothar M. schrieb: > Patrick B. schrieb: >> Damit ein Vergleich mit der Simulation und der Fix-Punkt Umsetzung >> gemacht werden kann, soll dieser in Simulink aufgebaut werden. > Warum verstehe ich diesen Satz auch beim wiederholten Lesen nicht? Mhm, Simulink rechnet ja mit double Werten auf dem PC. Aber auf dem FPGA wird schlussendlich eine Fix-Punkt-Arithmetik umgesetzt. Da entstehen Rundungsfehler und auch Einbusen in der Auflösung. Ich soll hier einen Vergleich ziehen können (quasi 2 Blöcke: einer mit double und der andere mit der Fix-Punkt-Definition die für das FPGA umgesetzt wird). Simulink nennt das glaube ich eine Hardware Co-Simulation.
:
Bearbeitet durch User
Lothar M. schrieb: > Patrick B. schrieb: >> Damit ein Vergleich mit der Simulation und der Fix-Punkt Umsetzung >> gemacht werden kann, soll dieser in Simulink aufgebaut werden. > Warum verstehe ich diesen Satz auch beim wiederholten Lesen nicht? Das ist ein typisches Einsatzgebiet des System Generators in Verbindung mit Simulink: Man baut alles zweimal auf, einmal das Simulinkmodell mit MATLAB-Blöcken in Real-Type ohne diskretes Timing und parallel dazu laufend ein diskret timendes Modell mit FPGA-Blöcken. Faktisch sind dies Wrapper für Xilinx-Cores wie man sie kennt. Dann stellt man in Simulink ein Zeitraster ein und simuliert das parallel. Damit bekommt man direkt den Unterschied zwischen idealem Realwert und FPGA-Wert (also Integer sozusagen) und bekommt die Abweichungen in der Rundung und dem Timing. Das Timing muss irrelevant werden, was es dann ist, wenn der FPGA mit den diskreten Zeiten in Filten richtig umgegeht (es also korrekt gebaut ist) und die entstehende Latenz vernachlässigbar ist (die Totzeit von Reglern kompensiert wurde oder akzeptabel ist). Vor allem kriegt man dann den Unterschied in den Werten der Energiespeichern in den Regelungen heraus, die aus den Rundungsfehlern kommen. Damit kann man nach weisen und nachprüfen, dass man richtig designed hat, bzw die Fehlerquelle finden, bzw durch Iteration die Auflösung so steigern, dass sie irrelevant wird. Meine eigenen Erfahrungen laufen aber dahin, dass die einfachen Regelungen im Kopf so designed werden können, dass sie stimmen während der Aufwand bei komplexen Regelungen zu gross wird und Testen besser ist: Man überdesigned das FPGA-System in der Genauigkeit und testet das System: Im Zuge der Entwicklung kann man dann immer mal wieder die Auflösung reduzieren, bis sie relevant wird. Diese Iteration bis zum Optimum ist erheblich kürzer und schneller, als das jeweils probehalber in Simulink zu bauen und zu checken. Ich baue meine Rechenpipelines immer schon in Excel auf, wobei ranges, limits und offset automatisch mitgeschleppt werden. Damit ist die Unsicherheit am Ausgang direkt ablesbar.
Hallo, hast du dein Simulink Model eigentlich in Fixed Point umgewandelt bevor du dies mit dem Workflowadviser auf den FPGA flasht?
Ja, die Umwandlung habe ich bereits gemacht. Nach etwa einem Tag habe ich es dann herausgefunden: Ich musste sämtliche Sample-Zeiten von den diskreten Simulink-Blöcken auf 1 wechseln, dann die Simulationsdauer von 10ms auf etwa 100000s erhöhen (Simulink nimmt dann plötzlich nicht mehr Sekunden als Zeitbasis, sondern FPGA Ticks...) Weiter musste ich alle Integratoren nicht mehr mit Gain=1 sondern mit Gain=1/fclk umwandeln... Jetzt klappt zumindest die Simulation und auch das Generieren des Codes. Interessanterweise kennt jetzt der System Generator kein std_logic. Sämtliche 1 Bit Signale werden als std_logic_vector(0 downto 0) umgesetzt?!
Es macht nicht wirklich einen funktionalen Unterschied ob man std_logic oder einen Vektor der Länge eins verwendet. Die maschinelle Verarbeitung/Generierung von Code wird dadurch aber vereinfacht da man nicht zwischen zwei Fällen unterscheiden muss sondern eine Funktion für Vektoren beliebiger Länge schreibt.
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.