Forum: FPGA, VHDL & Co. Frequenzteiler


von Lu Kim (Gast)


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;

von Matthias F. (flint)


Lesenswert?

Ich sehe nicht, wo count initialisiert wird.

von Nephilim (Gast)


Lesenswert?

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.

von Roger S. (edge)


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

von Roger S. (edge)


Lesenswert?

ach ja, wenn das synthetisiert werden soll, dann in einen getakteten 
process umformen (if rising_edge(clock)...) und das wait rausschmeissen.

Cheers, Roger

von Rick Dangerus (Gast)


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

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.