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:

Unknown 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??.

Rodolfo Escobar 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?

Rodolfo Escobar dijo...

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

Unknown dijo...

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

Rodolfo Escobar dijo...

¿Dos salidas a diferentes frecuencias?

Unknown 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?

Rodolfo Escobar 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.

Unknown 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.

Rodolfo Escobar 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 dijo...

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

Unknown 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.

Unknown 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 dijo...

Ahí mismo tienes un contador,en count

jhonny dijo...

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