www.mikrocontroller.net

Forum: FPGA, VHDL & Co. FPGA - VHDL - durch TAKT umschalten


Autor: Vi-ta-lee U. (uv-777)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

könnte eine banale Frage sein, aber irgendwie komme ich nicht auf die 
Lösung. Kann mir da bitte jemand helfen?

Wie kann ich bei jeder steigenden Flanke des CLK mit jedem kurzen Impuls 
des Signals "Nächste" einen "Ausgang" abwechselnd umschalten.

Also bei jedem "Nächste" soll "Ausgang" von 0 auf 1 und umgekehrt 
wechseln, das ganze aber synchron zum CLK und in VHDL.

Vielen Dank für eure Vorschläge.

Mein Ansatz wäre sowas (ist natürlich falsch):

---------
if naechste='1' then
zahl <= zahl + 1;

elsif zahl_a="1" then
Ausgang<='1';
zahl<="0";

else
Ausgang<='0';
end if;

--------

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[vhdl]
if (CLK'event and CLK = '1') then
    if (naechste = '1') then
        ausgang = '1';
    else
        ausgang = '0';
    end if;
end if;
[vhdl]

meinst du sowas?

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute er meint so etwas:
if (CLK'event and CLK = '1') then
    if (naechste = '1') then
        ausgang <= not ausgang;
    end if;
end if;

Autor: Vi-ta-lee U. (uv-777)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow Danke Leute,

ging ja super schnell!!!

Ich werds gleich ausprobieren und euch hoffentlich die Funktion 
bestätigen.

Vi-Ta-Lee

Autor: ms (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SOWAS meint er garantiert nicht, schaus dir mal genau an

Autor: ms (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder doch, mein fehler :)

Autor: Vi-ta-lee U. (uv-777)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab nun folgendes drin:

Die Ausgänge CS und WR bleiben aber ständig 0, warum?
---
signal Puffer1: STD_LOGIC;
signal Puffer2: STD_LOGIC;

begin

process (CLK, Reset) 
begin
   if Reset='1' then            
  CS <= '0';
  WR <= '0';


elsif CLK>='1' and CLK'event then

-- if ...... 

elsif (naechste = '1') then
          Puffer1 <= not Puffer1;
          Puffer2 <= not Puffer2;
          CS <= Puffer1;
          WR <= Puffer2;
          end if;

end if;

end process;


end Behavioral;


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil das ziemlich albern ist... Das letzte "else if" ist deiner 
Originalaufgabenstellung nach falsch (sollte stattdessen nur ein "if" 
sein). außerdem: Welchen Wert hat RESET?

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib mal zur Sicherheit:
signal Puffer1: STD_LOGIC := '0';
signal Puffer2: STD_LOGIC := '0';
Zumindest ISim kommt damit besser klar.
> elsif CLK>='1' and CLK'event then
Was soll denn dieses >='1' bedeuten? Ein CLK='1' sollte doch wohl 
reichen.
> -- if ......
Bist du sicher, dass diese Bedingung auch irgendwann mal false wird, 
sodass das darauf folgende elsif überhaupt eine Wirkung haben kann?
Ansonsten kann ich keinen direkten Fehler erkennen; dazu muss mehr des 
drumherum bekannt sein.

Autor: Vi-ta-lee U. (uv-777)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun habe ich das elsif gegen if ersetzt.

Der Reset tritt nur ganz kurz am Anfang auf und "Resetet" mir alles.

Die jetzige Simulation setzt mir die nach dem Reset die Ausgänge (WR und 
CS) auf 0, nach dem ersten "naechste" Takt sind jedoch die Ausgänge 
ständig "undefiniert"

Autor: Vi-ta-lee U. (uv-777)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So es funktioniert, vielen DANK an alle!!!!

Ihr glaubt garnicht, wie lange mich das beschäftigt hat!

Der Fehler lag diesmal an dem ISim

signal Puffer1: STD_LOGIC := '0';
signal Puffer2: STD_LOGIC := '0';


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
signal Puffer1: STD_LOGIC := '0';
signal Puffer2: STD_LOGIC := '0';

begin

process (CLK, Reset, Puffer1, Puffer2) 
begin
    if Reset='1' then            
        CS <= '0';
        WR <= '0';
    else
        if (CLK'event and CLK = '1') then
            if (naechste = '1') then
                Puffer1 <= not Puffer1;
                Puffer2 <= not Puffer2;
                CS <= Puffer1;
                WR <= Puffer2;
            end if;
        end if;
    end if;
end process;

end Behavioral;

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, Moment mal. Welchen FPGA-Typ verwendest du? Viele Typen erlauben 
eine automatische Initialisierierung, d.h. die Zustände der FFs nach der 
Konfiguration können in VHDL durch das := festgelegt werden. Dadurch 
würdest du dir den Reset sparen - solche Resets sind nicht ganz 
ungefährlich (hier Beitrag "FPGA: Verständnisproblem, asynch. Reset" wurde das 
ausgiebig diskutiert, hoffentlich hab ich den richtigen Beitrag 
erwischt). Außerdem setzt du bei deinem Reset die Ausgänge CS und WR auf 
'0' - es wäre vermutlich besser, Puffer1/2 auf 0 zu setzen.
Und:
elsif (naechste = '1') then
          Puffer1 <= not Puffer1;
          Puffer2 <= not Puffer2;
          CS <= Puffer1;
          WR <= Puffer2;
Dir ist klar, dass das ein FIFO ist: Bei einer Taktflanke wird Puffer1 
auf '1' gesetzt, bei der folgenden Flanke wird dann auch CS auf '1' 
gesetzt, während im gleichen Moment Puffer1 auf '0' gesetzt wird.
Vermutlich meinst du so etwas:
process (CLK,Reset)
begin
  if (Reset = '1') then
    Puffer1 <= '0';
    Puffer2 <= '0';
  else
    if (CLK'event and CLK='1') then
      if (Naechste = '1') then
        Puffer1 <= not Puffer1;
        Puffer2 <= not Puffer2;
      end if;
    end if;
  end if;
end process;
CS <= Puffer1;
WR <= Puffer2;
Allerdings könntest du dir dabei die 2 Puffer sparen, da sie ja eh 
ständig den gleichen Wert haben.

Autor: Vi-ta-lee U. (uv-777)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Leute,

es waren alles sehr nützliche Tips:

1. Problem gelöst (Wechsel durch Takt)
2. Viel gelernt:
Nämlich: Sehr nützlicher Tip mit dem FIFO (anderes Problem gelöst) und 
das man die Variablen = 0 setzen sollte und nicht den Ausgang!

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.