frecuencia de reloj dividida por 5 vhdl

1

Quiero obtener la división de frecuencia de reloj entre 5, ¿puedo hacerlo con un tipo entero o necesito otra cosa para ejecutar el número decimal?

library ieee;
use ieee.std_logic_1164.all;
use IEEE.NUMERIC_STD.ALL;

entity divide_clk is
port( clk: in std_logic;
 clk_out: out std_logic);
end divide_clk;

 architecture behave of divide_clk is
signal count: integer range 0 to 24999999:= 0;
signal temp : std_logic := '0';
begin
process(clk)
begin
if (clk'event and clk='1') then
 if (count = 2.5) then
 temp <= not(temp);
 count <= 0;
 else
 count <= count + 1;
 end if;
end if;
end process;
clk_out <= temp;
end behave; 
    
pregunta Yap YiXien

2 respuestas

1

Si desea generar un reloj dividido con un ciclo de trabajo del 50% en VHDL, utilizando solo levantamiento de la cuenta del reloj, el período del reloj dividido debe ser múltiplos de 2. Dado que 5 es un número impar, debe utilizar la caída de cobertura de la reloj principal también. Tiene que generar dos relojes de ciclo de servicio de 2/5 en fase cambiados por medio período del reloj principal. Luego puede "O" para obtener el reloj requerido que es de 1 / 5a frecuencia y 50% de ciclo de trabajo.

Algo como esto:

Ejemplodecódigo:

architectureBehavioralofdivide_by_5_counterissignala,b:STD_LOGIC;signalcount_a,count_b:STD_LOGIC_VECTOR(3DOWNTO0);beginprocess(clk_in,reset)beginifreset='1'thena<='0';elsifrising_edge(clk_in)thenifcount_a=5thencount_a<="0001";
a <= '1';
elsif count_a >= 2 then
a <= '0';
count_a <= count_a + 1;
else
a <= '1';
count_a <= count_a + 1;
end if;
end if;
end process;

process(clk_in,reset)
begin
if reset = '1' then
b <= '0';
count_b <= "0000";
elsif falling_edge(clk_in) then
if count_b = 5 then
count_b <= "0001";
b <= '1';
elsif count_b >= 2 then
b <= '0';
count_b <= count_b + 1;
else
b <= '1';
count_b <= count_b + 1;
end if;
end if;
end process;

clk_out <= a or b;

end Behavioral;
    
respondido por el MITU RAJ
0

Trabajando solo en los bordes ascendentes de su reloj original, no podrá obtener un ciclo de trabajo del 50%. Muchos circuitos no requieren esto, porque la mayoría de la lógica digital está diseñada para funcionar solo en bordes ascendentes o descendentes. En ese caso, puedes ir por algo como esto:

p_main: process(clk, reset_n)
    variable r_count : integer range 0 to 4;
    variable r_clk_out_i : std_logic;
begin

  if reset_n = '0' then
    r_clk_out_i := '0';
    r_count := 0;
  elsif rising_edge(clk) then
    if r_count = 0 or r_count = 2 then
      r_clk_out_i := not r_clk_out_i;
    end if;

    if r_count = 4 then
      r_count = 0;
    else
      r_count = r_count+1;
    end if;

  end if;
  clk_out <= r_clk_out_i;

end process;

Si requiere un ciclo de trabajo del 50%, deberá cambiar de fase su reloj original o también trabajar en los bordes descendentes de su reloj original.

    
respondido por el DonFusili

Lea otras preguntas en las etiquetas