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
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!
Hallo Armin, danke für die Hilfe und die Tipps (: Viele Grüße Frank
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.