Es gibt viele Möglichkeiten, Ihr Ziel zu erreichen. Aber zuerst, um deine Punkte anzusprechen.
Wenn ich das jetzt mit IP Cores schreiben würde, wären es drei DSP IP Cores, und wegen der unterschiedlichen Portbreiten müsste ich diesen IP Core 3 mal generieren.
Nicht unbedingt. Wenn Ihre Eingaben a
bis g
alle Fixpunkte sind, können Sie ieee.numeric_std
verwenden oder in VHDL-2008 können Sie ieee.fixed_pkg
verwenden. Diese werden DSP-Kerne (wie den DSP48 auf Xilinx) ableiten. Zum Beispiel:
-- Assume a, b, and c are all signed integers (or implicit fixed point)
signal a : signed(7 downto 0);
signal b : signed(7 downto 0);
signal c : signed(7 downto 0);
signal p1 : signed(a'length+b'length downto 0); -- a times b produces a'length + b'length +1 (which also corresponds to (a times b) - c adding one bit).
...
p1 <= a*b - resize(c, p1'length);
Dies wird Multiplikatoren und Addierer bedeuten.
Und dies kann ähnlich mit UFIXED
oder SFIXED
getan werden. Aber Sie müssen die Bitbreiten verfolgen.
Auch gibt es ein Gleitkomma-Paket (ieee.float_pkg
), aber ich würde das für Hardware nicht empfehlen. Sie sind besser Timing und Ressourcen-weise, um es in Fixpunkt zu implementieren.
Jedes Mal wenn ich einige dieser externen Signale ändere, würden sich alle Breiten wieder ändern. Den Überblick über all diese Größenänderungen zu behalten, ist ein Schmerz.
Sie können dies automatisch tun. Schau dir mein Beispiel oben an. Sie können Breiten basierend auf den Vorgängen einfach bestimmen. Multiplikationen summieren die Anzahl der Bits. Zusätze fügen ein einzelnes Bit hinzu. Also, wenn ich:
y <= a * b;
Dann kann ich die Länge der y
als einfach a'length + b'length
abzuleiten. Es kann getan werden.Das Problem ist jedoch ein bisschen Wachstum. Die Kette von Operationen, die Sie beschreiben, wird erheblich zunehmen, wenn Sie die volle Genauigkeit behalten. An bestimmten Punkten müssen Sie abschneiden oder runden, um die Anzahl der Bits zu reduzieren. Dies ist der schwierige Teil. Wie viel Fehler Sie tolerieren können, hängt vom Algorithmus und der erwarteten Dateneingabe ab.
Ich habe viel Mathematik und damit viel DSP-Logik. Es wäre einfacher, diesen Block mit einem HLS-Tool zu schreiben. Idealerweise möchte ich, dass die Daten entsprechend gehandhabt werden.
Automatische Handhabung ist der schwierige Teil. In VHDL wird dies nicht passieren (und auch nicht Verilog). Aber Sie können es ziemlich gut verfolgen und Bit-Breiten-Aktualisierung wie notwendig haben. Aber es wird nicht automatisch Dinge wie Rundung, Kürzung und das Verwalten von Fehlergrenzen behandeln. Ein DSP-Techniker sollte diese Probleme lösen und den RTL-Entwickler auf die entsprechenden Breiten und den Zeitpunkt des Rundens oder Kürzens hinweisen.
Gibt es ein solches Tool? Welchen würdest du empfehlen?
Es gibt eine Vielzahl von Optionen, um dies auf einer höheren Ebene zu tun. Keines davon ist in Bezug auf Ressourcen besonders sparsam. Matlab verfügt über ein Tool zur Code-Generierung, das Matlab-Modelle (entsprechend konstruiert) in RTL konvertiert. Es werden sogar Probleme wie Runden, Abschneiden und Bestimmen der geeigneten Bitbreiten analysiert. Sie können die Genauigkeit steuern, aber es ist Fixpunkt. Wir haben damit gespielt und fanden es weit davon entfernt, effizienten, schnellen Code zu produzieren.
Alternativ verfügt Xilinx über eine HLS-Suite (siehe Vivado). Ich bin nicht so versiert in der Methodik, aber wie ich es verstehe, erlaubt es C-Code schreiben, um Algorithmen zu implementieren. Das C-Doe wird dann zu etwas "synthetisiert", das in einer Art von Ausführungs-Engine ausgeführt wird. Sie müssen diesen C-Code immer noch mit der RTL-Infrastruktur verbinden, und das ist eine Herausforderung für sich. Der Grund, warum wir es bisher nicht stark verfolgt haben (obwohl wir DSP-Designs machen) ist, dass es eine große Herausforderung ist, HLS und RTL zusammen als System zu simulieren.
VHDL-2008-Features in Vivado 2.016,1 Krieg sehr einfach. Es ist nicht der volle Funktionsumfang. – Paebbels
Ich würde wirklich gerne ein HLS-Tool, das die Anzahl der Bit-Signale verwendet, die Größen ändern, als den Code überprüfen zu müssen. Es würde die Produktivität beschleunigen. – fiz
Wenn Sie ein oder zwei HLS-Tools verwendet haben, werden Sie feststellen, dass die Produktivität/Design-Beschleunigung für ein erstes Arbeitsergebnis sehr hoch ist, aber das generierte Design ist schrecklich. Dann verbringen Sie Tage und Wochen, um das Design zu verbessern, was Ihre Design-Geschwindigkeit verringert, aber Ihre Ergebnisse verbessert ... am Ende könnten Sie an der Stelle sein zu sagen: "Wenn ich mit VHDL angefangen hätte, wäre ich schon fertig, und das Design wäre viel schneller oder verwenden weniger Ressourcen. " – Paebbels