Hallo zusammen, Ich hab die Folgende Programme geschrieben,die sind Frequenzteiler,sie teilen mir einmal den 50 Mhz Taktfrequenz zu 19,2 Khz,und einmal zu 100 Hz.. könnte jemand mir sagen ob die Programme richtig sind oder nicht?und wenn nicht,wo liegt den fehler? Danke im voraus.. 50 Mhz zu 19,2 Khz: ENTITY frequenzteiler IS PORT (clock : IN bit ; t_clk : BUFFER bit ; END frequenzteiler ; ARCHITECTURE behaviour OF frequenzteiler IS BEGIN PROCESS VARIABLE count : integer RANGE 0 TO 2604 ; BEGIN WAIT UNTIL clock'event AND clock='1' ; count := count+1 ; CASE count IS WHEN 0 => t_clk <= NOT t_clk ; WHEN 2604/2 => t_clk <= NOT t_clk ; WHEN 2604 => count := 0; WHEN OTHERS => NULL ; END CASE ; END PROCESS; END behaviour; 50 Mhz zu 100 Hz: ENTITY frequenzteiler IS PORT (clock : IN bit ; t_clk : BUFFER bit ; END frequenzteiler ; ARCHITECTURE behaviour OF frequenzteiler IS BEGIN PROCESS VARIABLE count : integer RANGE 0 TO 500000 ; BEGIN WAIT UNTIL clock'event AND clock='1' ; count := count+1 ; CASE count IS WHEN 0 => t_clk <= NOT t_clk ; WHEN 500000/2 => t_clk <= NOT t_clk ; WHEN 500000 => count := 0; WHEN OTHERS => NULL ; END CASE ; END PROCESS; END behaviour;
also was mit grad auffällt is, dass das /2 glaub nicht synthetisierbar ist, man kann es zwar schreiben und simulieren aber man wirds nicht auf einen FPGA bringen können.
In Zweierpotenzen zu dividieren ist ja wohl peanuts und kein Problem fuer die Synthese. Da es sich hier eh um Konstanten handelt gibt es auch bei der Synthese keine Einschraenkung fuer den Divisor. Da das Ausgangssignal getoggelt wird, ist es ein Witz, das ganze mit einem case so aufzubauen, ein Zaehler fuer eine halbe Periode haette genuegt. Die angestrebte Teilung ist um einen clock cycle zu lang. Ein generischer Ansatz waehre besser, als wie hier zwei entities die gleich benannt sind und dann die Parameter via Taschenrechner hartcodiert. Keine initialisierung von count und Ausgangssignal, kein Problem fuer die Synthese aber sehr wohl fuer die Simulation. BUFFER outputs vermeiden und ein lokales signal verwenden. Falls das fuer interne Logik genutzt wird, in clock enable aendern. Cheers, Roger
ach ja, wenn das synthetisiert werden soll, dann in einen getakteten process umformen (if rising_edge(clock)...) und das wait rausschmeissen. Cheers, Roger
@Roger: Die waits gehen mit modernen Synthesetools (ab ISE 8?) völlig in Ordnung. Vorteil: Man spart sich die sensitivity list und eine if...end if Verzweigung. Nachteil: Asynchroner Reset geht so nicht zu realisieren. @Lu Kim: Neben den schon gennanten Tipps: "wait until rising_edge(clk);" sieht hübscher (lesbarer) aus. Rick
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.