¿Por qué mi señal de reloj VHDL está tan lejos de lo que pensé que sería?

3

Soy nuevo en FPGA y VHDL. Se suponía que el siguiente código era 5MHz pero obtengo 4.167MHz en mi alcance.

La placa FPGA que tengo es un Mojo v3 que tiene un reloj 50MHz .

¿Qué estoy haciendo mal?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity clock is
    port (
        clk_50mhz   : in    std_logic;
        rst         : in    std_logic;
        clk_out     : out   std_logic
    );
end clock;

architecture Behavioral of clock is
    signal prescaler    : unsigned(4 downto 0);
    signal clk_out_i    : std_logic;
begin
    gen_clk : process(clk_50mhz, rst)
    begin -- process gen_clk
        if rst = '1' then
            clk_out_i   <= '0';
            prescaler   <= (others => '0');
        elsif rising_edge(clk_50mhz) then   -- rising clock edge
            if prescaler = X"5" then        -- (50_000_000 / 5_000_000) / 2
                prescaler   <= (others => '0');
                clk_out_i   <= not clk_out_i;
            else
                prescaler   <= prescaler + "1";
            end if;
        end if;
    end process gen_clk;

    clk_out <= clk_out_i;

end Behavioral;
    
pregunta cbmeeks

1 respuesta

6

50MHz / 4.16666MHz = 12.

Estás contando hasta 6 veces, no 5 veces como crees. El clásico error off-by-one :)

Si parece confuso, intente simular su código, y eso debería aclarar las cosas.

    
respondido por el uint128_t

Lea otras preguntas en las etiquetas