www.mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL, Taktproblem, LED


Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

als Anfänger habe ich mal eine LED zum Blinken gebracht und zwar mit 
diesem CODE: (takt eingang ist 27 MHZ)


    ----------------- STEUERUNG LED2
    process (clk, reset)

    variable cnt: integer;
    variable led: std_logic;

    begin

    if (clk = '1') and clk'event then
    if reset = '1' then
    cnt:= 0;
    led:= '0';
    elsif (cnt = 27000000) then        -- da 27 MHZ
    cnt := 0;
    led:= not led;
    else
    cnt:= cnt +1;
    end if;
    end if;


    LED2<=led;
    end process;

Mit den Zahler habe ich das auch soweit verstanden und was da gemacht 
hab auch :) Jetzt wollte ich aber das ich die LED für eine 1 sek alle 3 
sekunden blinken lass. Mit dem Code aber geht es nur 3 sek an 3 sekunden 
aus. (entsprechen cnt 27000000 auf 81000000)

ich hab mir überlegt mit der fallenden Flanke wieder runterzählen zu 
lassen, aber weiss nicht wie ich das so bewerkstelligen soll.


Kann mir jemand helfen?


Danke

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorab:
In VHDL dürfen am Zeilenanfang Leerzeichen stehen. Das verhilft zu 
deutlich besserem Überblick...

> für eine 1 sek alle 3 sekunden blinken lass
Also 1 sec an, 2 sec aus?
Wie wärs damit:
  signal cnt: integer;

  process (clk) -- reset ist hier unnötig, weil synchron
  begin
    if (clk = '1') and clk'event then
       if reset = '1' then
          cnt <= 0;
       elsif (cnt = 27000000*3) then        -- da 27 MHZ
          cnt <= 0;
       else
          cnt<= cnt +1;
       end if;
    end if;
  end process;

  LED2 <= '1' when cnt<27000000 else '0';

BTW:
Als Anfängerregel: vermeide Variable.
Such dazu einfach mal hier im Forum nach
+problem +variabl*
Und du findest z.B. den Beitrag "Beschreibung einer State Machine"

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

super danke für die Antwort, funktionieren tut es auch aber so ganz hab 
ich es nicht verstanden...

-- elsif (cnt = 27000000*3) then
Das heisst er zahlt hier  bis 81MHZ  ?

-- LED2 <= '1' when cnt<27000000 else '0';
Heisst es wenn der takt auf 27 MHZ ist leuchtet die diode ansonsten 0.


Was mir aber aufgefallen ist, das die LED ständig leuchtet, und beim 
Reset anfängt zu blinken, vorher war sie aber aus und hatt erst 
angefangen zu blinken wenn ich reset gedruckt hab?


Gruss

Danke!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was mir aber aufgefallen ist, das die LED ständig leuchtet
Ja, da mußt du mit den Resetwerten und dem Vergleicher noch etwas 
herumspielen ;-)

> Das heisst er zahlt hier  bis 81MHZ  ?
Nein, er zählt auf 3 mal 27Mio, also 3 mal 1 Sekunde.

> Heisst es wenn der takt auf 27 MHZ ist leuchtet die diode ansonsten 0.
Wieder nein.
Solange der Zählerstand kleiner 27Mio ist, wird eine 1 ausgegeben. In 
deinem Fall braucht er für die 27Mio Zählschritte 1 Sekunde.

BTW:
Du machst es der Toolchain leichter, wenn du den Bereich deiner Integer 
einschränkst.
  signal cnt: integer range 0 to 81000000;

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lothar!


Ich bin ebenfalls VHDL-Anfänger und habe eine kurze Verständnisfrage zu 
dem VHDL-Code.
In diesem Code wird von 0 bis (27000000*3) hochgezählt, was bedeutet, 
dass im Ganzen (27000000*3)+1 Takte gezählt werden und nicht 
(27000000*3).
Demnach dauern in dem Beispiel diese 3 Sekunden um genau (1/27000000)s 
länger als es sein sollte.

Ich möchte jetzt nicht als Wichtigtuer abgestempelt werden, bei einer 
Anzeigeblinkled ist das wirklich egal. Es geht mir nur um das eigene 
Verständnis.

Verhält es sich so, wie ich oben geschrieben habe?
Danke im Voraus.


Schöne Grüße

Max

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Verhält es sich so, wie ich oben geschrieben habe?
Richtig.

Das macht bei 81000000 nicht viel aus (ein Quarz ist ungenauer), aber 
wenns mal ein Teiler durch 10 sein soll, dann sind es gleich 10% 
Unterschied, ob ich von 0 bis 9 zähle oder von 0 bis 10. Korrigiert 
sollte es heissen:
signal cnt: integer range 0 to 27000000*3-1;
:
 elsif (cnt = 27000000*3-1) then
    cnt <= 0;
:

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar und andere Fortgeschrittene:

Falls der Zählerendwert (limit) variabel gestaltet wird, verschluckt 
sich bei Xilinx die Synthese manchmal und es wird Unsinn synthetisiert 
:-/
Die Synthese (und die Simulation) läuft problemlos durch, nur das Design 
(und die Netzlistensimulation) funktioniert nicht.
signal limit: integer range 0 to 27000000*3-1;
signal cnt  : integer range 0 to 27000000*3-1;
:
 elsif (cnt = limit-1) then -- WARNING: the -1 can cause synthesis errors!
    cnt <= 0;
:
Das wollte ich nur mal erwähnt haben, damit sich mancher vielleicht ein 
paar Tage Fehlersuche ersparen kann.

Duke

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Duke Scarring
> Falls der Zählerendwert (limit) variabel gestaltet wird
> verschluckt sich bei Xilinx die Synthese manchmal
Das ist ein unschönes Verhalten... :-/
Hast du dazu noch irgendwelche Rahmenbedingungen?
Variable Zähler-Endwerte sind an sich nicht ungewöhnlich. Hängt es "nur" 
an der Manipulation des Zählerendwertes für den Vergleich (die -1)?
Sowas macht evtl. Probleme:
  elsif (cnt = limit-1) then
Sowas aber nicht:
  elsif (cnt = limit) then

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar:
Ja, es hängt nur an der Subtraktion des Zählerendwertes für den 
Vergleich.

Duke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.