Cuándo usar STD_LOGIC sobre BIT en VHDL


9

¿Cuál es la diferencia entre usar:

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

y

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

¿Cuáles son las limitaciones de usar BIT sobre STD_LOGIC y viceversa? ¿Son completamente intercambiables? Entiendo que si he definido STD_LOGIC no puedo usarlo con un BIT_Vector para acceder a los elementos de la matriz. Pero parece que no puedo ver la diferencia.


Respuestas:


9

Bites un tipo predefinido y solo puede tener el valor 0o 1. El Bittipo es un valor idealizado.

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

std_logices parte del std_logic_1164paquete y proporciona un modelado más realista de señales dentro de un sistema digital. Es capaz de tener nueve valores diferentes. Por lo general dentro de su código sólo se va a utilizar 0, 1y Z(High-Z). Pero U( Sin inicializar) y X(Desconocido) también son muy útiles al modelar el sistema en un banco de pruebas.

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

El std_logic_1164paquete también proporciona funciones de conversión para convertir std_logica Bit.


5

La mayoría de la gente usa std_logic. Eso permite u(indefinido), x(desconocido) y z(alta impedancia), que bit no. Si bien nunca puede tristarse en un chip y, por lo tanto, no es necesario z, ues útil para encontrar restablecimientos faltantes. xEs útil para encontrar múltiples controladores.


77
Creo que es divertido que mencione la utilidad de Xencontrar múltiples controladores. std_logicde hecho es el tipo estándar de la industria para VHDL, pero también es una de las características más mal utilizadas de VHDL. std_logices una señal resuelta, lo que significa que se utiliza una función para resolver el valor de la señal en caso de múltiples controladores. Pero en la gran mayoría de los casos, múltiples controladores es un error. Al usar un tipo no resuelto como std_ulogiceste, el compilador lo marcaría como un error.
trondd

@trondd: Buen punto sobre std_ulogic. Pero tenga en cuenta que se escribirán muchos núcleos, std_logicpor lo que probablemente verá algunos de ellos.
Brian Carlton

1
std_logices de hecho el tipo más común alrededor; Solo estoy argumentando que su uso no está de acuerdo con la intención original: el modelado de señales de múltiples estados. Para diseños internos, generalmente solo consideramos 1o 0un solo controlador. Visite electronics.stackexchange.com/questions/17524/… para una discusión exhaustiva sobre el tema.
trondd

5

std_logic tiene una función de resolución

No sólo std_logictienen estados más útiles, además 1y 0, también tiene una función de resolución definida.

Una función de resolución es un concepto de lenguaje VHDL. Es una función asociada a un tipo, y determina qué sucede cuando se aplican múltiples valores de ese tipo a una sola señal. La sintaxis es:

SUBTYPE std_logic IS resolved std_ulogic;

¿Dónde std_ulogicestá la versión no resuelta (y, por lo tanto, mucho menos útil) de std_logic.

En particular, esto implica cosas buenas como 0y 1conduce 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;

Esto tiene sentido intuitivo, ya que entendemos Xque es el estado donde se aplican múltiples valores incompatibles a un solo cable.

std_logic también sabe cómo resolver cualquier otro par posible de señales de entrada de acuerdo con una tabla presente en el LRM.

bit por otro lado, no tiene una función de resolución, y si la hubiésemos usado en el ejemplo anterior, daría lugar a un error de simulación en GHDL 0.34.

Los posibles valores de std_logicson una buena opción porque están estandarizados por IEEE 1164 y tratan muchos casos de uso comunes.


0

std_logic es más rico que bit , y básicamente debería usarse la mayor parte del tiempo.

También está el tipo booleano , que, como bit , tiene dos valores. Es el tipo de resultado de las comparaciones, el tipo esperado después de un IF [bool] o un WHEN [bool] , a menudo utilizado para las constantes de selección:constant ENABLE_DEBUG_INTERFACE : boolean := true;

Un lugar donde se puede preferir bit a std_logic es para grandes matrices, memorias. Al optimizar los simuladores, el bit ocupa menos área en la memoria del simulador que std_logic . Y puede importar si su diseño crea una instancia de un GB de RAM.

También puede ser más rápido para diseños muy grandes, por ejemplo, algo generado automáticamente a partir de la lista de redes de nivel de compuerta posterior a la síntesis.

Por supuesto, este aspecto del rendimiento no forma parte del lenguaje y depende de la implementación del simulador VHDL.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.