Wann sollte STD_LOGIC über BIT in VHDL verwendet werden?

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.

Antworten (4)

Bitist ein vordefinierter Typ und kann nur den Wert 0oder haben 1. Der BitTyp ist ein idealisierter Wert.

type Bit is ('0', '1');

std_logicist Teil des std_logic_1164Pakets 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_1164Paket bietet auch Konvertierungsfunktionen zum Konvertieren std_logicin 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, uist es nützlich, um fehlende Resets zu finden. xist nützlich, um mehrere Treiber zu finden.

Ich finde es lustig, dass Sie die Nützlichkeit von Xzum Auffinden mehrerer Treiber erwähnen. std_logicist in der Tat der Industriestandardtyp für VHDL, aber es ist auch eine der am häufigsten missbrauchten Funktionen von VHDL. std_logicist 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 Typs std_ulogicwürde vom Compiler als Fehler markiert.
@trondd: Guter Punkt über std_ulogic. Denken Sie jedoch daran, dass viele Kerne beschrieben werden, std_logicsodass Sie wahrscheinlich einige davon sehen werden.
std_logicist 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 nur 1oder 0und einen einzigen Treiber. Siehe electronic.stackexchange.com/questions/17524/… für eine ausführliche Diskussion zu diesem Thema.

std_logichat eine Auflösungsfunktion

Neben und hat es nicht nur std_logicweitere nützliche Zustände , sondern es ist auch eine Auflösungsfunktion definiert.10

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_ulogicist die nicht aufgelöste (und daher viel weniger nützliche) Version von std_logic.

Dies impliziert insbesondere nette Dinge wie 0und 1fü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 Xden Zustand verstehen, in dem mehrere inkompatible Werte auf einen einzelnen Draht angewendet werden.

std_logicweiß auch, wie jedes andere mögliche Paar von Eingangssignalen gemäß einer auf dem LRM vorhandenen Tabelle aufzulösen ist.

bithat 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_logicsind eine gute Wahl, da sie durch IEEE 1164 standardisiert sind und viele gängige Anwendungsfälle abdecken.

Verwandte: https://stackoverflow.com/questions/12504884/what-is-the-purpose-of-the-std-logic-enumerated-type-in-vhdl

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.