Procesar instrucciones y ejecución secuencial en VHDL

1

Para las declaraciones de proceso en VHDL, se dice que el orden de ejecución es secuencial. Mi pregunta es, ¿las señales a , b y c están asignadas a sus nuevos valores de forma concurrente o secuencial?

process(clk) is
begin
    if rising_edge(clk) then
        a <= b;
        b <= c;
        c <= a;
        a <= c;
    end if;
end process;

Si esto es secuencial, debo decir que después del final del proceso, a es igual a b , b es igual a c , y c es igual a b , porque asignamos b a a antes de asignar a a c .

Y finalmente, a debe ser b , porque c se asigna a b antes de la última asignación de señal. Sin embargo, esto parece imposible de implementar en hardware.

    
pregunta user9736196

3 respuestas

2

Dentro de un proceso, las declaraciones se llevan a cabo de manera secuencial. Sin embargo, los valores asignados a las señales no se llevan a cabo inmediatamente, sino que se programan para que ocurran al final del proceso.

Por ejemplo, cuando se realiza su tercera asignación c <= a; , el valor de a sigue siendo el valor que a tenía al inicio del proceso.

Esto se debe a que la primera asignación a <= b; aún no se ha realizado y a no ha cambiado.

De hecho, la primera asignación nunca se llevará a cabo debido a la cuarta asignación a <= c; , que se programará para que ocurra al final del proceso.

Este comportamiento refleja el comportamiento de los circuitos lógicos reales, que es para lo que fue diseñado VHDL.

Le recomiendo que lea cómo funcionan los procesos de VHDL. Asegúrese de evitar una trampa HDL clásica: vea un Lenguaje de diseño de hardware que modela un circuito lógico como un programa de computadora ejecutado por una CPU.

    
respondido por el TonyM
1

En VHDL, las sentencias en proceso se ejecutan secuencialmente. Como mencionaste, a, b, c y d son señales (si fueran variables, tenían una forma diferente). asume estas declaraciones en proceso:

a < = b;
c < = a;

Al final del proceso, el valor antiguo de b asignado a a. y antiguo valor de un asignado a c.

podemos pensar de forma más sencilla: Las sentencias en proceso se ejecutan secuencialmente, pero las señales no obtienen los nuevos valores antes del final del proceso. Vea este ejemplo que simuló en vivado:

puede ver el valor inicial de la señal antes del flanco ascendente del reloj.

a = 1; b = 1; c = 0;

En el flanco ascendente del reloj, se ejecutan las declaraciones en el proceso. Así que al final del proceso, el nuevo valor de las señales es:

a = old c = 0;

b = old c = 0;

c = old a = 1;

buena suerte.

    
respondido por el hanie
1

A menudo ayuda mirar el esquema de RTL. Su código:

process(clk) is
begin
    if rising_edge(clk) then
        a <= b;
        b <= c;
        c <= a;
        a <= c;
    end if;
end process;

produce esto:

Leyendo sus declaraciones en orden inverso:

  • a <= c : el registro a obtiene lo que estaba en el registro c
  • c <= a : el registro c obtiene todo lo que estaba en el registro a
  • b <= c : el registro b obtiene todo lo que estaba en el registro c
  • a <= b : esta declaración se ignora 1 .

1 No puede haber dos controladores para una sola entrada FF, por lo que, en VHDL, cuando se producen múltiples asignaciones a una señal dentro de la misma declaración de proceso, el último valor asignado es el valor que es propagado.

Observe también que b_reg y a_reg son exactamente iguales (es decir, cada uno de ellos registra la misma señal de entrada y salida). Si este simple ejemplo se sintetizara, uno de ellos casi seguramente se eliminará, y bout se vincularía a aout . De hecho, tomó algunos atributos de mantener solo para decirle a Vivado que no elimine el b_reg para la RTL.

    
respondido por el Blair Fonville

Lea otras preguntas en las etiquetas