Quando usar STD_LOGIC sobre BIT em VHDL

9

Qual é a diferença entre usar:

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; 

Quais são as limitações do uso do BIT sobre STD_LOGIC e vice-versa? Eles são completamente capazes de intercambiar? Entendo que, se eu definir STD_LOGIC, não posso usá-lo com um BIT_Vector para acessar os elementos na matriz. Mas eu não consigo ver a diferença.

reitor
fonte
stackoverflow.com/questions/12504884/std-logic-in-vhdl
Ciro Santilli冠状病毒审查六四事件法轮功

Respostas:

9

Bité um tipo predefinido e só pode ter o valor 0ou 1. O Bittipo é um valor idealizado.

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

std_logicfaz parte do std_logic_1164pacote e fornece modelagem de sinais mais realista em um sistema digital. É capaz de ter nove valores diferentes. Normalmente dentro de seu código você só vai usar 0, 1e Z(High-Z). Mas U(Não inicializado) e X(Desconhecido) também são muito úteis ao modelar o sistema em um banco de testes.

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

O std_logic_1164pacote também fornece funções de conversão para converter std_logica Bit.

embedded.kyle
fonte
5

A maioria das pessoas usa std_logic. Isso permite u(indefinido), x(desconhecido) e z(alta impedância), que bit não. Embora você nunca tristate em um chip e, portanto, não precise z, ué útil para encontrar redefinições ausentes. xé útil para encontrar vários drivers.

Brian Carlton
fonte
7
Eu acho engraçado você mencionar a utilidade de Xencontrar vários drivers. std_logicé realmente o tipo padrão do setor para VHDL, mas também é um dos recursos mais mal utilizados do VHDL. std_logicé um sinal resolvido, o que significa que uma função é usada para resolver o valor do sinal no caso de vários drivers. Mas na grande maioria dos casos, vários drivers são um erro. O uso de um tipo não resolvido como std_ulogicesse seria marcado pelo compilador como um erro.
trondd
@ondond: Bom argumento sobre std_ulogic. Mas lembre-se de que muitos núcleos serão gravados, std_logicportanto você provavelmente verá alguns deles.
Brian Carlton
11
std_logicé realmente o tipo mais comum; Estou apenas argumentando que seu uso não está de acordo com a intenção original: modelagem de sinais de vários estados. Para projetos internos, geralmente consideramos apenas 1ou 0um driver. Consulte electronics.stackexchange.com/questions/17524/… para uma discussão completa sobre o tópico.
trondd
5

std_logic tem uma função de resolução

Não só std_logictêm estados mais úteis além 1e0 , ele também tem uma função de resolução definido.

Uma função de resolução é um conceito de linguagem VHDL. É uma função que está associada a um tipo e determina o que acontece quando vários valores desse tipo são aplicados a um único sinal. A sintaxe é:

SUBTYPE std_logic IS resolved std_ulogic;

onde std_ulogicestá a versão não resolvida (e, portanto, muito menos útil) de std_logic.

Em particular, isso implica coisas boas como 0e 1leva 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;

Isso faz sentido intuitivo, pois entendemos Xser o estado em que vários valores incompatíveis são aplicados a um único fio.

std_logic também sabe como resolver todos os outros possíveis pares de sinais de entrada de acordo com uma tabela presente no LRM.

bit por outro lado, não possui uma função de resolução e, se a tivéssemos usado no exemplo acima, levaria a um erro de simulação no GHDL 0.34.

Os possíveis valores de std_logicsão uma boa opção, pois são padronizados pelo IEEE 1164 e lidam com muitos casos de uso comuns.

Ciro Santilli adicionou uma nova foto
fonte
0

O std_logic é mais rico que o bit e deve basicamente ser usado na maioria das vezes.

Há também o tipo booleano , que, como bit , tem dois valores. É o tipo de resultado resultante das comparações, o tipo esperado após um IF [bool] ou um WHEN [bool] , frequentemente usado para constantes de seleção:constant ENABLE_DEBUG_INTERFACE : boolean := true;

Um lugar onde o bit pode ser preferido em relação ao std_logic é para grandes matrizes, memórias. Ao otimizar simuladores, o bit ocupa menos área na memória do simulador que o std_logic . E pode ser importante se o seu design instancia um GB de RAM.

Também pode ser mais rápido para projetos muito grandes, por exemplo, algo gerado automaticamente a partir da netlist no nível de porta pós-síntese.

Obviamente, esse aspecto do desempenho não faz parte da linguagem e depende da implementação do simulador VHDL.

TEMLIB
fonte