El proceso VHDL causa errores

0

Soy nuevo en VHDL, así que solo tengo una pregunta para preguntar por qué esto produce un error. Tengo una ALU definida en VHDL:

c <=        a + b       WHEN opc="0111"
ELSE        a - b       WHEN opc="1000"
ELSE        -a          WHEN opc="1011"
ELSE        -b          WHEN opc="0001"
ELSE        ABS(a)      WHEN opc="1110"
ELSE        ABS (b)     WHEN opc="1010"
ELSE        NOT a       WHEN opc="0010"
ELSE        NOT b       WHEN opc="1100"
ELSE        a AND b     WHEN opc="0100"
ELSE        a OR b      WHEN opc="0110"
ELSE        a XOR b     WHEN opc="0101"

(esta es la arquitectura)

Pero luego quiero hacerlo sincrónico,

PROCESS (clock)
BEGIN
    IF(rising_edge(clock)) THEN
        c <=        a + b       WHEN opc="0101"
        ELSE        a - b       WHEN opc="1000"
        ELSE        -a          WHEN opc="1011"
        ELSE        -b          WHEN opc="0001"
        ELSE        ABS(a)      WHEN opc="1110"
        ELSE        ABS (b)     WHEN opc="1010"
        ELSE        NOT a       WHEN opc="0010"
        ELSE        NOT b       WHEN opc="1100"
        ELSE        a AND b     WHEN opc="0100"
        ELSE        a OR b      WHEN opc="0110"
        ELSE        a XOR b     WHEN opc="0111" 
    END IF
END PROCESS;

Esto no funciona, aparece con varios errores como:

';' expected.
Keyword "end" expected.

Así que ahora he cambiado mi código a:

PROCESS (clock)
BEGIN
    IF(rising_edge(clock)) THEN 
        CASE opc IS
            WHEN "0101" => c <= a+b;       
            WHEN "1000" => c <= a-b;      
            WHEN "1011" => c <= -a;   
            WHEN "0001" => c <= -b;   
            WHEN "1110" => c <= ABS(a);  
            WHEN "1010" => c <= ABS(b); 
            WHEN "0010" => c <= NOT a;   
            WHEN "1100" => c <= NOT b;  
            WHEN "0100" => c <= a AND b;  
            WHEN "0110" => c <= a OR b;  
            WHEN "0111" => c <= a XOR b; 
        END CASE; 
    END IF; 
END PROCESS;

Y esto no produce ningún error. Pero, ¿por qué el código original que funcionó cuando se puso en un proceso no funciona a menos que use la declaración del caso?

Gracias de antemano.

    
pregunta George Sephton

2 respuestas

1

En orden de esfuerzo:

  • Si tiene acceso a VHDL 2008 en sus herramientas, habilítelo. Si no, ¡fastidie al proveedor para que lo respalde!
  • agregue una señal adicional llamando a c_sync y luego agregue una línea:

    c_sync <= c when rising_edge(clk);

  • Cambie su código a un conjunto de declaraciones if then .

respondido por el Martin Thompson
1

Su primer intento de hacerlo sincrónico no funcionó porque:

  • No ha habilitado VHDL 2008 (como se indica en las otras respuestas / comentarios)
  • al final de la asignación condicional falta un ;
  • a tu END IF le falta un ;

Su segundo intento funciona, porque no requiere VHDL 2008 :

La declaración case ha sido admitida en procesos desde la primera versión de VHDL, mientras que la asignación condicional estaba prohibida previamente dentro de los procesos (que se ha cambiado con VHDL 2008 ).

    
respondido por el Blaubär

Lea otras preguntas en las etiquetas