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.
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.