TODOPIC
Otros Microcontroladores / Dispositivos programables => Lógica Programable => Mensaje iniciado por: ElRival en 27 de Febrero de 2006, 12:18:00
-
Hola a todos , otra vez estoy aquí.....
Ahora tengo un problemilla con un menú que quiero hacer para interactuar con el usuario desde la pantalla LCD 16x2 y 4 pusadores....
El problema lo tengo al intentar retroceder al menu anterior, me explico....
tengo un menú con opciones 0,1,2,3 ... si pulso el boton 3 puedo elegir entre la 3.0 ó 3.1 .si pulso el 1, entonces voy al 1.0 ,1.1 ó 1.2 etc....
Entonces el problema es que cuando voy a retroceder, pues no retrocede. La manera de hacerlo ha sido la siguiente , os resumo un poco las opciones(esta sería la opcion 3)......
Ahh cuando intento simularlo con el ISE simulator , me da problemas en la sentencia "total<=n0+n1+n2+n3-anterior;" pero sin embargo si que me deja cargarlo en la placa, ¿sabeis porque puede ser? he utiliizado las librerías....library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;
Y el trozo de codigo que me da problemas es este....
process(sw1,btn0,btn1,btn2,btn3,total)
variable anterior:std_logic_vector(3 downto 0);
variable n0:std_logic_vector(3 downto 0);
variable n1:std_logic_vector(3 downto 0);
variable n2:std_logic_vector(3 downto 0);
variable n3:std_logic_vector(3 downto 0);
begin
if(btn0="1"and btn0"event) then
n0:=n0+1;
end if;
if(btn1="1"and btn1"event) then
n1:=n1+2;
end if;
if(btn2="1"and btn2"event) then
n2:=n2+3;
end if;
if(btn3="1"and btn3"event) then
n3:=n3+4;
end if;
if(sw1="1"and sw1"event) then
anterior:="0100";
end if;
total<=n0+n1+n2+n3-anterior;
anterior:="0000";
end process;
process (letra,total)
begin
if(total=0) then
case letra is
when "10000" => salida<="00110000"; -- 0
when "10001" => salida<="00101101"; -- -
when "10010" => salida<="01010010"; -- R
when "10011" => salida<="01000101"; -- E
when "10100" => salida<="01010011"; -- S
when "10101" => salida<="01000101"; -- E
when "10110" => salida<="01010100"; -- T
when "10111" => salida<="00100000"; -- espacio
when "11000" => salida<="00100000"; -- espacio
when "11001" => salida<="00110001"; -- 1
when "11010" => salida<="00101101"; -- -
when "11011" => salida<="01000101"; -- E
when "11100" => salida<="01011000"; -- X
when "11101" => salida<="01010000"; -- P
when "11110" => salida<="01001100"; -- L
when "11111" => salida<="01001111"; -- O
------------------------------------------------------line1 del display
when "00000" => salida<="00110010"; -- 2
when "00001" => salida<="00101101"; -- -
when "00010" => salida<="01010100"; -- T
when "00011" => salida<="01010010"; -- R
when "00100" => salida<="01000001"; -- A
when "00101" => salida<="01001110"; -- N
when "00110" => salida<="01010011"; -- S
when "00111" => salida<="01000110"; -- F
when "01000" => salida<="00100000"; -- espacio
when "01001" => salida<="00110011"; -- 3
when "01010" => salida<="00101101"; -- -
when "01011" => salida<="01001110"; -- N
when "01100" => salida<="01010101"; -- U
when "01101" => salida<="01000101"; -- E
when "01110" => salida<="01010110"; -- V
when "01111" => salida<="01001111"; -- O
when others => salida <=(others=>"0");
END CASE;
end if;
if total=4 then
case letra is
when "10000" => salida<="01001001"; -- I
when "10001" => salida<="01001110"; -- N
when "10010" => salida<="01001001"; -- I
when "10011" => salida<="01000011"; -- C
when "10100" => salida<="01001001"; -- I
when "10101" => salida<="01000001"; -- A
when "10110" => salida<="01010010"; -- R
when "10111" => salida<="00100000"; -- espacio
when "11000" => salida<="01001101"; -- M
when "11001" => salida<="01001111"; -- O
when "11010" => salida<="01000100"; -- D
when "11011" => salida<="01001111"; -- O
when "11100" => salida<="00100000"; -- espacio
when "11101" => salida<="00100000"; -- espacio
when "11110" => salida<="00100000"; -- espacio
when "11111" => salida<="00100000"; -- espacio
-----------------------------------------------------line1 del display
when "00000" => salida<="00110000"; -- 0
when "00001" => salida<="00101101"; -- -
when "00010" => salida<="01001110"; -- N
when "00011" => salida<="01001111"; -- O
when "00100" => salida<="01010010"; -- R
when "00101" => salida<="01001101"; -- M
when "00110" => salida<="01000001"; -- A
when "00111" => salida<="01001100"; -- L
when "01000" => salida<="00100000"; -- espacio
when "01001" => salida<="00110001"; -- 1
when "01010" => salida<="00101101"; -- -
when "01011" => salida<="01000001"; -- A
when "01100" => salida<="01001000"; -- H
when "01101" => salida<="01001111"; -- O
when "01110" => salida<="01010010"; -- R
when "01111" => salida<="01010010"; -- R
when others => salida <=(others=>"0");
end case;
end if;
-
Creo que el fallo esta aqui:
if(sw1="1"and sw1"event) then
anterior:="0100";
else
anterior:="0000";
end if;
total<=n0+n1+n2+n3-anterior;
Si no lo haces asi, anterior siempre valdrá 0 y nunca retrocederá
-
Eso no me lo sintetiza... lo que he pensado es en crear una entidad que me genere un pulso de duracion de un ciclo de reloj una vez que haya soltado el boton
lo que no se es como hacerlos ya que he probado cosas como esta....
process(btn,clk)
begin
if(btn"event and btn="0")then
aux<="1";
else
salida<="0";
end if;
end process;
salida<=aux;
salida<=not aux;
y así tampoco me lo sintetiza....
-
Que error te da en ambos casos?