when sentencias retardo reservadas programacion palabras hacer else ejemplos concurrentes concatenacion como anidado process vhdl

process - sentencias - ¿Cuándo debe insertarse una señal en la lista de sensibilidad de un proceso?



sentencias concurrentes vhdl (4)

... también, tenga cuidado, la lista de sensibilidad no tiene influencia sobre el comportamiento de su diseño una vez que se sintetiza. Solo se utiliza durante la simulación. Por lo tanto, es bastante fácil introducir una diferencia en el comportamiento entre RTL y el código sintetizado mediante cambios en la lista de sensibilidad.

Las reglas que Josh da son buenas, pero, sobre todo, lea las advertencias que le dan sus herramientas y actúe según ellas. Normalmente verifican que la lista de sensibilidad sea correcta y marcarán cualquier problema. El modo Emacs VHDL también tiene un comando para actualizar la lista de sensibilidad, y normalmente es bastante bueno en eso.

Hmmmm, ninja''d

Estoy confundido acerca de cuándo una señal declarada en una arquitectura debe insertarse en la lista de sensibilidad de un proceso.

¿Existe alguna ley general que se pueda seguir en cualquier situación?

Tengo dificultades reales para comprender cuándo debo incluir una señal en una lista de sensibilidad de proceso.


Además, las herramientas de síntesis (hablando de Xilinx XST en este caso) no necesariamente siempre respetan la lista de sensibilidad del proceso. Si no enumera todos los procesos cuyos valores se evalúan en el cuerpo del proceso, el XST emitirá una advertencia que indica que asumirá que las señales cuyos valores se evalúan están en la lista de sensibilidad. Eso puede llevar a diferencias entre simulaciones de comportamiento y hardware real. Tenlo en mente.


La "ley general" es que

cualquier cosa que su proceso necesite saber acerca de los cambios de necesidades debe estar en la lista de sensibilidad.

Para un registro sintetizable típico con un reinicio síncrono:

process (clk) is begin if rising_edge(clk) then if reset = ''1'' then -- do reset things else -- read some signals, assign some outputs end if; end if; end process;

Solo el reloj debe estar en la lista, ya que todo lo demás solo se ve cuando el reloj cambia (debido a la if rising_edge(clk) .

Si necesita un reinicio asíncrono :

process (clk, reset) is begin if reset = ''1'' then -- do reset things elsif rising_edge(clk) then -- read some signals, assign some outputs end if; end process;

luego, la señal de reset también debe estar en la lista de sensibilidad, ya que su diseño debe verificar su valor cada vez que cambie, independientemente de lo que haga el reloj.

Para la lógica combinatoria, evito usar procesos por completo debido a los problemas que mantienen la lista de sensibilidad actualizada, y el potencial de simulación que se comporta de manera diferente al código sintetizado. Esto ha sido facilitado por la palabra clave all en VHDL-2008, pero todavía no me he encontrado con ganas de escribir una lógica combinatoria larga y complicada de tal manera que un proceso ayude.


Si una señal está en la lista de sensibilidad de un proceso, el proceso se "reactivará" y se evaluará siempre que cambie el valor de esa señal. Si no está en la lista de sensibilidad, una señal puede cambiar, pero un proceso no se volverá a evaluar para determinar cuáles deberían ser las nuevas salidas.

Para lógica combinatoria: Es probable que desee que todas sus señales de entrada se incluyan en la lista de sensibilidad. Si no están incluidos en la lista de sensibilidad, entonces la salida no cambiará incluso cuando cambie la señal de entrada. Este es un error común (debido a un descuido). Tenga en cuenta que en VHDL 2008 puede usar la palabra clave "todas" para incluir automáticamente todas las señales necesarias en su proceso y evitar la creación de cierres.

Para la lógica síncrona: es probable que solo desee la señal de su reloj (y quizás su reinicio) en la lista de sensibilidad. Esto se debe a que solo le preocupa el valor de sus señales (aparte del reloj) cuando el reloj de su sistema ha cambiado. Esto se debe a que normalmente se describen registros (compuestos por flip flops) que solo permiten cambiar su valor de salida en un borde del reloj.

Todo esto puede ser confuso en el caso de utilizar HDL para la síntesis, ya que solo un subconjunto de los circuitos que describe en VHDL puede implementarse dentro de un FPGA. Por ejemplo, no puede tener un elemento de memoria primitivo que sea sensible a dos bordes de reloj independientes, aunque podría describir dicho circuito incluyendo dos relojes en una lista de sensibilidad.