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
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.
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:-)
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.
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?
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.
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...
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.