Autor Tema: Problema con contador basado en push button  (Leído 6109 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado wh0g3

  • PIC10
  • *
  • Mensajes: 1
Problema con contador basado en push button
« en: 28 de Marzo de 2005, 16:33:00 »
HOla.

Tengo una tarjeta xc2s50. Estoy aprendiendo VHDL con ella. Utilizo el ISE 6.2

Quiero hacer que cada vez que presiono el push button de la tarjeta el led de 7 segmentos incremente su valor en 1. Empezará en 0 y llegará hasta 9 ....

El problema es que cuando configuro las patitas en el UCF no me deja asignarle a mi variable la entrada correspondiente al push button. Dice que a fuerza tengo que asignarle como entrada para esa variable la señal de reloj del FPGA.

La pata 93 es la que corresponde al push button.
La pata 88 es la que corresponde al reloj principal del FPGA.

El programa corre perfecto si le asigno la pata 88, pero si le asigno la pata 93 me marcà un error. No quiero que funcione con la pata 88 porque lo hace muuuuy ràpido, a 100 MHZ ....... :S

Este es el còdigo:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

--  Uncomment the following lines to use the declarations that are
--  provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

entity ControlaLed is
    Port ( led: out std_logic_vector (6 downto 0);
           entra: in std_logic
       );
end ControlaLed;

architecture Funcionamiento of ControlaLed is
signal number: std_logic_vector (3 downto 0);
signal liko: std_logic;
begin   
   process (entra)
   begin               
      if (entra = "0") then
         number <= number + 1;
         case number is
            when "1111" => led <= "1110111";
            when "1110" => led <= "0010010";
            when "1101" => led <= "1011101";
            when "1100" => led <= "1011011";
            when "1011" => led <= "0111010";
            when "1010" => led <= "1101011";
            when "1001" => led <= "1101111";
            when "1000" => led <= "1010010";
            when "0111" => led <= "1111111";
            when "0110" => led <= "1111011";      
            when others => led <= "1101101";
         end case;
      end if;
   end process;
end Funcionamiento;


El error que sale es el siguiente:
ERROR:MapLib:93 - Illegal LOC on IPAD symbol "entra" or BUFGP symbol
   "entra_BUFGP" (output signal=entra_BUFGP), IPAD-IBUFG should only be LOCed to GCLKIOB site.


Alguien puede ayudarme a saber como le hago?

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Problema con contador basado en push button
« Respuesta #1 en: 28 de Marzo de 2005, 19:33:00 »
Hola whog3.

Vamos a ver...

Estas intentando usar una entrada normal de la fpga (pin93), para manejar el reloj de tu contador, puesto que con esta pretendes incrementar la cuenta.

Esto no se puede hacer debido a que esa entrada no tiene la "potencia" suficiente para manejar registros.

A lo mejor para este contador simple, si tiene potencia y no tendrías problemas, pero imagínate que intentaras hacer lo mismo con un microprocesador. El resultado sería que la señal de reloj no llega a todos los sitios a la vez, es decir, tendrías sitios donde el pulso de reloj llega instantáneamente y otros en los que llegaría muy retrasado.

Para evitar esto, las FPGAS tienen un pin (o varios) dedicados a transportar la señal de reloj por todo su interior mediante buffers internos.

El programa de síntesis detecta los registros que tengas declarados y la señal de reloj que los hace cambiar y le asigna a ésta, un GCLKIOB, que es un pin de reloj global.

Después de todo este rollo y si todabía no te has dormido... te comento lo que yo haría dentro del proceso que has hecho:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

entity ControlaLed is
Port ( clk: in std_logic;          led: out std_logic_vector (6 downto 0);
entra: inout std_logic
);
end ControlaLed;

architecture Funcionamiento of ControlaLed is
signal number: std_logic_vector (3 downto 0);
signal liko: std_logic;
signal lock: std_logic;
begin
process (clk, entra)
begin
if (clk"envent and clk="1") then
   if (entra="0" and lock = "0") then
      number <= number + 1;
      lock <="1";
   elsif(entra="1" and lock="1") then
      lock <= "1";
   else
      lock <= "0"
   end if

--La señal debe ser inout para que se pueda leer las comparaciones del if

--La señal lock evita que cuando pulses entra el contador se incremente a la
--velocidad del reloj

case number is
when "1111" => led <= "1110111";
when "1110" => led <= "0010010";
when "1101" => led <= "1011101";
when "1100" => led <= "1011011";
when "1011" => led <= "0111010";
when "1010" => led <= "1101011";
when "1001" => led <= "1101111";
when "1000" => led <= "1010010";
when "0111" => led <= "1111111";
when "0110" => led <= "1111011";
when others => led <= "1101101";
end case;
end if;
end process;
end Funcionamiento;


Asigna el clk al pin 88 y tu push button a la 93