Forum: FPGA, VHDL & Co. Frequenzteiler


von Eyla (Gast)


Lesenswert?

Hallo,

ich möchte mich ein wenig in Vhdl einarbeiten, und versuche mich an 
einer Weckuhr... -Leider kenne ich niemanden, der mir meine Fragen 
beantworten kann, deshalb versuche ich es über diesen Weg...

Ich habe 50Mhz und möchte die Weckuhr im Sekundentakt laufen lassen.

Nun habe ich einen Frequenzteiler im Internet gefunden, den ich aber 
nicht richtig verstehe:

sek_counter: process (takt, reset, takt_temp_2)
begin
 if reset '1' then takt_temp_2 <=x"00000000";
     sec_clk <=0;
elsif rising_edge (takt) then
    if takt_temp_2 >= 50000000 then
      sec_clock <= not (sec_clock);
       takt_temp_2 <= x"00000000"
       else
    takt_temp_2 <= takt_tempt_2+1
end if
else
takt_temp_2 <= takt_temp_2;
end if
end process sek_counter
sel_clk_free <='1' when takt-temp_2 >= 50000000 else '0'

Gibt es jmd liebes, der mir die einzelnen Zeilen Schritt für Schritt 
erklären kann?
Das wäre super lieb,

Liebe Grüße Eyla

von ... (Gast)


Lesenswert?

Hallo,

schau dir mal die Seite von Lothar an.
http://www.lothar-miller.de

Hier ist auch unter dem Code-Schnipsel ein Hello World! zufinden, wo 
auch ein Taktteiler drin ist:
http://www.lothar-miller.de/s9y/categories/48-Code-Schnipsel

Wenn du dich in diesen Beispielen eingearbeitet hast, wirst du es 
bestimmt selber verstehen. Zu Not fragst du einfach nochmal hier nach.

lg

von Eyla (Gast)


Lesenswert?

Dankeschön!!

Das einzige was ich jetzt nur nicht verstehe, ist das toggeln.

Was bedeutet das genau?

von Rene (Gast)


Lesenswert?

Toggeln = wechseln

Grüsse,
R.

von Eyla (Gast)


Lesenswert?

Also bedeutet das, wenn der Zähler in meinem Fall bis 50000000 gezählt 
hat, dann setzt er auf 0 zurück und gibt am Ausgang ein Signal aus?

if takt_temp_2 <= 50000000 then            --wenn auf 50 Mio gezählt
sec_clk <= not (sec_clk)                   -- auf sec_clk wechseln 
(ausgeben)

Sorry, aber genau DAMIT hab ich die Probleme...

von M. D. (wpmd)


Lesenswert?

Der Zustand von sec_clk wird gewechselt.
Ist sec_clk = 0 wird sec_clk auf 1 gesetzt
Ist sec_clk = 1 wird sec_clk auf 0 gesetzt

von Eyla (Gast)


Lesenswert?

Jetzt versteh ich garnix mehr....

Kann mir das nicht einfach jemand BITTE in einfachen Worten erklären??

Bitte...

Ich versteh nicht was das takt_temp_signal und was das sec_clk Signal 
ist...

So wie ich es verstehe, sind takt_temp die 50Mhz und sec_clk meine 1 Hz, 
die rauskommen, wenn takt_temp auf 50Mio gezählt hat.

Versteh ich falsch, oder?!

von M. D. (wpmd)


Lesenswert?

Das Signal takt sind die 50MHz
takt_temp_2 wir von 0 bis 50.000.000 gezählt.
Wenn takt_temp_2 noch kleiner als 50.000.000 ist, wird takt_temp_2 um 1 
erhöht.

takt_temp_2 <= takt_tempt_2+1   --> takt_temp_2 um 1 erhöhen


Ist 50.000.000 erreicht (oder überschritten) wird takt_temp_2 wieder au 
0 gesetzt und sec_clock wird getoggelt (also von 0 auf 1 oder anders 
herum, je nach vorherigem Zustand).

    if takt_temp_2 >= 50000000 then
      sec_clock <= not (sec_clock);  --> sec_clock toggeln
      takt_temp_2 <= x"00000000"     --> takt_temp_2 auf 0 setzen

von ... (Gast)


Lesenswert?

Wenn man mal dein Bsp. vor Augen nimmt:
1
...
2
PORT (
3
  takt   :  in std_logic;
4
  reset  :  in std_logic;
5
  one_sek:  out std_logic
6
);
7
...
8
signal takt_temp_2: integer range 0 to 49999999:= 0; -- gesamt 50000000 Takte = 1 Sek.
9
signal sec_clk : std_logic;
10
11
...
12
sek_counter: process (takt, reset)--, takt_temp_2) weg damit
13
begin
14
if reset = '1' then 
15
  takt_temp_2 <= 0;
16
  sec_clk <=0;
17
elsif rising_edge (takt) then
18
  if takt_temp_2 = 49999999 then
19
    sec_clock <= not (sec_clock);
20
    takt_temp_2 <=  0;
21
  else
22
    takt_temp_2 <= takt_tempt_2 + 1;
23
  end if;
24
--else                               weg damit
25
--takt_temp_2 <= takt_temp_2;        weg damit
26
end if;
27
end process sek_counter;
28
--sel_clk_free <='1' when takt_temp_2 >= 50000000 else '0';      weg damit
29
30
one_sek <= sec_clock;

Versuche mal es so. Nimm die IEEE.NUMERIC_STD.ALL Library und zähle mit 
integer anstatt vektoren. Wenn du Vektoren unbedingt als Zähler 
verwenden willst, dann nur unsigned oder signed (auch gleiche library), 
denn nur die kannst du abfragen mit z.b. if unsigned_vector >= 500000000 
then.

Der Trick in der ganzen Sache ist ja, dass dein Prozess mit 50MHz 
getaktet ist, also mit 20ns! Mit dem takt_temp_2 zählst du die Takte bis 
eine Sekunde hoch, also 20ns * 50000000 = 1 Sek. Und genau hier toggelst 
du dein Signal sec_clock. Dann wiederholt sich die ganze Sache wieder, 
da takt_temp_2 wieder auf 0 gesetzt wird. Somit hast du dann sec_clock, 
der jede Sekunde seinen Pegel invertiert und könntest es bspw. an 
one_sek zuweisen, der auf ein ext. pin geht.

lg

von Eyla (Gast)


Lesenswert?

Danke!!! Super, jetzt verstehe ich es!

Sehr lieb!!

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.