Was ist der Unterschied zwischen der Verwendung von:
ENTITY MyDemo is
PORT(X: IN STD_LOGIC; F: OUT STD_LOGIC );
END MyDemo;
und
ENTITY MyDemo is
PORT(X: IN BIT; F: OUT BIT );
END MyDemo;
Was sind die Einschränkungen bei der Verwendung von BIT über STD_LOGIC und umgekehrt? Sind sie vollständig austauschbar? Ich verstehe, dass ich, wenn ich STD_LOGIC definiert habe, es nicht mit einem BIT_Vector verwenden kann, um auf die Elemente im Array zuzugreifen. Aber ich kann den Unterschied nicht erkennen.
Bit
ist ein vordefinierter Typ und kann nur den Wert 0
oder haben 1
. Der Bit
Typ ist ein idealisierter Wert.
type Bit is ('0', '1');
std_logic
ist Teil des std_logic_1164
Pakets und bietet eine realistischere Modellierung von Signalen innerhalb eines digitalen Systems. Es kann neun verschiedene Werte haben. Normalerweise verwenden Sie in Ihrem Code nur 0
, 1
, und Z
(High-Z). Aber U
(Uninitialized) und X
(Unknown) sind auch sehr nützlich, wenn das System in einer Testbench modelliert wird.
-------------------------------------------------------------------
-- logic state system (unresolved)
-------------------------------------------------------------------
TYPE std_ulogic IS ( 'U', -- Uninitialized
'X', -- Forcing Unknown
'0', -- Forcing 0
'1', -- Forcing 1
'Z', -- High Impedance
'W', -- Weak Unknown
'L', -- Weak 0
'H', -- Weak 1
'-' -- Don't care
);
-- attribute ENUM_ENCODING of std_ulogic : type is "U D 0 1 Z D 0 1 D";
-------------------------------------------------------------------
-- *** industry standard logic type ***
-------------------------------------------------------------------
SUBTYPE std_logic IS resolved std_ulogic;
Das std_logic_1164
Paket bietet auch Konvertierungsfunktionen zum Konvertieren std_logic
in Bit
.
Die meisten Leute benutzen std_logic
. Das ermöglicht u
(undefiniert), x
(unbekannt) und z
(hohe Impedanz), welches Bit dies nicht tut. Während Sie Tristate in einem Chip möglicherweise nie verwenden und daher nicht benötigen z
, u
ist es nützlich, um fehlende Resets zu finden. x
ist nützlich, um mehrere Treiber zu finden.
std_logic
hat eine Auflösungsfunktion
Neben und hat es nicht nur std_logic
weitere nützliche Zustände , sondern es ist auch eine Auflösungsfunktion definiert.1
0
Eine Auflösungsfunktion ist ein VHDL-Sprachkonzept. Es ist eine Funktion, die einem Typ zugeordnet ist und bestimmt, was passiert, wenn mehrere Werte dieses Typs auf ein einzelnes Signal angewendet werden. Die Syntax lautet:
SUBTYPE std_logic IS resolved std_ulogic;
wo std_ulogic
ist die nicht aufgelöste (und daher viel weniger nützliche) Version von std_logic
.
Dies impliziert insbesondere nette Dinge wie 0
und 1
führt zu X
:
library ieee;
use ieee.std_logic_1164.all;
entity std_logic_tb is
end std_logic_tb;
architecture behav of std_logic_tb is
signal s0 : std_logic;
begin
s0 <= '0';
s0 <= '1';
process
begin
wait for 1 ns;
assert s0 = 'X';
wait;
end process;
end behav;
Dies ist intuitiv sinnvoll, da wir X
den Zustand verstehen, in dem mehrere inkompatible Werte auf einen einzelnen Draht angewendet werden.
std_logic
weiß auch, wie jedes andere mögliche Paar von Eingangssignalen gemäß einer auf dem LRM vorhandenen Tabelle aufzulösen ist.
bit
hat andererseits keine Auflösungsfunktion, und wenn wir sie im obigen Beispiel verwendet hätten, würde dies zu einem Simulationsfehler bei GHDL 0.34 führen.
Die möglichen Werte von std_logic
sind eine gute Wahl, da sie durch IEEE 1164 standardisiert sind und viele gängige Anwendungsfälle abdecken.
std_logic ist reichhaltiger als bit und sollte grundsätzlich die meiste Zeit verwendet werden.
Es gibt auch den booleschen Typ, der wie bit zwei Werte hat. Es ist der Ergebnistyp von Vergleichen, der Typ, der nach einem IF [bool] oder einem WHEN [bool] erwartet wird und häufig für Auswahlkonstanten verwendet wird:constant ENABLE_DEBUG_INTERFACE : boolean := true;
Ein Ort, an dem Bit std_logic vorgezogen werden kann, ist für große Arrays, Speicher. Beim Optimieren von Simulatoren belegt bit weniger Platz im Speicher des Simulators als std_logic . Und es kann wichtig sein, ob Ihr Design ein GB RAM instanziiert.
Bei sehr großen Designs kann es auch schneller sein, z. B. bei etwas, das automatisch aus der Netzliste auf Gate-Ebene nach der Synthese generiert wird.
Dieser Leistungsaspekt ist natürlich nicht Teil der Sprache und hängt von der Implementierung des VHDL-Simulators ab.
trondd
X
zum Auffinden mehrerer Treiber erwähnen.std_logic
ist in der Tat der Industriestandardtyp für VHDL, aber es ist auch eine der am häufigsten missbrauchten Funktionen von VHDL.std_logic
ist ein aufgelöstes Signal, was bedeutet, dass eine Funktion verwendet wird, um den Wert des Signals im Falle mehrerer Treiber aufzulösen. Aber in den allermeisten Fällen sind mehrere Treiber ein Fehler. Die Verwendung eines solchen nicht aufgelösten Typsstd_ulogic
würde vom Compiler als Fehler markiert.Brian Carlton
std_ulogic
. Denken Sie jedoch daran, dass viele Kerne beschrieben werden,std_logic
sodass Sie wahrscheinlich einige davon sehen werden.trondd
std_logic
ist in der Tat die häufigste Art; Ich behaupte nur, dass seine Verwendung nicht der ursprünglichen Absicht entspricht: Modellierung von Signalen mit mehreren Zuständen. Für interne Designs berücksichtigen wir normalerweise nur1
oder0
und einen einzigen Treiber. Siehe electronic.stackexchange.com/questions/17524/… für eine ausführliche Diskussion zu diesem Thema.