¿Por qué asignamos nuestras salidas a las señales primero en VHDL?

4

En muchos códigos VHDL vi que las salidas de datos / control se asignan primero a las señales y luego a los puertos de salida, y no instantáneamente a los puertos de salida.

Daré un ejemplo:

entity ex is
port (clk, rst : in std_logic;
      ....
      data_out : out std_logic);
end entity;

Architecture ex of ex is
signal data_out_sig : std_logic;
Begin
    process(clk,rst)
    begin
       ....
       data_out_sig <= some_data;
       ....
    end process;
data_out <= data_out_sig;
End Architecture;

Mi pregunta es, ¿por qué no asignamos some_data instantáneamente al puerto de data_out ? ¿Por qué "tiene que pasar" la señal data_out_sig ? ¿Tiene esto algo que ver con la síntesis? ¿Es práctica común?

¡Gracias!

    
pregunta Eran

3 respuestas

3

Te diré un escenario. Supongamos que está creando una entidad con

  

2 puertos de entrada: A, B

     

2 puertos de salida: C, D

Supongamos que la salida C se genera a partir de A y B usando alguna lógica. Y Supongamos que D se encuentra directamente relacionado con C. Por ejemplo:

  

D = cumplido de C

Por lo tanto, es obligatorio escribir el código: D = not C directamente, en lugar de usar una expresión lógica con y A y B. Sin embargo, la semántica VHDL no lo hace t le permite leer el puerto de salida C y, por lo tanto, no puede implementar dicha expresión. Entonces, lo que puedes hacer es convertir ese puerto en un puerto de almacenamiento intermedio. Algunas personas también utilizan el puerto de entrada / salida para este propósito. Pero eso hace que la cosa sea compleja. Por lo tanto, una solución simple es usar una señal interna local C_int y "usarla" como el puerto de salida dentro de su código. Para que pueda implementar la lógica para C en esta señal interna, léala y manipule con ella. Finalmente, la asignación de esta señal interna al puerto de salida, fuera de todos los bloques de proceso, completa el requisito. Una ilustración de ejemplo de lo que está sucediendo dentro del circuito:

    
respondido por el MITU RAJ
4

Se debe a que no pudo leer desde puertos de tipo OUT en VHDL.

Si el valor que controla un puerto OUT se debe leer dentro del diseño, se debe usar una señal para mantenerlo, luego esa señal asignada al puerto OUT.

La capacidad para hacerlo se agregó en VHDL-2008. Sin embargo, se crearon una gran cantidad de diseños antes de 2008 y antes de que la utilización de VHDL-2008 estuviera disponible en las herramientas de software. Estos diseños, por lo tanto, utilizarían el método de salida de señales.

Además, depende de sus circunstancias como ingeniero, pero es posible que la opción de usar VHDL-2008 no esté disponible para usted. Algunas compañías requerirán que las revisiones de diseño sean sintetizadas o simuladas por una versión específica del software (Quartus, Xilinx ISE, ModelSim, etc.) sin cambios en la configuración del proyecto de diseño, por lo que no puede usar VHDL-2008. He trabajado en muchas compañías que hacen esto, por ejemplo, en compañías de defensa. Pasar a una versión más nueva del software presenta un riesgo innecesario de cambios inesperados que pueden desacreditar todas las pruebas y la experiencia adquirida con ese firmware hasta ahora, con el tiempo y los gastos que conlleva. Por lo tanto, hay mucho valor en escribir VHDL 'en la mitad del camino' que será aceptado por la gama más amplia de herramientas de software que pueda, en lugar de usar una sintaxis específica para VHDL-2008 o VHDL-2002. Las desventajas de esto son pocas o ninguna: no tengo conocimiento de nada que no pueda hacer en las versiones anteriores que requiere la gran mayoría de los diseños. Como dije, depende de tus circunstancias y es algo a considerar. Para mí, definitivamente usaría señales de salida. Ser completamente portátil entre las herramientas de software y las versiones es valioso para mí y una de mis prioridades.

    
respondido por el TonyM
3

Si la señal de un puerto de salida también se lee, debe utilizar el tipo de puerto 'buffer'.

Eso por sí solo no sería un problema, pero si ese puerto de 'salida' sube por una cadena jerárquica de módulos, tiene que cambiar la salida de cada modelo a 'búfer'.

Para evitar la molestia, es más fácil usar una variable local y, en un solo lugar, asignarla a la salida.

Prefiero usar esa técnica solo para los puertos de salida que también se leen, pero puedo imaginar a alguien que prefiera usarla todo el tiempo.

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas