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.