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 )
---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all;
entity flashing is Port ( switch_1 : in STD_LOGIC;
clk_1 : in STD_LOGIC; led_1 : out STD_LOGIC); end flashing;
architecture Behavioral of flashing is
begin count: process (clk_1, switch_1)
variable cnt : integer := 0;
begin
if (cnt=5000000 and clk_1='1' and switch_1='1') then
led_1
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
Re: blinkende led
Zitat: DaMicha Um Deinen Counter-Wert zu halten benötigst Du ein flankengesteuertes Speicherelement. Also ein Register (Flipflops)*gegendiestirnschlag* Argh, darauf hätte ich auch selbst kommen können
Zitat: DaMicha 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...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
Zitat: DaMicha Ich habs jetzt nicht ausprobiert, aber mit den Signalnamenanpassungen sollte es so klappen.Hab noch einige Dinge anpassen müssen, aber funzt
Zitat: DaMicha Ach so, der Reset ist asynchron und Low-AktivLow-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
Zitat: Gast Zitat: DaMicha Ach so, der Reset ist asynchron und Low-AktivLow-Aktiv meint es geschieht eine Aktion wenn er 0 ist? Asynchron? Huh? 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;