Tengo el segmento de código anterior. Estoy un poco confundido, entonces, ¿alguien me puede ayudar?
wait until rising_edge ( clk ) ;
sig_a <= sig_x and sig_y ;
sig_b <= sig_a ;
¿Sig_b usa el nuevo valor de sig_a?
Ambos eventos suceden simultáneamente, por lo que sig_a
obtiene un nuevo valor mientras que sig_b
lo hace. En la práctica, esto se hace a menudo con flip-flops en cascada, que están todos sincronizados por el mismo borde, como en registros de desplazamiento . Esto no es un problema debido a la demora entre la entrada y la salida, por lo que la entrada tomará el valor anterior de la salida anterior antes de que cambie de valor.
Una de las cosas difíciles de HDL es que las declaraciones de asignación se producen simultáneamente. Podría reordenar las dos declaraciones sig_a
y sig_b
y el resultado sería el mismo.
El sintetizador creará dos flip-flops para almacenar tanto sig_a
como sig_b
. La salida de sig_x AND sig_y
se conectará a la entrada de datos de sig_a
flip-flop, y la salida de sig_a
flip-flop se incorporará a la entrada de datos de sig_b
flip-flop.
Como resultado, sig_b
almacenará el valor antiguo de sig_a
en el borde positivo del reloj.
No, sig_b
obtiene el valor de sig_a
al inicio del proceso.
<=
significa "programar una actualización de la señal", pero no se actualizará hasta que pase un tiempo de simulación.
(Esa cantidad de tiempo podría ser 0 ns:
wait until rising_edge ( clk ) ;
sig_a <= sig_x and sig_y ;
wait for 0 ns;
sig_b <= sig_a ; -- sig_b now gets "sig_x and sig_y" from sig_a
Pero eso no se sintetizará ...)
Lea otras preguntas en las etiquetas vhdl