VHDL-Forum

 
Sie sind nicht eingeloggt.
LoginLogin Kostenlos anmeldenKostenlos anmelden
BeiträgeBeiträge MembersMitglieder SucheSuche HilfeHilfe
VotesUmfragen FilesDateien CalendarKalender BookmarksBookmarks
blinkende led

Anfang   zurück   weiter   Ende
Autor Beitrag
mish
Neuling


Beiträge: 6

New PostErstellt: 24.10.06, 19:39  Betreff: blinkende led  drucken  Thema drucken  weiterempfehlen Antwort mit Zitat  

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?

nach oben
Benutzerprofil anzeigen Private Nachricht an dieses Mitglied senden
Gast
New PostErstellt: 26.10.06, 09:05  Betreff: Re: blinkende led  drucken  weiterempfehlen Antwort mit Zitat  

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

    Zitat:
    ----------------------------------------------------------------------------------
    -- Company: none
    -- Engineer: Mish
    --
    -- Create Date: 18:08:57 10/24/2006
    -- Design Name:
    -- Module Name: flashing - Behavioral
    -- Project Name:
    -- Target Devices:
    -- Tool versions:
    -- Description:
    --
    -- Dependencies:
    --
    -- Revision:
    -- Revision 0.01 - File Created
    -- Additional Comments:
    --
    ----------------------------------------------------------------------------------
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    ---- 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 <= '1';
    cnt:=0;

    else
    led_1 <= '0';
    cnt:=cnt+1;

    end if;



    end process;

    end Behavioral;
nach oben
mish
Gast
New PostErstellt: 26.10.06, 09:38  Betreff: Re: blinkende led  drucken  weiterempfehlen Antwort mit Zitat  

der gast war ich
nach oben
DaMicha
Stammgast


Beiträge: 27
Ort: Rostock

New PostErstellt: 26.10.06, 12:49  Betreff: Re: blinkende led  drucken  weiterempfehlen Antwort mit Zitat  

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.

nach oben
Benutzerprofil anzeigen Private Nachricht an dieses Mitglied senden
Gast
New PostErstellt: 27.10.06, 09:24  Betreff: Re: blinkende led  drucken  weiterempfehlen Antwort mit Zitat  

    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-Aktiv
Low-Aktiv meint es geschieht eine Aktion wenn er 0 ist?
Asynchron? Huh?


Achso:
Danke vielmals für deine Unterstützung
nach oben
DaMicha
Stammgast


Beiträge: 27
Ort: Rostock

New PostErstellt: 01.11.06, 10:28  Betreff: Re: blinkende led  drucken  weiterempfehlen Antwort mit Zitat  

Moin Mish

    Zitat: Gast
      Zitat: DaMicha
      Ach so, der Reset ist asynchron und Low-Aktiv
    Low-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;

Bis denn,
DaMicha.


[editiert: 01.11.06, 10:28 von DaMicha]
nach oben
Benutzerprofil anzeigen Private Nachricht an dieses Mitglied senden
Sortierung ndern:  
Anfang   zurück   weiter   Ende
Seite 1 von 1
Gehe zu:   
Search

powered by carookee.com - eigenes profi-forum kostenlos

Design © trevorj