Kiedy używać STD_LOGIC zamiast BIT w VHDL

10

Jaka jest różnica między używaniem:

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

i

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

Jakie są ograniczenia korzystania z BIT w stosunku do STD_LOGIC i odwrotnie? Czy są one całkowicie wymienne? Rozumiem, że jeśli zdefiniowałem STD_LOGIC, nie mogę używać go z BIT_Vector, aby uzyskać dostęp do elementów w tablicy. Ale nie widzę różnicy.

Dziekan
źródło
stackoverflow.com/questions/12504884/std-logic-in-vhdl
Ciro Santilli 14 病毒 审查 六四 事件 法轮功

Odpowiedzi:

10

Bitjest predefiniowanym typem i może mieć tylko wartość 0lub 1. BitTyp jest wartość wyidealizowany.

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

std_logicjest częścią std_logic_1164pakietu i zapewnia bardziej realistyczne modelowanie sygnałów w systemie cyfrowym. Może mieć dziewięć różnych wartości. Zazwyczaj w kodzie można użyć tylko 0, 1i Z(High-Z). Ale U(Niezainicjowane) i X(Nieznane) są również bardzo przydatne podczas modelowania systemu w środowisku testowym.

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

std_logic_1164Pakiet zawiera również funkcje konwersji do konwersji std_logicdo Bit.

embedded.kyle
źródło
6

Większość ludzi korzysta std_logic. Pozwala to na u(niezdefiniowane), x(nieznane) i z(wysoka impedancja), czego nie robi bit. Chociaż nigdy nie możesz skrystalizować się w układzie i dlatego nie potrzebujesz z, ujest przydatny do znajdowania brakujących resetów. xjest przydatny do znajdowania wielu sterowników.

Brian Carlton
źródło
7
Myślę, że to zabawne, że wspominasz o przydatności Xdo znajdowania wielu sterowników. std_logicjest rzeczywiście standardem branżowym dla VHDL, ale jest także jedną z najczęściej wykorzystywanych funkcji VHDL. std_logicjest rozdzielczym sygnałem, co oznacza, że ​​funkcja jest używana do rozpoznania wartości sygnału w przypadku wielu sterowników. Ale w zdecydowanej większości przypadków wiele sterowników jest błędem. Użycie nierozwiązanego typu, takiego jak std_ulogicten, zostanie oznaczone przez kompilator jako błąd.
trondd,
@trondd: Dobra uwaga na temat std_ulogic. Ale pamiętaj, że wiele rdzeni zostanie napisanych, std_logicwięc prawdopodobnie zobaczysz niektóre z nich.
Brian Carlton,
1
std_logicjest rzeczywiście najbardziej rozpowszechnionym typem w okolicy; Po prostu twierdzę, że jego użycie nie jest zgodne z pierwotną intencją: Modelowanie sygnałów wielostanowych. Na wewnętrznych wzorów zwykle tylko rozważyć 1czy 0i jeden kierowca. Szczegółowa dyskusja na ten temat znajduje się na stronie electronics.stackexchange.com/questions/17524/ ...
trondd 24.12.12
5

std_logic ma funkcję rozdzielczości

Nie tylko std_logicmają więcej użytecznych stanów oprócz 1a 0, ma też funkcję zdefiniowaną rozdzielczości.

Funkcja rozdzielczości to koncepcja języka VHDL. Jest to funkcja powiązana z typem, która określa, co się stanie, gdy wiele wartości tego typu zostanie zastosowanych do pojedynczego sygnału. Składnia jest następująca:

SUBTYPE std_logic IS resolved std_ulogic;

gdzie std_ulogicjest nierozwiązana (a przez to znacznie mniej przydatna) wersja std_logic.

W szczególności oznacza to miłe rzeczy 0i 1prowadzi do 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;

Ma to intuicyjny sens, ponieważ rozumiemy Xstan, w którym wiele niezgodnych wartości jest stosowanych do jednego drutu.

std_logic wie także, jak rozwiązać każdą inną możliwą parę sygnałów wejściowych zgodnie z tabelą znajdującą się na LRM.

bit z drugiej strony nie ma funkcji rozdzielczości, a gdybyśmy użyli jej w powyższym przykładzie, doprowadziłoby to do błędu symulacji na GHDL 0.34.

Możliwe wartości std_logicsą dobrym wyborem, ponieważ są znormalizowane przez IEEE 1164 i dotyczą wielu typowych przypadków użycia.

Ciro Santilli
źródło
0

std_logic jest bogatszy niż bit i powinien być używany przez większość czasu.

Istnieje również typ boolowski , który, podobnie jak bit , ma dwie wartości. Jest to typ wyniku porównania, typ oczekiwany po IF [bool] lub WHEN [bool] , często używany do stałych selekcji:constant ENABLE_DEBUG_INTERFACE : boolean := true;

Jednym z miejsc, w których bit może być preferowany w stosunku do std_logic, są duże tablice, wspomnienia. Podczas optymalizacji symulatorów bit zajmuje mniej miejsca w pamięci symulatora niż std_logic . I może mieć znaczenie, jeśli Twój projekt tworzy jedną GB pamięci RAM.

Może być również szybszy w przypadku bardzo dużych projektów, na przykład czegoś generowanego automatycznie z listy bramek po syntezie.

Oczywiście ten aspekt wydajności nie jest częścią języka i zależy od implementacji symulatora VHDL.

TEMLIB
źródło