Wann wird STD_LOGIC über BIT in VHDL verwendet?


9

Was ist der Unterschied zwischen:

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 STD_LOGIC nicht mit einem BIT_Vector verwenden kann, um auf die Elemente im Array zuzugreifen, wenn ich STD_LOGIC definiert habe. Aber ich kann den Unterschied nicht erkennen.


Antworten:


9

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 innerhalb des Codes werden Sie nur verwenden 0, 1und Z(High-Z). Aber U(Uninitialized) und X(Unbekannt) ist auch sehr nützlich , wenn das System in einer Testumgebung zu modellieren.

    -------------------------------------------------------------------    
    -- 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 enthält auch Konvertierungsfunktionen zu konvertieren std_logiczu Bit.


5

Die meisten Leute benutzen std_logic. Das erlaubt u(undefiniert), x(unbekannt) und z(hochohmig), was Bit nicht tut. Während Sie möglicherweise nie in einem Chip tristieren und daher nicht benötigen z, uist dies nützlich, um fehlende Resets zu finden. xist nützlich, um mehrere Treiber zu finden.


7
Ich finde es lustig, dass Sie die Nützlichkeit erwähnen X, mehrere Treiber zu finden. std_logicist in der Tat der Industriestandardtyp für VHDL, aber es ist auch eines der am häufigsten missbrauchten Merkmale von VHDL. std_logicist ein aufgelöstes Signal, was bedeutet, dass eine Funktion verwendet wird, um den Wert des Signals bei mehreren Treibern aufzulösen. In den allermeisten Fällen sind jedoch mehrere Treiber ein Fehler. Wenn Sie einen solchen ungelösten Typ verwenden, wird std_ulogicdies vom Compiler als Fehler markiert.
Trondd

@trondd: Guter Punkt über std_ulogic. Beachten Sie jedoch, dass viele Kerne mit geschrieben werden, std_logicsodass Sie wahrscheinlich einige davon sehen werden.
Brian Carlton

1
std_logicist in der Tat der häufigste Typ; Ich argumentiere nur, dass seine Verwendung nicht der ursprünglichen Absicht entspricht: Modellierung von Mehrzustandsignalen. Bei internen Designs berücksichtigen wir normalerweise nur 1oder 0und einen einzelnen Treiber. Eine ausführliche Diskussion zu diesem Thema finden Sie unter electronic.stackexchange.com/questions/17524/… .
Trondd

5

std_logic hat eine Auflösungsfunktion

Außerdem gibt es nicht nur std_logicnützlichere Zustände 1und 0auch eine definierte Auflösungsfunktion.

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 ungelöste (und damit viel weniger nützliche) Version von std_logic.

Dies impliziert insbesondere schöne 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 verstehen X, dass 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 aufgelöst wird.

bit Auf der anderen Seite gibt es 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 behandeln.


0

std_logic ist reicher als Bit und sollte grundsätzlich die meiste Zeit verwendet werden.

Es gibt auch den booleschen Typ, der wie Bit zwei Werte hat. Dies 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 gegenüber std_logic bevorzugt werden kann, sind große Arrays und Speicher. Bei der Optimierung von Simulatoren belegt das Bit weniger Speicherplatz im Speicher des Simulators als std_logic . Und es kann wichtig sein, ob Ihr Design 1 GB RAM instanziiert.

Es kann auch für sehr große Designs schneller sein, z. B. für etwas, das automatisch aus einer Netzliste auf Gate-Ebene nach der Synthese generiert wird.

Natürlich ist dieser Leistungsaspekt nicht Teil der Sprache und hängt von der Implementierung des VHDL-Simulators ab.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.