El proceso VHDL requiere múltiples ciclos de reloj

3

Escribí un contador simple en VHDL para un contador de programa. Todo se hace en un proceso, pero lo que no entiendo es que en la simulación, la adición del contador del programa solo se realiza en el siguiente evento de reloj, en lugar de hacerlo inmediatamente después de que se haya generado PCNext .

Aquí está el código y la simulación:

 LIBRARY ieee;
    USE ieee.std_logic_1164.ALL;
    USE ieee.numeric_std.ALL;

    ENTITY dlatch IS 
    PORT (
         Reset, Clock : IN std_logic;
         PC_out : OUT std_logic_vector(31 downto 0)
         );
    end dlatch;

    ARCHITECTURE d_arch OF dlatch IS

    SIGNAL PC      : std_logic_vector(31 downto 0);  
    SIGNAL PCNext  : std_logic_vector(31 downto 0);  

    BEGIN 
    PROCESS(Clock, Reset)  
    BEGIN 
         IF Reset = '1' THEN
              PC <= x"00000000";
         ELSIF Clock'event and Clock = '1' THEN
                PC <= PCNext;
         END IF;

        PCNext <= std_logic_vector(unsigned(PC) + 4); 

    END PROCESS;

    PC_out <= PC;

    END d_arch;

¿Ves cómo PCNext solo se calcula en el flanco descendente del reloj? ¿Por qué no se calcula inmediatamente después de PC <= PCNext ?

    
pregunta Liam F-A

2 respuestas

1

En primer lugar, ambas dudas (1) y amp; (2) que en realidad está haciendo la misma pregunta

  

(1) La adición del contador del programa solo se realiza en el siguiente evento de reloj [es decir, aquí está el borde de la caída], en lugar de inmediatamente después de que PCNext haya sido publicado.

     

(2) ¿Ves cómo PCNext solo se calcula en el flanco descendente del reloj? ¿Por qué no se calcula inmediatamente después de PC < = PCNext?]

Respuesta : es porque la señal de PC no está presente en la lista de sensibilidad. Como se muestra en la simulación a continuación, cuando la agrego en la lista de sensibilidad, la adición se realiza inmediatamente porque PCNext <= std_logic_vector(unsigned(PC) + 4); se ejecuta simultáneamente como cambio en el proceso de invocación de la lista de sensibilidad de nuevo.

Anteriormente, en su caso, la asignación inmediata no sucedió hasta el siguiente evento de reloj (que es el límite del reloj presente en la lista de sensibilidad).

Espero que ahora entiendas la lista de sensibilidad y tengas más cuidado la próxima vez.

Una cosa más que puedes hacer es declarar signal PC como signal PC y usar la asignación de bloqueo variable PC , esto también actualizará el resultado de la adición inmediatamente y también podrás aprender más sobre la diferencia entre la asignación de bloqueo y la asignación de no bloqueo. .

editar: como Dave Tweed ya dijo para mover la declaración := fuera del bloque de proceso, también funcionará.

    
respondido por el Sourabh Tapas
0

La razón por la que PCNext no cambia hasta el siguiente borde del reloj es que tiene esa declaración dentro del process . El proceso solo se evalúa cuando una de las señales en su lista de sensibilidad cambia.

Tenga en cuenta que esta es una de las diferencias clave entre la simulación y el mundo real. El simulador presta atención a las listas de sensibilidad, pero si realmente sintetizas esta lógica, PCNext cambiaría de inmediato.

Para obtener el comportamiento que está esperando en el simulador , debe mover esa declaración fuera del proceso por completo.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas