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
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
Dankeschön!! Das einzige was ich jetzt nur nicht verstehe, ist das toggeln. Was bedeutet das genau?
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...
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
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?!
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
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
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.