Contador en VHDL

0

Al diseñar un contador mod60 en VHDL, me di cuenta de que sucede algo extraño, pero no puedo explicar por qué. Esta imagen muestra el momento de la transición de 59 a 00 (números convertidos a 7SegDisp):

Elcódigoparaelloes:

ENTITYContadorIS--"Contador" means counter
    PORT(
        clk: IN BIT;
        disp_uni, disp_dez: OUT BIT_VECTOR (6 DOWNTO 0)
    );
END Contador;
--------------------
ARCHITECTURE Contador OF Contador IS
    ------
    SIGNAL unidade: NATURAL RANGE 0 TO 10; --units
    SIGNAL  dezena:  NATURAL RANGE 0 TO 6; --tens

    COMPONENT ConvDisp IS
        --display conversor's entity goes here
    );
    END COMPONENT;
    -----

    BEGIN

        PROCESS (clk) BEGIN
            IF (clk'EVENT AND clk='1') THEN
                unidade <= unidade + 1;
                IF (unidade = 9) THEN     --Realize that the condition is 9 and not 10
                    unidade <= 0;
                    dezena <= dezena + 1;
                    IF (dezena = 5) THEN  --Realize that the condition is 5 and not 6
                        dezena <= 0;
                    END IF;
                END IF;
            END IF;
        END PROCESS;


        conv1: ConvDisp PORT MAP (unidade, disp_uni);
        conv2: ConvDisp PORT MAP (dezena, disp_dez);

END Contador;

Ese código funciona. Mi pregunta es por qué, ya que las unidades se reinician cuando llegan a 9, no 10, y las decenas se reinician cuando llegan a 5, no 6.

    
pregunta Carlos Mendes

2 respuestas

0

Semántica de la tarea aplazada.

Cambie las unidades y decenas a variables, que tienen una semántica de asignación inmediata, y el circuito hará lo que espera (en lugar de trabajar).

Luego, vuelve a cambiarlos y aprende por qué funciona.

El motivo de la semántica de asignación pospuesta es que las señales, (a diferencia de las variables tanto en VHDL como en otros lenguajes de programación) están diseñadas para la comunicación entre procesos, y por lo tanto, las cuestiones de condiciones de carrera, fallas, falta de determinismo e incluso puntos muertos potenciales son importantes .

La semántica de asignación de señales (asignación pospuesta) junto con los ciclos delta, son una solución elegante para este problema y uno de los conceptos más fundamentales en VHDL.

Aprende esto a fondo y VHDL tendrá mucho más sentido y será más fácil de escribir.

Sin embargo, no parece estar muy bien enseñado.

Aquí hay mi opinión , lo cual puede ayudar.

    
respondido por el Brian Drummond
1

VHDL, y más precisamente, el sistema de lógica de reloj que se utiliza para diseñar, generalmente describe procedimientos que determinan el siguiente estado de la lógica después de un ciclo de reloj apropiado. Entonces, no diseñas la lógica para decir: "59 se desplaza a 60, y luego vemos 60 y lo cambiamos a 00", más bien decimos que "estamos en 59, se va a enrollar a 60, así que en lugar de eso lo pasaremos a 00 ".

En otras palabras, observa el estado actual y decide cuál será el siguiente estado. Entonces, 59 - > 00 es la transición correcta.

Y puede que se pregunte también, cómo la transición del 9 a un 0 no confunde la lógica que se busca para 59 y el 60. La razón es que todos los estados se analizan y los siguientes estados se configuran antes de se produce el reloj. Nada cambia realmente hasta que llega el borde del reloj. Así que puedes decidir en qué se convertirá en el dígito de uno, y puedes decidir por separado en qué se convertirá en el dígito de los diez.

    
respondido por el gbarry

Lea otras preguntas en las etiquetas