VHDL: pregunta de asignación de señal

2

TLDR: la pregunta específica de pedido que hago es:

  1. Supongamos que la salida depende de algunas señales intermedias
  2. Supongamos que las señales intermedias dependen de algunas señales de entrada
  3. Supongamos que una señal de entrada cambia
  4. Esto puede hacer más de un cambio de señal intermedio
  5. El tiempo de asignación de la señal no se especifica de forma rigurosa
  6. Si la función de generación de la señal de salida observa que una de las señales intermedias ha cambiado antes de que las otras señales intermedias hayan cambiado, se puede generar una salida "transitoria" hasta que se observe el cambio en la segunda señal intermedia.
  7. ¿VHDL garantiza que esto no suceda? Si es así, ¿cómo?

Al leer el libro de Free Range VHDL, en la página 37, hay un fragmento de código que se afirma es equivalente al fragmento de código en la página 36:

-- library declaration
library IEEE;
use IEEE.std_logic_1164.all;
-- entity
entity my_ckt_f3 is
port ( L,M,N : in std_logic;
F3 : out std_logic);
end my_ckt_f3;
-- architecture
architecture f3_2 of my_ckt_f3 is
begin
F3<=((NOT L)AND(NOT M)AND N)OR(L AND M);
end f3_2;

versus:

-- library declaration
library IEEE;
use IEEE.std_logic_1164.all;
-- entity
entity my_ckt_f3 is
port ( L,M,N : in std_logic;
F3 : out std_logic);
end my_ckt_f3;
-- architecture
architecture f3_1 of my_ckt_f3 is
signal A1, A2 : std_logic; -- intermediate signals
begin
A1 <= ((NOT L) AND (NOT M) AND N);
A2 <= L AND M;
F3 <= A1 OR A2;
end f3_1;

Pero! La descripción en el texto afirma que las señales son una asignación retrasada ("algún tiempo" después) y no se garantiza el tiempo ni el orden.

En mi mente, esto se traduce aproximadamente en algo como "el lado derecho se muestrea en el aumento del reloj, y el lado izquierdo en el que cae el reloj", aunque estoy seguro de que en realidad se usan diferentes implementaciones. / p>

Ahora, suponiendo que cada operador < = en una cadena lógica introduce un retardo de tiempo de una cantidad indeterminada, ¿por qué son equivalentes estos dos fragmentos? ¿No podría ser que la segunda implementación, con señales temporales, genere temporalmente algún valor lógico que no sea el resultado de ninguna combinación de las entradas que haya visto?

Supongo que me gustaría una comprensión más formal de lo que realmente significa "asignación de señal" para el tiempo y las salidas. ¿Se garantiza que los compiladores "optimicen" o "asignen cortocircuitos" a las asignaciones de señales temporales para que el resultado final siempre sea el mismo que si escribiera la expresión lógica en una sola línea?

    
pregunta Jon Watte

1 respuesta

1

Si se pregunta cómo funciona el operador < =; es lo que se llama una 'asignación sin bloqueo'. Lo que esto significa es que el lado izquierdo de todos los < = se realizan para un evento en particular (por ejemplo, el aumento del borde del reloj) y luego, una vez evaluados, el resultado se coloca en la salida. Esto le permite escribir registros de desplazamiento sin variables temporales. Ninguno de los valores cambia hasta que se completan los cálculos de la mano izquierda, luego los resultados se mueven hacia el lado derecho. En general, no es una buena idea usar asignaciones sin bloqueo para la lógica combinatoria. Por lo general, solo se usan para crear pestillos y registros y usted usa asignaciones de bloqueo regulares para la lógica combinatoria. Cuando está sincronizado con una señal de reloj, generalmente puede considerar que < = operaciones son D flip-flops que muestrean la entrada y la transfieren a la salida de forma atómica en un solo borde de reloj.

Las "condiciones de carrera" en las que aparecen resultados indeterminados intermedios en las salidas de las funciones combinatorias son difíciles de evitar y pueden depender en gran medida de cómo se implementa realmente el diseño en un ASIC o FPGA. Sin embargo, la mayoría de los diseños son síncronos, por lo que siempre que la salida se establezca dentro de un período de reloj, esto no es un problema. Existen herramientas que pueden verificar el rendimiento de tiempo de un diseño para verificar todos los retrasos de ruta para garantizar que los resultados siempre serán válidos para una frecuencia de reloj determinada, pero esto depende en gran medida del código HDL real pero de la forma en que El diseño está colocado y enrutado.

Los sintetizadores (¡no los compiladores!) generalmente realizarán la optimización en lógica combinatoria. Hay límites en cuanto a lo que puede hacer el sintetizador (por ejemplo, no volverá a diseñar el sistema), por lo que debe saber más o menos cómo se implementará. Si está trabajando en un FPGA, generalmente la síntesis, el lugar y la ruta incluirán cualquier función lógica que se ajuste a las LUT. Entonces, si puede separar una sola función lógica con hasta 4 entradas y 1 salida, esto terminará en una sola LUT y el único retardo que importa es el retardo de propagación de la LUT, que es el mismo para todas sus entradas . En el caso de su función de ejemplo, ambas piezas de código pueden implementarse de manera idéntica en una LUT con tres entradas y una salida.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas