std_logic ejemplo mínimo

0

Con respecto a los diferentes tipos de std_logic en VHDL, hay poca información sobre las diferencias reales entre algunos tipos.

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

¿Por qué hay una necesidad de WEAKs? ¿Cuál es la diferencia entre - (no importa) y U ? ¿Hay algún ejemplo que muestre por qué los DÉBILES son necesarios? ¿En qué situaciones debería alguien usarlos (o - )? ¿Cuándo ocurre X ? Un ejemplo mínimo debería aclararlo.

    
pregunta mahmood

1 respuesta

1

'U' solo significa que una señal no se activa. Si tienes:

signal sig : std_logic;

y nunca lo asigne, entonces si observa esta señal en un simulador, tendrá un valor 'U' .

'-' es útil si tiene una función lógica de algún tipo en la que realmente no le importa cuál es el resultado en una o más condiciones particulares. Esto permite que una herramienta de síntesis optimice el diseño de manera que la salida en este caso sea la que utilice la cantidad mínima de recursos FPGA. Probablemente hay otros usos para él también.

'L' y 'H' son útiles en bancos de prueba para modelar interfaces externas que dependen de resistencias de subida / bajada para parte de su operación. Un buen ejemplo de esto sería I2C, donde modelar el bus correctamente, solo conduciría las señales de su FPGA bajo ( '0' ) o Alto-Z ( 'Z' ), y luego modelaría el pull-up externo como una asignación permanente a 'H' en su banco de pruebas. Por ejemplo:

-- In FPGA:
process (i2c_data)
begin
  if (i2c_data = '0') then
    i2c_sda_pin <= '0';
  else
    i2c_sda_pin <= 'Z';
  end if;
end process;

-- In test bench, 'i2c_sda_pin' is connected to signal 'i2c_sda'
i2c_sda <= 'H';

El resultado será una señal que alterna entre 'H' y '0' ; esto permite que se conecte a múltiples dispositivos I2C en el banco de pruebas, evitando cualquier posibilidad de contención ( 'X' ).

Como nota al margen, este es un ejemplo de donde el estilo clk'event and clk = '1' de detección de bordes no funciona; el reloj I2C alternaría entre '0' y 'H' . rising_edge(clk) funciona de manera mucho más intuitiva.

'X' suele ser el resultado de dos procesos que intentan conducir la misma señal con diferentes valores de una manera que no se puede resolver, es decir, cuando hay contención en una señal. Por ejemplo:

p1 : process(sig)
begin
  output <= '0';
end process;

p2 : process(sig)
begin
  output <= '1';
end process;

El resultado será que output toma el valor 'X' , porque no hay manera de resolver las dos salidas. Piense en esto como una línea de señal con dos pines de salida en ella. Mientras ambos manejen el mismo valor, la línea se verá bien. Si ambos controlan valores diferentes, habrá conflicto y no se puede confiar en el estado de la línea.

Si cambiamos el segundo proceso a:

p2 : process(sig)
begin
  output <= 'L';
end process;

output tomará el valor '1' , porque un '1' fuerte reemplaza a un 'L' débil. Piense en esto como si se conectara un pin de salida lógica a una línea con una resistencia desplegable débil; si el pin se mueve alto, la línea irá alta.

También puede ser útil conducir una señal con 'X' , por ejemplo, para simular el tiempo de una interfaz externa.

'W' es el resultado resuelto cuando una señal se controla con 'L' y 'H' . No sé si hay un caso de uso para establecer a propósito una señal a 'W' , pero seguramente habrá uno en algún lugar.

El resultado cuando se manejan dos valores de std_logic en la misma señal está determinado por la 'función de resolución' para este tipo, y el hecho de que std_logic es un 'tipo resuelto', es decir, existe una función de resolución para él. Es lo que lo hace especial. Hay una pregunta existente aquí que mira la resolución particular función para std_logic con más detalle.

    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas