VHDL - 10% de ciclo de trabajo

0

Necesito generar 500Hz desde la frecuencia de reloj de 50MHz. Ya lo tengo. Mi problema aquí es cómo se debe ajustar el código si quiero cambiar el ciclo de trabajo al 10%?

Gracias.

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

entity FreqDivider500Hz is
port(
    clock   : in STD_LOGIC; -- 50 Mhz
    clear   : in STD_LOGIC;
      freq1 : out STD_LOGIC
);
end FreqDivider500Hz;

architecture Behavioral of FreqDivider500Hz is
signal adjfreq: STD_LOGIC_VECTOR(15 downto 0) := "0000000000000000";
signal adjclock : std_logic := '0';

begin

freq1 <= adjclock;

countClock: process(clock,clear)
begin
    if (clear = '1') then
        adjfreq <= "0000000000000000";
    elsif(clock'event and clock = '1') then
        -- Flip a the output once every 50,000 cycles (1kHz)
        -- to give a 500Hz output with 50% duty cycle
        if (adjfreq = "1100001101010000") then  
            adjfreq <= "0000000000000000";
                if adjclock <= '0' then
                adjclock <= '1';
                else adjclock <= '0';
                end if;
            else 
            adjfreq <= adjfreq+1;   
        end if;
    end if;
end process;
end Behavioral;
    
pregunta Min_ah

1 respuesta

1

Debe tener diferentes retrasos dependiendo de si la salida es actualmente alta o baja.

Entonces, en lugar de tener 50000 ciclos de alto y 50000 ciclos de bajo, tiene 10000 ciclos de alto y 90000 ciclos de bajo. Esto requerirá un poco de lógica condicional y probablemente también un contador más grande.

P.S. Creo que su código actual en realidad tiene 50001 ciclos de alto y 50001 ciclos de bajo, por lo que le dará un poco menos de 500Hz.

P.P.S, a menudo es mejor contar hasta cero que contar hasta un valor definido. Especialmente cuando la cantidad de ciclos que necesitas contar es variable.

P.P.P.S tu sangría parece estar desordenada.

    
respondido por el Peter Green

Lea otras preguntas en las etiquetas