VHDL-Forum - Anfänger

blinkende led

blinkende led

hi zusammen

ich glaube hier in der anfänger section bin ich goldrichtig

also folgendes: ich habe mir ein spartan-3e geholt und bin nun ein wenig damit am rumspielen.

ich wollte gerne eine led zum blinken bringen.
ich habe dazu einen and3 genommen und die zwei kippschalter und den clock and die inputs und das led als output genommen.
so weit so gut, simulieren klappt eigentlich auch (led leuchtet nur wenn alle 3 inputs oben sind)
das ganze hab ich dann auf das board übertragen, auch dort scheint es zu funktionieren, da die clock aber mit 50MHz läuft sehe ich das blinken wahrscheinlich nicht
ich habe versucht den clock takt per dcm zu verändern aber irgendwie...naja

was mache ich falsch? oder gibt es eine einfachere möglichkeit?

Re: blinkende led

Niemand? OK
Ich habe mir überlegt, eigentlich könnte ich einen counter machen und den inkrementieren, wenn er einen gewissen wert erreicht, kann ich ein ausgangssignal geben und den counter und das ausgangssignal das nägste mal wieder zurücksetzen... (ja ich weiss ich bin nicht gut im Erklären )

ich glaube der code machts verständlicher

Re: blinkende led

der gast war ich

Re: blinkende led

Moin Mish.

Das geht so nicht ;).

Um Deinen Counter-Wert zu halten benötigst Du ein flankengesteuertes Speicherelement. Also ein Register (Flipflops).
Was Du Dir da gebaut hast sind Latche. Sind diese offen, wenn z.B. die if-Bedingung erfüllt ist, dann hast Du irgend etwas rückgekoppeltes und schwingendes...

Wie wäre es mit folgendem:

reg: process (clk, reset)

variable cnt : integer;
variable led : std_logic;

begin

if (reset = '0') then
cnt := 0;
led := '0';
elsif (rising_edge(clk)) then

if (cnt = 5000000-1) then
cnt := 0;
led := not led; -- light on / light off
else
cnt := cnt + 1;
end if;

end if;

led_1 <= led;

end process;

Ich habs jetzt nicht ausprobiert, aber mit den Signalnamenanpassungen sollte es so klappen.
Ach so, der Reset ist asynchron und Low-Aktiv

Viel Spaß,
DaMicha.

Re: blinkende led

*gegendiestirnschlag* Argh, darauf hätte ich auch selbst kommen können

Genau das gleiche habe ich gedacht als ich mir die Simulation angeschaut habe, es hat zwar annähernd das gemacht was ich wollte, aber immer hat irgendwas nicht gepasst

Hab noch einige Dinge anpassen müssen, aber funzt

Low-Aktiv meint es geschieht eine Aktion wenn er 0 ist?
Asynchron? Huh?


Achso:
Danke vielmals für deine Unterstützung

Re: blinkende led

Moin Mish

Es gibt prinzipiell zwei Wege einen Reset an einem Register zu realisieren: synchron oder asynchron (oder beides) zum Takt.
Synchron bedeutet, dass mit dem Takt der Inhalt des Registers zurück gesetzt wird.
Asynchron bedeutet, dass unabhängig zum Takt der Inhalt des Registers zurückgesetzt wird.
In VHDL sieht das folgendermaßen aus:

synchron:
if (rising_edge(clk)) then
if (reset = '0') then -- low aktiver reset !
cnt := 0;
else
cnt := cnt + 1;
end if;
end if;

asynchron:
if (reset = '0') then
cnt := '0';
elsif (rising_edge(clk)) then
cnt := cnt + 1;
end if;

Der Vorteil des asynchronen Resets ist, dass Du Deine Logik in einen definierten Zustand bekommst, ohne dass der Takt schon anliegt. Sobald also der Takt da ist, kann es definiert losgehen!

und hier nochmal die Mischform, die sich automatisch ergibt, sobald man weitere Logik dem Prozess hinzufügt.

if (reset = '0') then
cnt := '0';
elsif (rising_edge(clk)) then
if (set_to_0 = '1' or irgend_was_anderes = '0') then
cnt := 0;
elsif
cnt := cnt + 1;
end if;
end if;

Bis denn,
DaMicha.