Forum: FPGA, VHDL & Co. Kennt sich jemand mit Xilinx System Generator aus?


von Patrick B. (p51d)


Lesenswert?

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

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


Lesenswert?

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?

von Patrick B. (p51d)


Angehängte Dateien:

Lesenswert?

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
von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von Mike Bader (Gast)


Lesenswert?

Hallo,

hast du dein Simulink Model eigentlich in Fixed Point umgewandelt bevor 
du dies mit dem Workflowadviser auf den FPGA flasht?

von Patrick B. (p51d)


Lesenswert?

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?!

von Ben (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.