Quando utilizzare STD_LOGIC su BIT in VHDL


9

Qual è la differenza tra l'utilizzo di:

ENTITY MyDemo is 
    PORT(X: IN STD_LOGIC; F: OUT STD_LOGIC );
END MyDemo; 

e

ENTITY MyDemo is 
    PORT(X: IN BIT; F: OUT BIT );
END MyDemo; 

Quali sono i limiti dell'utilizzo di BIT su STD_LOGIC e viceversa? Sono completamente intercambiabili? Capisco che se ho definito STD_LOGIC non posso usarlo con un BIT_Vector per accedere agli elementi dell'array. Ma non riesco a vedere la differenza.


Risposte:


9

Bitè un tipo predefinito e può avere solo il valore 0o 1. Il Bittipo è un valore idealizzato.

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

std_logicfa parte del std_logic_1164pacchetto e fornisce una modellazione più realistica dei segnali all'interno di un sistema digitale. È in grado di avere nove valori diversi. In genere all'interno del codice che verrà utilizzato solo 0, 1e Z(High-Z). Ma U(Non inizializzato) e X(Sconosciuto) sono anche molto utili quando si modella il sistema in un banco di prova.

    -------------------------------------------------------------------    
    -- 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;

Il std_logic_1164pacchetto fornisce anche funzioni di conversione std_logicin cui convertire Bit.


5

Molte persone usano std_logic. Ciò consente u(indefinito), x(sconosciuto) e z(alta impedenza), mentre il bit no. Anche se potresti non tristare mai in un chip e quindi non è necessario z, uè utile per trovare i reset mancanti. xè utile per trovare più driver.


7
Penso che sia divertente menzionare l'utilità di Xtrovare più driver. std_logicè in effetti il ​​tipo standard di settore per VHDL, ma è anche una delle funzionalità più abusate di VHDL. std_logicè un segnale risolto, il che significa che una funzione viene utilizzata per risolvere il valore del segnale in caso di driver multipli. Ma nella stragrande maggioranza dei casi più driver è un errore. Usando un tipo non risolto come std_ulogicquesto verrebbe contrassegnato dal compilatore come un errore.
trondd

@trondd: buon punto std_ulogic. Ma tieni presente che verranno scritti molti core, std_logicquindi probabilmente ne vedrai alcuni.
Brian Carlton,

1
std_logicè davvero il tipo più comune in circolazione; Sto solo sostenendo che il suo utilizzo non è conforme all'intenzione originale: modellare segnali multi-stato. Per i progetti interni di solito consideriamo solo e / 1o 0un singolo driver. Vedi electronics.stackexchange.com/questions/17524/… per una discussione approfondita sull'argomento.
trondd

5

std_logic ha una funzione di risoluzione

Non solo std_logicavere stati più utili oltre 1e 0, ha anche una funzione di risoluzione definita.

Una funzione di risoluzione è un concetto di linguaggio VHDL. È una funzione associata a un tipo e determina cosa succede quando più valori di quel tipo vengono applicati a un singolo segnale. La sintassi è:

SUBTYPE std_logic IS resolved std_ulogic;

dov'è std_ulogicla versione irrisolta (e quindi molto meno utile) di std_logic.

In particolare, ciò implica cose piacevoli 0e 1porta a 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;

Ciò ha un senso intuitivo, poiché comprendiamo Xlo stato in cui più valori incompatibili vengono applicati a un singolo filo.

std_logic sa anche come risolvere ogni altra possibile coppia di segnali di ingresso secondo una tabella presente sull'LRM.

bit d'altra parte, non ha una funzione di risoluzione, e se lo avessimo usato nell'esempio sopra, porterebbe a un errore di simulazione su GHDL 0.34.

I possibili valori di std_logicsono una buona scelta perché sono standardizzati da IEEE 1164 e trattano molti casi d'uso comuni.


0

std_logic è più ricco di bit e in pratica dovrebbe essere usato la maggior parte delle volte.

C'è anche il tipo booleano che, come bit , ha due valori. È il tipo di confronto dei risultati, il tipo previsto dopo un IF [bool] o WHEN [bool] , spesso usato per le costanti di selezione:constant ENABLE_DEBUG_INTERFACE : boolean := true;

Un posto in cui il bit può essere preferito a std_logic è per array di grandi dimensioni, memorie. Sull'ottimizzazione dei simulatori, il bit occupa meno area nella memoria del simulatore rispetto a std_logic . E può importare se il tuo design crea un'istanza di un GB di RAM.

Può anche essere più veloce per progetti molto grandi, ad esempio qualcosa generato automaticamente dalla netlist post-sintesi a livello di gate.

Naturalmente, questo aspetto delle prestazioni non fa parte del linguaggio e dipende dall'implementazione del simulatore VHDL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.