-- Die nachfolgenden Zeilen realisieren einen Frequenzteiler.
-- Das clock-Signal wird durch einen beliebigen ungeraden Faktor
geteilt.
-- Während gerade Teilerverhältnisse sich einfach realisieren lassen,
-- können ungerade Teilerverhältnisse nur durch einen Trick realisiert
werden.
-- Da Flip-Flops nur auf eine Taktflanke reagieren können, kann cout
nicht
-- direkt mit einem Flip-Flop, das mit clock getaktet wird, erzeugt
werden.
-- Es sind daher zwei Signale notwendig aus denen das Ausgangssignal
abgeleitet wird.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity frequenzteiler is
generic (teiler : integer := 5);
port (clock : in std_logic;
reset : in std_logic;
enable : in std_logic;
cout : out std_logic
);
end frequenzteiler;
architecture frequenzteiler_rtl of frequenzteiler is
signal positive_counter : natural range 0 to (teiler-1);
signal negative_counter : natural range 0 to (teiler-1);
signal hilf1 : bit;
signal hilf2 : bit;
begin
-- Zählt die positiven Taktflanken
process (clock, reset)
begin
if (reset = '1') then
positive_counter <= 0;
elsif (rising_edge(clock)) then
if positive_counter < (teiler-1)
then positive_counter <= positive_counter + 1;
else positive_counter <= 0;
end if;
end if;
end process;
-- Zählt die negativen Taktflanken
process (clock, reset)
begin
if (reset = '1') then
negative_counter <= 0;
elsif (falling_edge(clock)) then
if negative_counter < (teiler-1)
then negative_counter <= negative_counter + 1;
else negative_counter <= 0;
end if;
end if;
end process;
-- Generisches ungerades Teilerverhältnis
hilf1 <= '1' when (negative_counter < ((teiler-1)/2)) else '0';
hilf2 <= '1' when (positive_counter < ((teiler-1)/2)) else '0';
cout <= '1' when ((hilf1 = '1') or (hilf2 = '1')) else '0';
end frequenzteiler_rtl;
Programmiert mit ISE Webpack 10.1.
Simuliert mit dem ISE Simulator.
Einziges Manko: ISE meckert noch da bisher das Enable-Signal nicht
verwendet wurde.