bus bidireccional en vhdl

0

Necesito entender el concepto de bus bidireccional. Lo que quiero hacer es conectar una memoria con puertos din y dout a un puerto de inout llamado datos. Así que junto con la memoria utilizo un búfer de tres estados como componente. Un búfer de estado triple tiene la señal rd como habilitada mientras que el otro tendrá (no leído) como habilitación, lo que significa escritura.así cuando escribo (lectura = 0), el valor fluye de los datos a din (en este momento, leído = 0 desactiva otro búfer de estado) por lo que no hay conducción de señales múltiples en este caso. De manera similar, cuando se lee = 1, ocurre lo contrario. el valor fluye de la memoria a la línea de datos. Así que la señal de lectura se encarga de la dirección. 1) Durante la lectura, ¿puede haber contención del valor que sale de la memoria y los datos de entrada? como el búfer que toma el valor de los datos a la memoria está deshabilitado. 2) En testbench cuando leo la memoria, ¿por qué es necesario dar datos < = 'Z'? ¿No me cuido cuando conecto los componentes usando el mapa de puertos?

    
pregunta user22348

1 respuesta

3

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'.

    
respondido por el user8352

Lea otras preguntas en las etiquetas