Wie konstruiert man teiler in vhdl, insbesondere vorteiler. Wüßte gerne auch Hintergrund (Wieso)!:-) BSP: Von 12MHz auf 100Hz danke, michi
Wenn es nicht ganz genau sein soll, mache ich es zB folgendermaßen:
architecture Behavioral of clock_divide is
signal clkDiv : std_logic_vector (18 downto 0);
begin
Process (clock, reset) --CLKDivider: Process (clock)
begin
if (reset ='1') then
clkDiv <= "0000000000000000000";
elsif (clock = '1' and clock'Event) then
clkDiv <= clkDiv +1;
end if;
end Process;
divided_clock_95 <= clkDiv(18); --die auf ca. 95Hz runtergeteileten
50MHz
divided_clock_6k <= clkDiv(12); --die auf ca. 6kHz runtergeteileten
50MHz
divided_clock_781k <= clkDiv(5); --die auf ca 781kHz runtergeteilten
50MHz
end Behavioral;
Danke mal, für deine Mühe!:-) Wie könnte ich das neue Taktsignal dann weiterverarbeiten? z.B.: PWM? Danke, michi:-)
Naja, einer der Ausgänge, divided_clock_xx, ist dann der Clock-Eingang für ein anderes Modul/Shematic. Gruß, Harry
Vielleicht kommst du so genauer auf deine Frequenz.
Bei einem synchronen Design solltest du trotzdem jedes Flip-Flop mit
deinem Systemtakt verbinden und nur alle 120 Takte die Eingänge
überprüfen.
Also hier das quick and dirty Beispiel
architecture RTL of xyz is
signal Counter : integer range 0 to 119;
signal CLK_D120 : std_logic;
-- Ich schaffe gerne mit Integer, das wird aber sowieso in Logik
umgesetzt.
begin
-- nun kommt der process zum synchronen Teilen
-- Das ganze wird dann zum log2(120) = 7 Bit breiten Binarzähler
-- Der ausgang wird alle 120 Takte für einen Takt auf 1 gesetzt
-- Das entspricht einer Frequenz von 100Khz bei Eingangsclock von
12MHZ
-- Der Takt ist aber nicht symmetrisch!!!
teile: process(Reset, CLK)
begin
if(Reset = '1') then
counter <= 0;
CLK_D120 <= '0';
elsif( rising_edge(CLK)) then
if ( counter < 119)
CLK_D120 <= '0';
counter <= counter + 1;
else
CLK_D120 <= '0';
counter <= 0;
end if;
end if;
end process;
-- in den folgeprocessen mit dem geteilten Clock nimmst du den CLK_D120
als Enable signal
-- also so
funkt1:process(RESET, CLK)
begin
if (reset = '1') then
Ausgang <= '0';
elsif(rising_edge(clk)) then
if (CLK_D120 = '1') then
-- mach was du machen willst
Ausgang <= Logik and Eingang;
else
Ausgang <= Ausgang
end if
end if;
end process;
end;
Die schreibweise zur Flankenerkennung kommt aus der
Simulationstechnik.
Bei der Methode von meinem Vorschreiber, wird auch eine Flanke erkannt,
wenn vom nicht definierten Zustand auf 1 gesetzt wird.
Das ist aber bei einer reinen Simulation nicht umbedingt richtig.
dehalb besser immer die Libraryfunktion rising_edge() benützten.
Gruß
Max
@ Max:
ist in deiner Beschreibung ein kleiner Fehler?
"
elsif( rising_edge(CLK)) then
if ( counter < 119)
CLK_D120 <= '0';
counter <= counter + 1;
else
CLK_D120 <= '0'; <- Hier müßte eine 1 zugewiesen werden, oder?
counter <= 0;
end if;
end if;
:-) Genau erfasst. Das war der Test, ob andere auch mitdenkst. Natürlich '1'. Man sollte sich seinen Beitrag genau durchlesen, bevor man in absenden. Gruß Max
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.