es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La velocidad del reloj es dos veces más rápida cuando el ciclo de trabajo del reloj es del 50%.

Quiero generar una señal de reloj de 102Hz en una placa FPGA (la que tiene un Cyclone 3). El reloj original en el hardware es de 50MHz, así que lo dividí por 490196 para obtener el reloj de 102Hz. Sin embargo, la velocidad del reloj es dos veces más rápida cuando configuro el ciclo de trabajo al 50%.

    signal div_490196_counter: std_logic_vector(18 downto 0);
        ...
    process(clk,reset,div_490196_counter)
    begin
        if(reset='0') then
            div_490196_counter <= (others=>'0');
        elsif(rising_edge(clk)) then
            if(div_490196_counter = 490165) then
                div_490196_counter <= (others=>'0');
            else 
                div_490196_counter <= div_490196_counter+1;
            end if;
        end if;
    end process;
    clk_102Hz <= '1' when (div_490196_counter < 245098) else '0';

Intenté utilizar Verilog pero el resultado es el mismo:

reg[18:0] div_490196_counter;
...
always@(posedge clk or negedge reset)
begin
    if(reset == 1'b0)
        div_490196_counter = 0;
    else
        if(div_490196_counter == 490165)
            div_490196_counter = 0;
        else
            div_490196_counter = div_490196_counter + 1;
end

assign clk_102Hz = (div_490196_counter < 245098)? 1'b1 : 1'b0;

Solo cuando cambio a un reloj con ciclo de trabajo diferente al 50% se resuelve el problema:

clk_102Hz <= div_490196_counter(18);

o en Verilog:

assign clk_102Hz=div_490196_counter[18];

Pero ¿por qué es este el caso?
Pensé que el resultado debería ser el mismo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Este fenómeno ocurre porque en el código original, la señal “clk_102Hz” se genera en función del valor de “div_490196_counter” únicamente. Cuando se utiliza un reloj con ciclo de trabajo del 50%, “div_490196_counter” cambiará dos veces por ciclo de reloj, por lo que la señal resultante “clk_102Hz” también cambiará el doble de rápido. Sin embargo, cuando se utiliza un reloj con ciclo de trabajo diferente al 50%, solo se utiliza un bit de “div_490196_counter” para generar la señal “clk_102Hz”, por lo que la frecuencia resultante será correcta independientemente del ciclo de trabajo. Por lo tanto, para generar una frecuencia precisa utilizando un reloj con ciclo de trabajo diferente, solo se debe utilizar un bit del contador en la lógica de salida.

Comments are closed.