miércoles, 16 de enero de 2013

Generador de pulsos de 1Hz en VHDL (pulso por segundo)

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


entity segundo is
port ( pulso : inout std_logic:='0';
       clk   : in std_logic);
        
end entity;

architecture divisor of segundo is
signal count : integer :=1;
begin
process(clk) begin
   if(clk'event and clk='1') then
      count <=count+1;
      if(count = 50000000) then --count = frec de reloj/frec deseada
         PULSO <= not PULSO;
         count <=1;
      end if;
  end if;
end process;

end architecture;


Nota: Variando el valor de count, se puede utilizar el componente como divisor de frecuencia y obtener cualquier frecuencia menor a la del reloj que se esté usando.

16 comentarios:

Rodo Mar dijo...

Hola que tal, gracias por compartir tu programa. Tengo una duda: porque a PULSO le asignas su negación??. El puerto inout de PULSO es la salida de 1HZ verdad??.

Luyten dijo...

Para darle un duty cycle del 50%, si, es 1 Hz, medio segundo en alto y medio en bajo para completar un ciclo por segundo.

Anónimo dijo...

Hola, oye tengo una duda para que es ese inout PULSO? esa es la salida de la frecuencia deseada o que es?

Luyten dijo...

Así es, es la salida como claramente se muestra en el diagrama.

Nestor Aveiro dijo...

Hola, como hago si quiero tener 2 salidas en el divisor de frecuencia? una salida sera mi LSB y la otra MSB. gracias

Luyten dijo...

¿Dos salidas a diferentes frecuencias?

Victor Hugo Machorro Velazquez dijo...

Que tal amigo gracias por compartir el codigo si yo quiero crear un temporizador que solo dure no se digamos que 4 min, tendira que modificar esta linea?
if(count = 50000000) then
y colocar lo equivalente a 4 min en lugar del 50000000, seria a si?

Luyten dijo...

Podrías hacerlo asi, Victor, pero para frecuencias del orden de ciclos por minuto creo que sería una forma muy ineficiente porque la razón entre las frecuencias te daria un número enorme. Lo mejor sería mantener el divisor a 1 Hz y despues hacer una sentencia if (contador == 240), donde contador incrementa en cada flanco de subida de PULSO.

Ulises Sanchez dijo...

Hola oye que chido que compartas tu prgrama, estoy empezando en VHDL, oye el pulso como lo direcciono a un puerto para checar la señal en el osciloscopio? espero tu respuesta.

Luyten dijo...

Que tal Ulises, eso depende de tu implementación física, a que dispositivo vas a cargar el programa?

Juan dijo...

Hola, tengo una duda, voy a trabajar en una coolrunnerII cuya frecuencia es 8Mhz y necesito que trabaje a 1segundo. Como haría? Gracias.

Mario A. Morales dijo...

Hola, me gustaría que me explicaras el codigo paso a paso, te dejo mi correo marioamorales21@gmail.com

Jonathan Zárate dijo...

Hola, quiero crear un programa en vhdl que únicamente genere un pulso de 10 us, estoy pensando en usar el DCM de la tarjeta Spartan, pero no sé si sea la mejor idea. Creo que este código me puede servir, pero tengo dudas. Gracias por la respuesta.

Felipe F dijo...

como puedo hacer para utilizar esa frecuencia obtenida de 1hz como entrada de clock de un contador ?
debo crear otro process dentro de la misma entity?

saludos

Mario A. Morales dijo...

Ahí mismo tienes un contador,en count

JHONNY CARCHI dijo...

Amigo si tengo en la tarjeta un reloj de 8MHZ y quiero obtener una frecuencia de 11hz que variables deberia cambiar