Junta Altera DE1 ¿LEER CLAVE?

0

Necesito mantener presionada la tecla 1 y luego presionar la tecla 2 para aumentar el valor. Cómo leer las teclas solo si se presionan ambas teclas. Esto es lo que se tiene que no funciona correctamente. (lenguajes de programación vhdl).

si la tecla (0) y la tecla (1) están ajustadas, haga algo

PORT (
KEY : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
);

SIGNAL A, B, C, D : STD_LOGIC_VECTOR(1 DOWNTO 0);

BEGIN
A <= KEY(0) & KEY(1);
B <= KEY(0) & KEY(2);
C <= KEY(0) & KEY(3);

Readkey: process(KEY)
begin
if (A = 1) then
D <= "00";
if (B = 1) then
D <= "01";
if (C = 1) then
D <= "10";
end if;
end if;
end if;
end process;
    
pregunta Power-Mosfet

2 respuestas

1

No me sorprende que no esté funcionando. Ahora, no sé lo más mínimo sobre VHDL, pero sí conozco sobre programación en general.

En primer lugar: INDIR SU CÓDIGO Sin sangrías, el código es casi ilegible. Aquí está su código sangrado correctamente:

PORT (
    KEY : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
);

SIGNAL A, B, C, D : STD_LOGIC_VECTOR(1 DOWNTO 0);

BEGIN
    A <= KEY(0) & KEY(1);
    B <= KEY(0) & KEY(2);
    C <= KEY(0) & KEY(3);

Readkey: process(KEY) 
begin
    if (A = 1) then
        D <= "00";
        if (B = 1) then
            D <= "01";
            if (C = 1) then
                D <= "10";
            end if;
        end if;
    end if;
end process;

Ahora puede ver una falla importante en su código de un vistazo.

C siendo 1 solo se probará si B es 1, que a su vez solo se probará si A es 1. Las declaraciones if no deberían estar anidadas de esa manera.

En segundo lugar, (de nuevo, no sé VHDL) es cómo se asignan A B y C. En un lenguaje de programación clásico, deberá asignar los valores entrantes a A B y C cada vez que quiera probarlos, de lo contrario, nunca verá ningún cambio. Es posible que este no sea el caso en VHDL, pero es algo que debe observarse más detenidamente.

    
respondido por el Majenko
2

1) Arregla la lógica IF como dice Makjenko.

2) "&" no es el operador AND Es la combinación de elementos en un vector. Si KEY (0) y KEY (1) fueran ambos '1', obtendrías un valor A de "11", no 1. De hecho, ese código no debería compilarse. Haz A, B y C std_logic en lugar de std_logic_vector , y asignalos como:

A <= KEY(0) and KEY(1);

Entonces puedes usar:

if (A = '1') then

O, déjalo como está y compara A con "11", etc.

3) ¿Qué usa D? Si tuviera un código como ese sin utilizar D ... la sección del código completo se optimizaría y no haría nada útil. Cree una señal de SALIDA en el mapa del puerto y asígnele una D. Luego, asegúrate de asignarlo a un pin en algún lugar.

4) Tampoco creo que tengas las cosas correctas en la lista de sensibilidad. Si bien debería ser cierto que si los cambios CLAVE A, B y C sí ... No confiaría en una herramienta de síntesis para hacer lo correcto allí. Ponga (A, B, C) en la lista de sensibilidad.

5) Asegúrese de la polaridad de las entradas KEY. ¿Puedes hacer que las cosas funcionen si solo presionas una tecla? Una pulsación de tecla puede ser "0" ... Sé que la mayoría de las mías son.

Ah, y como dice Majenko, sin duda sangra tu código.

    
respondido por el darron

Lea otras preguntas en las etiquetas