VHDL: la señal no mantiene un valor

0

Hola, en primer lugar, el inglés no es mi idioma. Estoy usando un SPARTAN 3E como placa de desarrollo  Traté de hacer un FSM que cambia el estado con un contador llamado "T" (a veces como un pseudo-procesador) y usa un botón como impulso para incrementar, en un caso el FSM asigna un std_logic_vector de 4 tamaños desde cuatro interruptores en la placa fpga a "A", luego incrementa el contador y, en otro momento, coloca el valor del mismo interruptor en "B", finalmente hace la operación C: = A + B y lo envía a dos pantallas externas. El problema principal ocurre cuando quiero hacer la adición entre A y B, parece que A y B no tienen el valor asignado y muestran una operación incorrecta cuando probé, soy nuevo en vhdl así que mi conocimiento es limitado gracias por la ayuda :)

  'PROCESS(T)

   variable A:    std_logic_vector(3 DOWNTO 0);
   variable B:    std_logic_vector(3 DOWNTO 0);
   variable C:    STD_LOGIC_VECTOR(4 DOWNTO 0);
   BEGIN 
    IF T="00000" THEN--0
       X0<="00000011";  
    END IF;

    IF T="00001" THEN--1
        IF MEM="0001" THEN 
           VAL<="00001";
        ELSE
           VAL<="11111";
        END IF;
        X0<="00000110";
    END IF;

    IF T="00010" THEN--2
      X0<="00011010";
    END IF;

    IF T="00011" THEN--3
      X0<="00000011";
    END IF;

    IF T="00100" THEN--4
       VAL<=('0'& MEM);
       X0<="00000110";
    END IF;

    IF T="00101" THEN--5
        A:=MEM;--takes A from the switch 
        VAL<=('0' & A);
        X0<="00110010";
    END IF;

    IF T="00110" THEN--6

       X0<="00000011";
    END IF;

    IF T="00111" THEN--7
        B:=MEM;--takes B from the switch
        VAL<=('0' & B);
        X0<="00000110";
    END IF;

    IF T="01000" THEN--8
       X0<="01010010";
    END IF;

    IF T="01001" THEN--9
       C:=STD_LOGIC_VECTOR(UNSIGNED('0' & A)+UNSIGNED('0' & B));
       VAL<=(C);--shows the result 
       X0<="10000010";
    END IF;

    IF T="01010" THEN--10
        X0<="00000011";
    END IF;

    IF T="01011" THEN--11
        IF MEM="0001" THEN 
           VAL<="00010";
        ELSE
           VAL<="11111";
        END IF;
        X0<="00000110";
    END IF;

    IF T="01100" THEN--12
        X0<="00011010";
    END IF;

    IF T="01101" THEN--13
        X0<="00000011";
    END IF;

    IF T="01110" THEN--14
        VAL<=('0' & MEM);
        X0<="00000110";
    END IF;

    IF T="01111" THEN--15
        A:=MEM;--takes A 
        VAL<=('0' & MEM);
        X0<="00110010";
    END IF;

    IF T="10000" THEN--16
        X0<="00000011";
    END IF;

    IF T="10001" THEN--17
        VAL<=('0' & MEM);
        X0<="00000110";
    END IF;

    IF T="10010" THEN--18
        B:=MEM;--takes B
        VAL<=('0' & B);
        X0<="01010010";
    END IF;

    IF T="10011" THEN--19
       C:=STD_LOGIC_VECTOR(UNSIGNED('0' & A)-UNSIGNED('0' & B));
       VAL<=(C);--shows the result
       X0<="00000000";
    END IF;

    if T>"10011" then
       X0<="00000000";
    end if;

END PROCESS;'
    
pregunta menymp

1 respuesta

2

Esto podría no funcionar tan bien dependiendo de su herramienta de síntesis. Todas sus señales y variables se implementarán como latches, lo que en cualquier caso no es una buena idea.

Supongo que T se genera en un proceso síncrono con un reloj. Si convierte su proceso asíncrono en un proceso cronometrado también probablemente resolverá sus problemas. Por ejemplo:

PROCESS(clk)
variable A:    std_logic_vector(3 DOWNTO 0);
variable B:    std_logic_vector(3 DOWNTO 0);
variable C:    STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN 
  IF rising_edge(clk) THEN
    IF T="00000" THEN--0
(...)
    
respondido por el pc3e

Lea otras preguntas en las etiquetas