Forum: FPGA, VHDL & Co. VHDL: 100 MHz Clock auf 100 kHz und 20 kHz teilen?


von Frank (Gast)


Lesenswert?

Hi,

ich möchte folgende erzeugte Clock auf 100 kHz und 20 kHz teilen:

ARCHITECTURE clk of clock is

BEGIN
    PROCESS
    BEGIN
        clk <= '1';         -- ein HIGH-Puls von 5 ns
        WAIT FOR 5 ns;      -- gefolgt von einen
        clk <= '0';         -- LOW-Puls von 5 ns
        WAIT FOR 5 ns;      -- ergibt eine Periodendauer von 10 ns => f= 
100Mhz
    END PROCESS;
END clk;


Ich habe die 100 KHz so probiert, aber ist das okay so?

Freq_teiler: PROCESS (clk)  -- frequenz 100 Mhz auf 100 Khz runter 
bringen
    BEGIN
      IF rising_edge (clk) THEN
        IF reset = '1' THEN
          zaehler <= 0;
          clk_intern <= '0';
        ELSE
          zaehler <= zaehler + 1;
            IF zaehler = 250 THEN     -- zaehlt bis 250 , dann toggle
              zaehler <= 0;
              clk_intern <= NOT clk_intern;
              D_clock <= NOT clk_intern;
            END IF;
        END IF;
      END IF;
    END PROCESS Freq_teiler;


Vielen Dank,

gruß Frank

von Armin (Gast)


Lesenswert?

wenn du bis 250 zählst, dann dauert eine Periode 500 Takte.
Dein Simulatorsignal hat 2x5ns = 10ns Periode
500 Takte * 10 ns = 5µs pro heruntergetakteter Periode
Damit kommst du auf eine Frequenz von 200 kHz.

Sonst müsste das passen - auch wenn die Schreibweise seltsam ist. Auch 
bin ich mir nicht sicher, ob das überflüssige Flipflop D_clock == 
clk_intern herausoptimiert wird. Ich würde diese Zuweisung lieber 
nebenläufig außerhalb des Prozess schreiben:
D_clock <= clk_intern;

Vielleicht wäre auch eine andere Benennung sinnvoll, denn soweit ich das 
verstanden habe, verwendet man ein solches heruntergetaktetes nicht am 
Clock-Eingang weiterer Logik, sondern es hat Enable-Funktion.
Dann müsste das Tastverhältnis aber aber anders sein, damit der Enable 
wirklich nur einen 100MHz-Takt lang an ist!

von Frank (Gast)


Lesenswert?

Hallo Armin,

danke für die Hilfe und die Tipps (:

Viele Grüße Frank

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
    IF zaehler = 250 THEN     -- zaehlt bis 250 , dann toggle
Dein geteilter Takt ist zu langsam: 0...250 sind 251 Zählschritte  :-o
Du solltest bei 249 den Zähler zurücksetzen und toggeln. Denn das:
1
          zaehler <= zaehler + 1;
2
          IF zaehler = 250 THEN     -- zaehlt bis 250 , dann toggle
3
             zaehler <= 0;
4
             :
5
          END IF;
Ist genau das selbe wie das:
1
          IF zaehler = 250 THEN     -- zaehlt bis 250 , dann toggle
2
             zaehler <= 0;
3
             :
4
          ELSE
5
             zaehler <= zaehler + 1;
6
          END IF;
Stichworte: Signalzuweisung im Prozess

BTW:
1
   IF zaehler = 250 THEN     
2
       clk_intern <= NOT clk_intern;
Das ist sehr unsauber. So sollten in der Praxis keine internen Takte 
erzeugt werden. Siehe Taktung FPGA/CPLD..

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
Noch kein Account? Hier anmelden.