Fügen Sie mit Carry in VHDL + Operator hinzu

Da ich einige Dokumente zur Bibliothek überprüft habe, ieee.std_logic_arithscheint die resultierende Länge von A+B64-Bit zu sein, wenn sowohl Aals auch B64-Bit sind.

Ich möchte wissen, ob es ieee.std_logic_aritheinen Add-Operator gibt, der Carry generiert (so dass der Operator eine 65-Bit-Ausgabe zum Addieren von zwei 64-Bit-Operanden generiert)?

ieee.numeric_std liefert als Ergebnis die Länge des linken Operanden. Sie könnten ein führendes Vorzeichenbit oder Nullbit (für unsigned) mit dem linken Operanden verketten, um Ihr 65-Bit-Ergebnis zu erzeugen. Ein Blick durch die Quelle für std_logic_arith von Synopsys zeigt, dass "+" dasselbe tut.
Bitte verwenden Sie nicht die Bibliothek ieee.std_logic_arith. Es ist veraltet und macht Probleme bei der Kombination mit anderen.
Ich schlage vor, dass Sie die std_numeric-Bibliothek anstelle von arithm verwenden ... Einige Details können Sie hier sehen: userweb.eng.gla.ac.uk/scott.roy/DCD3/05_Arithmetic.pdf
@Botnic Sie schlagen also vor, std_numberic zu verwenden? Können Sie außerdem einige der std_logic_arith-Probleme nennen oder einen Link dazu bereitstellen?
@Botnic Wie im Link beschrieben, da ich Synopsys verwenden werde, um meinen Code zu synthetisieren, wäre std_logic_arith immer noch eine bessere Wahl. Verlinkung sagt:If you are using Synopsys, use std_logic_arith, and if you are not using Synopsys, use numeric_std (if it is supported). This is not completely portable, since the functions are still different (for example, TO_UNSIGNED vs. CONV_UNSIGNED), but it is a lot better than using different types in different environments.
@ user8352 Bitte poste deinen Kommentar als Antwort, damit ich ihn akzeptieren kann. Es wäre wünschenswert, wenn Sie ein Muster zur Verfügung stellen, um anderen zu helfen.

Antworten (3)

ieee.numeric_std liefert als Ergebnis die Länge des linken Operanden. Sie könnten ein führendes Vorzeichenbit oder Nullbit (für unsigned) mit dem linken Operanden verketten, um Ihr 65-Bit-Ergebnis zu erzeugen.

Ein Blick durch die Quelle für std_logic_arith von Synopsys zeigt, dass "+" dasselbe tut.

Library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
use ieee.std_logic_arith.all;

entity adder65bit is
    port (
        a,b:    in  unsigned(63 downto 0);
        carry:  out std_logic;
        sum:    out unsigned (63 downto 0)
    );
end entity;

    architecture foo of adder65bit is 
    signal temp:  unsigned(64 downto 0);
    begin
        temp <= '0' & a +  b;
        sum <= temp (63 downto 0);
        carry <= temp(64);
end architecture;

Sie haben weder signiert noch unsigniert angegeben, dies ist unsigned, die Operanden und die Ergebnisse können stattdessen signiert oder unsigned sein.

Dieser Code analysiert, erarbeitet und simuliert. Es funktioniert, indem der linke Operand auf 65 Bit eingestellt wird. Sie haben Carry erwähnt, damit es mit einem in einer Methode angezeigt wird, die mit früheren Implementierungen von VHDL-Tools kompatibel ist.

Beachten Sie, dass die Operatoren „&“ und „+“ dieselbe Priorität haben, sie werden in der Reihenfolge ausgeführt, in der sie von links nach rechts gefunden werden.

adder65bit_tb.png

Die Ergebnislänge ist die gleiche wie die Länge des linken Operanden. Sie müssen also überlegen, wie viele Bits das Ergebnis haben wird, um die Summanden zu deklarieren. Es wird kein Übertrag erzeugt.

Ich würde vorschlagen, dass Sie Ihre Eingaben explizit um 1 Bit erweitern (vorzeichenbehaftet) oder mit null Bit erweitern (ohne Vorzeichen). Dadurch wird sichergestellt, dass Sie das Übertragsbit beibehalten, aber es wird auch dem zukünftigen Leser Ihres Codes deutlich machen, dass Sie ausdrücklich den Übertrag beibehalten. Ich würde außerdem vorschlagen, Kommentare abzugeben, in denen Sie Ihre Absicht beschreiben.

Selbst wenn Sie dies implizit tun könnten, würde ich dennoch vorschlagen, dass Sie es explizit tun, damit der Benutzer Ihre Datei(en) nicht durchlaufen muss, um festzustellen, ob die Größe des Ausgabevektors gleich oder um 1 größer als die Eingaben ist.