3 votos

El proceso VHDL requiere múltiples ciclos de reloj

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

Aquí está el código así como 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;

enter image description here

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

1voto

karaktar Puntos 1

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

(1) La adición del contador de programa se realiza solo en el próximo evento de reloj [es decir, aquí en el flanco descendente], en lugar de inmediatamente después de que PCNext se haya generado.

(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 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 de manera concurrente al cambio en signal PC en la lista de sensibilidad, lo que invoca nuevamente al proceso.

Introduce la descripción de la imagen aquí

Anteriormente en tu caso, la asignación inmediata no ocurría hasta el próximo evento de reloj (que es el flanco descendente del reloj presente en la lista de sensibilidad).

Espero que ahora entiendas realmente la lista de sensibilidad y seas más cuidadoso al respecto la próxima vez.

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

edit: Como ya mencionó Dave Tweed, mover la declaración PCNext <= std_logic_vector(unsigned(PC) + 4); fuera del bloque del proceso también funcionará.

0voto

GSerg Puntos 33571

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

Ten en cuenta que esta es una de las principales diferencias 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 hecho de inmediato.

Para obtener el comportamiento que esperas en el simulador, necesitas mover esa declaración fuera del proceso por completo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X