Ich möchte die Taktfrequenz durch 5 teilen. Kann ich das mit dem Integer-Typ machen oder brauche ich etwas anderes, um die Dezimalzahl auszuführen?
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;
Wenn Sie in VHDL einen geteilten Takt mit 50 % Arbeitszyklus erzeugen möchten, indem Sie nur die steigende Flanke des Takts verwenden, sollte die Periode des geteilten Takts ein Vielfaches von 2 sein. Da 5 eine ungerade Zahl ist, müssen Sie auch die fallende Flanke des Haupttakts verwenden . Sie müssen zwei 2/5 Tastverhältnistakte erzeugen, die um eine halbe Periode des Haupttakts phasenverschoben sind. Dann können Sie es "ODER" machen, um den erforderlichen Takt zu erhalten, der eine 1/5-Frequenz und einen Arbeitszyklus von 50% hat.
Etwas wie das:
Codebeispiel:
architecture Behavioral of divide_by_5_counter is
signal a,b : STD_LOGIC;
signal count_a, count_b : STD_LOGIC_VECTOR(3 DOWNTO 0);
begin
process(clk_in,reset)
begin
if reset = '1' then
a <= '0';
elsif rising_edge(clk_in) then
if count_a = 5 then
count_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;
Wenn Sie nur an den steigenden Flanken Ihres ursprünglichen Takts arbeiten, können Sie kein Tastverhältnis von 50 % erzielen. Viele Schaltungen benötigen dies nicht, da die meisten digitalen Logiken nur für steigende oder fallende Flanken ausgelegt sind. In diesem Fall kannst du einfach so vorgehen:
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;
Wenn Sie eine Einschaltdauer von 50 % benötigen, müssen Sie entweder Ihren Originaltakt phasenverschoben oder auch an den abfallenden Flanken Ihres Originaltakts arbeiten.
Rohr
count
jemals 2,5 werden?Das Photon
alex.forencich
DonFusili
Toni M
DonFusili
Toni M