¿Habilitar el reloj para una máquina de estados?

0

Tengo un reloj del sistema de 100Mhz y me gustaría tener una señal de habilitación de 200Hz para habilitar la máquina de estados. Necesito un divisor de reloj para este proceso y pensé en esto:

clkdiv : process (clk)
begin
    if (clk'event and clk = '1') then     -- rising clock edge
        -- default value
        EN <= '0';

        clkcntr <= clkcntr - 1;
        if clkcntr = 0 then
            clkcntr   <= X"7A120"; -- 500000 decimal value
            EN <= '1';
        end if;

    end if;
end process clkdiv;

He visto otras implementaciones en Internet que siempre comienzan a dividirse primero con 100Mhz a 2. En mi caso, debería disminuir el tiempo de 250000 para igualar esto, es porque clk es 1-0-1-0-1-0- 1-0, ya que estamos interesados en el flanco ascendente, ¿también debemos considerar los tiempos del flanco descendente? Me alegraría si alguien pudiera demostrar un divisor de reloj adecuado. Luego, cuando termine, me gustaría ingresar a la máquina de estado con una condición if

if EN = '1' then

 go into the state machine

end if;

Al final, me gustaría que la duración de mi señal de salida del FSM fuera de 200Hz, ¿sería correcto? ¿Hay otras formas de implementar esto?

    
pregunta Anarkie

1 respuesta

1

Entonces, este código genera un reloj de 200 Hz basado en un reloj de 100 Mhz.

Observamos que: 100 MHz / 500000 = 200 Hz

Entonces, necesitamos tomar nuestro reloj de 100 Mhz y cada 500000 ciclos tendríamos un ciclo completo del reloj de 200 Hz que nos gustaría generar. Como queremos que el tiempo alto y el tiempo bajo sean iguales, sabemos que debemos oscilar el nuevo reloj cada 500000 / 2 ciclos.

Desde la perspectiva del código, usaremos hexadecimal, por lo que vale la pena señalar que 500000 / 2 == 0x3D090 .

architecture foo of blah is
    signal clk_200Hz : std_logic := '0';
    signal counter : unsigned(19 downto 0) := x"00000";
begin

    clkdiv : process (clk_100Mhz)
    begin
        if rising_edge(clk_100Mhz) then
            if counter = x"00000" then
                counter <= X"3D090"
                clk_200Hz <= not clk_200Hz;
            else
                counter <= counter - 1;
            end if;
        end if;
    end process clkdiv;

end architecture;
    
respondido por el Bill Lynch

Lea otras preguntas en las etiquetas