VHDL: DIVIDER DE RELOJ con ciclo de trabajo

0

Quiero generar un reloj de 15 MHz a partir de un reloj de 60 MHz. El reloj de 60 MHz tiene un ciclo de trabajo del 50%. El reloj de salida de 15 MHz debe tener un ciclo de trabajo del 25%. ¿Cómo se debe modificar el siguiente código para variar el ciclo de trabajo?

entity clkgen is
    Port (
        clk_in  :  in  STD_LOGIC;
        reset   :  in  STD_LOGIC;
        clk_out :  out STD_LOGIC   
    );
end clkgen;

architecture Behavioral of clkgen is
    signal temp: STD_LOGIC;


     signal count : integer range 0 to 1 := 0;


begin
    Clock_out : process (reset, clk_in) begin
        if (reset = '1') then
            temp <= '0';
            count <= 0;
        elsif rising_edge(clk_in) then
            if (count = 1) then
                temp <= NOT(temp);
                count <= 0;
            else
                count <= count + 1;
            end if;
        end if;
    end process;

    clk_out <= temp;     

end Behavioral;

actualizacion :

@Dave esto es lo que tengo. Clk_out no está cambiando su valor

    
pregunta user114750

2 respuestas

1

Lo más simple es tener count contando el período completo del reloj de salida, y luego puedes afirmar temp para cualquier fracción de ese período, como esto:

entity clkgen is
    Port (
        clk_in  :  in  STD_LOGIC;
        reset   :  in  STD_LOGIC;
        clk_out :  out STD_LOGIC   
    );
end clkgen;

architecture Behavioral of clkgen is
    signal temp: STD_LOGIC;
    signal count : integer range 0 to 3 := 0;

begin
    Clock_out : process (reset, clk_in) begin
        if (reset = '1') then
            count <= 0;
        elsif rising_edge(clk_in) then
            temp <= '1' when (count < 1) else '0';
            count <= count + 1;
        end if;
    end process;

    clk_out <= temp;     

end Behavioral;
    
respondido por el Dave Tweed
1

Respuesta corta: usa el PLL.

Respuesta larga: debe tener cuidado al enrutar relojes. Los relojes deben ser monótonos y deben satisfacer los requisitos de tiempo. No especificó si está apuntando a un FPGA o un ASIC. Es probable que sus herramientas de síntesis enruten su señal como una señal de datos, lo que provoca violaciones de tiempo.

Si no desea utilizar un PLL, la forma correcta de implementar esto es una señal de habilitación. Tiene un contador que cuenta y la señal de habilitación aumenta cuando el contador está a punto de reiniciarse. Si desea un ciclo de trabajo del 25%, deberá utilizar una frecuencia más alta y un FSM.

    
respondido por el user110971

Lea otras preguntas en las etiquetas