Tome la siguiente descripción de diseño de VHDL:
library ieee;
use ieee.std_logic_1164.all;
entity bidir is
port (
Z : inout std_logic;
Y : out std_logic;
OE : in std_logic;
A : in std_logic
);
end;
architecture behave of bidir is
begin
Z <= A when OE = '1' else
'Z' when OE = '0' else
'X';
Z <= 'H'; -- pullup
Y <= TO_X01(Z);
end behave;
Hay potencialmente tres o más controladores para la red conectada al modo en el puerto Z. Hay dos controladores locales: los dos indicadores de señal concurrentes, uno desde el puerto A, en función de la OE de habilitación de salida (y las incógnitas desconocidas), el otro un pullup.
Puede haber algún número de controladores externos en la red a los que Z esté conectado, potencialmente ninguno. El valor de esa red de señal está determinado por una función de resolución.
Esto introduce la distinción entre el valor controlado de un controlador y el valor efectivo de la red de señal. El valor de la red de señal en una expresión es la salida de la función de resolución, y no el controlador más cercano.
En una simulación temporizada, o en el caso de las habilitaciones de salida de dos de estos búferes con la habilitación de salida entregada en diferentes ciclos delta (una segunda señal para una de las habilitaciones de salida derivada de la otra por una asignación de señal) , puede haber superposición entre los controladores activos. Por lo general, lógicamente Y se selecciona un chip con la habilitación de salida para evitar habilitaciones superpuestas en varios controladores. Si los valores controlados de los múltiples controladores son diferentes (por ejemplo, un '1', el otro '0'), verá una resolución de 'X' durante la simulación de VHDL para la superposición.
El pullup implica que el valor predeterminado de la red de señal es 'H' cuando no hay controladores 'activos' que proporcionen valores fuertes ('1' o '0'). Normalmente, se 'filtra' la 'H' a un '1' utilizando una función de conversión (por ejemplo, TO_XO1) en la señal que se usa internamente en la teoría de que las señales no controladas que flotan en la región de conmutación para un búfer de entrada son una cosa mala, que puede causar altas cargas de corriente transitoria y un posible bloqueo.
Con std_logic hay dos formas de asegurarse de que un controlador no interfiera con otro. std_logic es un tipo resuelto, que utiliza una tabla de resolución para determinar el valor efectivo, toma dos señales a la vez (un valor de resultado y cada controlador, a su vez, el resultado inicializado a 'Z.
constant resolution_table : stdlogic_table := (
-- ---------------------------------------------------------
-- | U X 0 1 Z W L H - | |
-- ---------------------------------------------------------
('U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'), -- | U |
('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'), -- | X |
('U', 'X', '0', 'X', '0', '0', '0', '0', 'X'), -- | 0 |
('U', 'X', 'X', '1', '1', '1', '1', '1', 'X'), -- | 1 |
('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X'), -- | Z |
('U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X'), -- | W |
('U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X'), -- | L |
('U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X'), -- | H |
('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X') -- | - |
);
Los dos ejes de la tabla de resolución son las dos entradas. Podría observar que cada intersección de 'Z' en una entrada da como resultado el valor sin cambios de la otra entrada. 'Z' es un valor seguro.
Especificar una salida 'Z' para un controlador 'inactivo' es lo correcto para un modelo de comportamiento puro.
Un modelo estructural puede usar una especificación de desconexión en una señal protegida, especificando cuánto tiempo después de un evento se activa una señal. Cuando no está activado (desconectado) no está involucrado en la resolución.
Sin desconectar un controlador, la única forma de que un controlador no esté involucrado en el valor de resolución de una red de múltiples controladores es conducirlo a 'Z'.