Forum: FPGA, VHDL & Co. Xilinx System Generator und die Latenz


von Joul (Gast)


Lesenswert?

Hallo,
ich hab noch nicht allzu viel Erfahrung mit FPGA's und habe ein Projekt 
von einem Kollegen übernommen, der einen Teil mit dem Xilinx System 
Generator in Matlab/Simulink implementiert hat.
Vom Grundverständnis her ist es für mich so: wenn ich im FPGA angenommen 
drei Werte miteinander verarbeiten will, a*b+c und für die 
Multiplikation einen Multiplizierer einsetze der meinetwegen eine Latenz 
von 4 Takten hat dann muss ich das Signal c ja um 4 Takte verzögern 
bevor dieses mit dem Ergebnis des Multiplizierers in einen Addierer 
wandert. Ansonsten würde ich ja zwei völlig verschiedene Werte addieren. 
Ist doch soweit richtig, oder?

Meine Frage ist jetzt: Wie kann ich so etwas im System Generator 
berücksichtigen? Wenn ich dort einen Mult Block einfüge, dann bekomme 
ich keinerlei Aussage darüber, wie lange der braucht, bis hinten ein 
Ergebnis rauskommt. Ich kann zwar bei den Properties des Mult Blockes 
eine Latency eingeben, dabei aber auch den Wert 0 eintragen! Was hat das 
denn für einen Sinn? Multiplikation ohne Latenz??
Wie kann ich im System Generator nun also sicherstellen das auch die 
richtigen Werte miteinander verarbeitet werden? Geht das automatisch 
oder muss ich mich darum kümmern, oder was? Die Anleitungen und 
Tutorials konnten mir darauf keine Antwort geben.

Vielleicht kann mir das mal jemand erklären, der damit Erfahrung hat.

MfG
Joul

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


Lesenswert?

Joul schrieb:
> a*b+c
Wenn du genau diese Formel hinschreibst, dann wirst du genau dieses 
Ergebnis bekommen. Und zwar sofort. Ohne Latenz.

> Multiplikation ohne Latenz??
Eine Multiplikation ist eine rein kombinatorische Angelegenheit. Denn 
eine Multiplikation ist ja nur ein Haufen Addierer und ein paar Gatter. 
Und Addierer sind nur ein paar Gatter. Also ist eine Multiplikation nur 
ein Haufen logischer Gatter.

> und für die Multiplikation einen Multiplizierer einsetze
Du musst das nicht selber machen. Das macht der Synthesizer für dich...

Wenn du aber sagst: ich kann mir Latenz erlauben und diese auch 
verwalten, dann wird evtl. dein Design kleiner und/oder schneller.

von J. S. (engineer) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
>> Multiplikation ohne Latenz??
> Eine Multiplikation ist eine rein kombinatorische Angelegenheit. Denn
> eine Multiplikation ist ja nur ein Haufen Addierer und ein paar Gatter.
> Und Addierer sind nur ein paar Gatter. Also ist eine Multiplikation nur
> ein Haufen logischer Gatter.
Nicht bei embedded MULs und schon garnnicht nicht bei dem 
Xilinx-Blockset in Simulink.

Joul schrieb:
> dann muss ich das Signal c ja um 4 Takte verzögern
> bevor dieses mit dem Ergebnis des Multiplizierers in einen Addierer
> wandert.

Exakt und leider ist das MATLAB nicht in der Lage, das selber zu 
berechnen. Du musst Dir die Zeitebenen selber denken und es korrekt zu 
einer pipeline zusammenbauen. Was MATLAB kann, ist die automatische 
Vergabe der FFs über das virtuelle Delay. Dazu hat Simulink, also das 
block set einen eigenen Block. Du musst auch schauen, welche Latenz der 
MUL vorgegeben hat. Leider wird auch das nirgends angezeigt, solange man 
nicht draufklickt.

Diese und andere Dinge sind für mich der Grund, warum ich dieses System 
mit dem System-Generator so in Frage stelle. Ich hätte von einem Tool 
erwartet, dass es das selber kann. Wenn MATLAB seine internen Modelle 
nutzt, rechnet es ja auch korrekt, egal, wielange er an einem Ergebnis 
gerechnet hat. Ich baue daher meine pipelines nach wie vor mit Excel!

Um das Problem zu entschärfen, kannst Du grössere Teile in VHDL 
formulieren, so wie Lothar das angedeutet hat und es in einen Block 
wrappen. Oder Du schreibst embedded MATLAB, wenn Dir das lieber ist.

Damit umgehst du auch den Datenmüll, den der Sysgen erzeugt, wenn Du mal 
an den Auflösungen herumschraubst. Beim Parsen werden, wie Du sicher 
schon gemerkt hast, jedesmal passende Adder und MUL-Primitiven von 
Xilinx instanziiert, statt einfaches VHDL zu generieren. Die alten und 
nicht mehr benötigten liegen dann tot im Verzeichnis rum und sorgen für 
weniger Übersicht. Zudem glaube ich nicht, dass die Synthese einen 
einmal instanziierten MUL wieder in Kombinatorik überführen und mit 
anderen kombinatorischen Elementen zusammenfasse kann, wie das bei 
nativem VHDL der Fall ist.


Ich wünsche Dir viel Spass mit Simulink:-)

von J. S. (engineer) Benutzerseite


Lesenswert?

Joul schrieb:
> Was hat das
> denn für einen Sinn? Multiplikation ohne Latenz??
Damit steuerst Du genau das, was oben beschrieben ist. Wenn Du zu wenig 
eingetragen hast, meckert er schon. "You can improove the 
performancee.")

Was ich nicht weiss, ist, ob es möglich ist, diesen Wert automatisch per 
Variable mit anderen zu veknüpfen, z.B. mit denen der Delays. So mache 
ich das in VHDL, wenn ich in einem Modul die Latenzen kontrolieren will, 
indem ich weniger FFs einsetze, weil die Technologie schneller ist und 
mehr Kombinatorik verträgt.

Was ich immer gemacht habe:

Ich habe den Signalen, die zu einer Zeitebene gehören, dieselbe Farbe 
gegeben. Damit hatte ich das wenigstens dokumentiert. Da hat dann die 
grafische Darstellung wenigstens ein kleines Plus. Insgesamt bin ich 
aber der Ansicht, dass die Methodik der Designbescheibung bei 
Matlab-Simulink die Übersichtlichkeit und das Designverständnis eher 
verschlechtert, als verbessert - gerade wegen der versteckten Delays.

Das, was ein dertiges Tool tun könnte und wo sein eigentliches Potenzial 
läge, tut es nicht.

Das Schlimmste, was einem der Sysgen und das blockset auferlegt, ist die 
Anpassung von Breitenwerten bei Vergleichen. Wehe, man hat nicht 
dieselbe Bitbreite vorgegeben und wehe, man will mal was ändern. Dann 
muss man den gesamten Pfad abändern, weil das Fortschreiten der 
Bitbreiten nicht mitberechnet wird. Selbst bei Nutzung eines didizierten 
Moduls schafft er es nicht: Bei Multiplieren packt er es gerade noch, 
auszurechnen, dass bei 8x12 Bit am Eingang 24 rauskommen können, aber 
schon beim Divider versagt er.

Das, was ich mit meiner Excel-Toolbox seit 15 Jahren mache, nämlich die 
Füllstände der Vektoren mitzuschleppen, Überläufe zu berechnen und die 
Bitbreiten automatisch auf die richtige reale Grösse einzustellen, statt 
nur auf die theoretische, schafft das Matlab peinlicherweise nicht.

Im Gegenteil: Im Vergleich zur Nutzung von VHDL und seinen generics, mit 
denen man eine Vektorverbreiterung in untergeordnete Module reintreiben 
kann, indem man es einfach vorprogrammiert, friert man bei der 
grafischen Eingabe mit MATLAB die Vektoren ein und verstellt sich 
Adaptivität.

von Joul (Gast)


Lesenswert?

Hallo Lothar,
danke für die schnelle Antwort.

Lothar Miller schrieb:
> Wenn du genau diese Formel hinschreibst, dann wirst du genau dieses
> Ergebnis bekommen. Und zwar sofort. Ohne Latenz.

Eine Latenz ist doch aber immer vorhanden!? Wenn ich vorne zwei 
Operanden mit einem Takt reinschiebe, dann ist doch nicht mit dem selben 
Takt schon das Ergebnis da.

Lothar Miller schrieb:
>> und für die Multiplikation einen Multiplizierer einsetze
> Du musst das nicht selber machen. Das macht der Synthesizer für dich...

Wozu sind dann die Multiplizierer als IP-Cores verfügbar?

von Christian R. (supachris)


Lesenswert?

Joul schrieb:
> Eine Latenz ist doch aber immer vorhanden!? Wenn ich vorne zwei
> Operanden mit einem Takt reinschiebe, dann ist doch nicht mit dem selben
> Takt schon das Ergebnis da.

Naja, eine kombinatorische Gatterlaufzeit, ja. Aber wenn die kleiner ist 
als die Taktperiode, dann ist das Ergebnis im gleichen Takt verfügbar 
und kann mit der nächsten Taktflanke weiterverarbeitet werden.

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


Lesenswert?

Joul schrieb:
> Eine Latenz ist doch aber immer vorhanden!? Wenn ich vorne zwei
> Operanden mit einem Takt reinschiebe, dann ist doch nicht mit dem selben
> Takt schon das Ergebnis da.
Wo ist in der verlinkten Beschreibung ein Takt?

Joul schrieb:
> Lothar Miller schrieb:
>>> und für die Multiplikation einen Multiplizierer einsetze
>> Du musst das nicht selber machen. Das macht der Synthesizer für dich...
> Wozu sind dann die Multiplizierer als IP-Cores verfügbar?
Weil du mit Sachkenntnis (frag Jürgen) und dem Handbuch zum 
Multiplizierer dann noch viel mehr anstellen kannst als der Automatismus 
vom Synthesizer.
> Wozu sind dann die Multiplizierer als IP-Cores verfügbar?
Du kannst auch einen Addierer als IP-Core haben. Oder einen Zähler. Auch 
einen Multiplexer. Und wenn man genau schaut ein Zweifach-Und-Gatter 
auch noch...

von Joul (Gast)


Lesenswert?

Christian R. schrieb:
> Naja, eine kombinatorische Gatterlaufzeit, ja. Aber wenn die kleiner ist
> als die Taktperiode, dann ist das Ergebnis im gleichen Takt verfügbar
> und kann mit der nächsten Taktflanke weiterverarbeitet werden.

Ok, ja klar! So macht das ja dann einen Sinn. Ich mein wie solls auch 
anders sein. Die Bücher über Verilog, die ich bisher gelesen hab gingen 
sehr theoretisch an die Sache ran und hörten meist nach der Synthese 
leider schon auf.


Jürgen S. schrieb:
> Was MATLAB kann, ist die automatische Vergabe der FFs über das virtuelle
> Delay.

Was meinst Du mit virtuellen Delays, Jürgen? Ist das genaue Verhalten 
bzw. die Arbeitsweise des System Generators noch irgendwo dokumentiert 
oder hast Du dir das Wissen darüber durch Ausprobieren angeeignet? Ich 
kenne bisher nur den "System Generator for DSP User Guide" welcher das 
ganze recht oberflächlich abhandelt.

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.