Frequenzteiler

Gast #939367
Lesenswert?

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;
#939438
Lesenswert?

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
Gast #939699
Lesenswert?

@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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren