Ich habe einen Mod-16-Zähler gebaut und das Ergebnis ist ein INTEGER (in allen Beispielen wurde INTEGER verwendet).
Ich habe einen Hex-zu-7-Segment-Display-Decoder gebaut, und sein Eingang ist ein STD_LOGIC_VECTOR (schrieb es so, weil es einfach war, die Wahrheitstabelle abzubilden).
Ich möchte den Ausgang des Zählers mit dem Eingang des Decoders verbinden, aber beim Versuch, in Quartus II zu kompilieren, erhalte ich 'Typinkongruenz'-Fehler.
Gibt es eine Möglichkeit, in einer VHDL-Auflistung einen INTEGER-Typ in einen STD_LOGIC_VECTOR-Typ umzuwandeln?
Angenommen, Ihr 4-Bit-Zähler hatte einen INTEGER-Ausgang SOME_INTEGER und Sie wollten ihn in einen 4-Bit-STD_LOGIC_VECTOR konvertieren
Sie können dies auch verwenden, um Vektoren mit aussagekräftigen Zahlen zu initialisieren
Möglicherweise müssen Sie "use IEEE.STD_LOGIC_ARITH.ALL" hinzufügen. und / oder STD_LOGIC_UNSIGNED.
Die komplementäre Operation ist conv_integer (vector). Ich benutze das gerne, wenn ich Vergleiche anstelle. Also könnte ich erklären
Und später kann ich dies in einer if-Anweisung verwenden
EDIT: Sie sollten die Variable nicht als Integer deklarieren müssen. Versuchen Sie stattdessen, die Deklaration in std_logic_vector zu ändern. Die Operatoren + und - arbeiten mit std_logic_vectors.
quelle
Sie könnten an der Verwendung der Typen
unsigned
undsigned
von interessiert seinieee.numeric_std
. Sie sind kompatibel mitstd_logic_vector
, haben aber eine numerische Interpretation (binär oder 2-Komplement). Es gibt auch die Möglichkeit, eine solche Interpretation zu verwendenstd_logic_vector
, dies wird jedoch nicht empfohlen .quelle
Wie die Hauptantwort sagt, lautet die empfohlene Methode wie folgt:
Ich möchte jedoch erläutern, warum dies empfohlen wird und warum VHDL eine scheinbar verschlungene Art der Konvertierung von Ganzzahlen in std_logic_vectors hat.
Es kommt darauf an, wie diese Typen von den Tools angezeigt werden.
Ein standard_logic_vector ist buchstäblich ein Bündel von Einsen oder Nullen. Ich habe 10001. Welche Nummer ist das? Es hängt davon ab. Ist es signiert oder nicht signiert? Das SLV weiß es nicht oder kümmert sich nicht darum. Wie viele Bits? Na, wie lange ist dein SLV?
Eine ganze Zahl ist vorzeichenbehaftet und normalerweise 32 Bit (wenn ich mich richtig erinnere).
Stufe 1: Verkürzen Sie meine Ganzzahl und geben Sie kein Vorzeichen ein. Das ist dieser Teil:
Stufe 2: Nehmen Sie diese Bits und verwenden Sie sie, um my_slv zu steuern.
(Eine Anmerkung zur Terminologie
A <= B
in VHDL wird laut vorgelesen, wenn "A wird von B gesteuert".)In Kombination erhalten Sie:
Wenn man von einem traditionellen Programmierhintergrund kommt, ist es sehr einfach, sich auf eine Programmier-Denkweise festzulegen. In VHDL hat der von Ihnen geschriebene Code jedoch physische Auswirkungen auf die Hardware. Zu wissen, warum diese Methode funktioniert und empfohlen wird, ist einen Schritt näher dran, darüber nachzudenken, was Sie hardwaremäßig schreiben.
Bonus-Tipp: Mit dem Präfix to_ gekennzeichnete Funktionen verkürzen / ändern die Operanden. Sie machen sie unsigniert oder eine bestimmte Länge oder beides. Aus diesem Grund müssen Sie bei to_unsigned die Länge angeben. Die Funktionen ohne to_ (in diesem Beispiel straight std_logic_vector (...)) werden verwendet, wenn Typen bereits direkt kompatibel sind. Msgstr "Nimm diese Bits und stopfe sie in diesen Typ, keine Modifikationen erforderlich". Diese haben kein Längenargument, da beide Seiten bereits gleich sind. Wenn ich solche Dinge konstruiere, muss ich nicht nachschlagen, sondern denke nur darüber nach, wie ich die Daten ändere.
quelle
Um eine Ganzzahl in std_logic_vector umzuwandeln, haben Sie mehrere Möglichkeiten. Verwenden von numeric_std:
oder
Verwenden von std_logic_arith:
std_logic_arith ist kein ieee-Standard, aber die meisten Tools kompilieren es in die IEEE-Bibliothek und es ist weit verbreitet.
quelle