www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Eventabfrage in if-Schleifen


Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe zu meinem Problem nirgendwo was gefunden und ich muss sagen ich 
bin ein VHDL-Anfänger.

Wie aus der Überschrift hervorgeht, habe ich ein Problem mit der 
Eventabfrage.

Kann mir einer beantworten, warum sowas nicht geht?

If(input1'event) then
...
elsif(input2'event) then
...

Modelsim meckert beim Kompilieren nicht herum, aber mit Xilinx ISE geht 
das nicht und es meckert herum wegen irgendwas von wegen Synchronität... 
:(

und dann habe ich noch ein zweites Problem:
"
....
if modus=1 then
          if activein='0' and arbeitet='0' then
             arbeitet:='1';
             activeout<='1';
          end if;
          if arbeitet='1' then
           if(takt'event) then
              if(richtung='0') then
              count:=(count+1)MOD 8;
                else
..."


hier erkennt er nicht mal mehr, was takt'event bedeuten soll. ist für 
ihn unknown...

Hoffentlich kann mir hierfür einer eine Erklärung liefern. :) Wäre echt 
nett. Ich danke schon mal im Voraus für die Bemühungen.


Beste Grüße,

Oliver

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
If(input1'event) then
  a <= b;
elsif(input2'event) then
...
Mit dem 'event-Dingens wird ein flankengesteuertes FlipFlop generiert: 
Dieses FlipFlop hat einen Clock-Eingang, und wenn der auf '1' schaltet 
(Flanke) speichert es. D.H. Das FlipFlop übernimmt den Wert von b nach 
a. Allerdings kann das FlipFlop nicht prüfen ob gerade input2 eine 
Flanke hat und input1 nicht (was du ja mit elsif beschrieben hast). Das 
wäre auch ungenau, weil theoretisch ist so eine Flanke ja unendlich kurz 
und "gleichzeitig" ist da ein schwieriger Begriff, sozusagen. Außerdem 
hättest du damit mehrere Takte, und das sollte man sowieso nur machen, 
wenn es absolut nicht anders geht.
Sind input1/2 Daten-Eingänge? Die sollte man sowieso nicht auf Flanken 
überprüfen, weil vorgeschaltete LUT-Logik durch unterschiedliche 
Signallaufzeiten Spikes/Glitches erzeugen kann, die das FlipFlop 
"auslösen", wenn es eigentlich gar nicht sein soll. Lieber synchron zu 
einem Takt die Daten übernehmen.
> if modus=1 then
>           if activein='0' and arbeitet='0' then
>              arbeitet:='1';
>              activeout<='1';
>           end if;
>           if arbeitet='1' then
>            if(takt'event) then
>               if(richtung='0') then
>               count:=(count+1)MOD 8;
>                 else
> ..."
Das kann auch nicht funktionieren. Es gibt nur FlipFlops, die bei 
steigender Flanke oder bei fallender Flanke schalten, aber keine 
FlipFlops die bei beiden Flanken schalten, aber genau das hast du 
geschrieben: takt'event bezieht sich auf beide Flanken. Schreib if 
(takt'event and takt='1') für die steigende Flanke und if (takt'event 
and takt='0') für die fallende. Das gilt auch für das erste 
Code-Schnipsel.

Falls du überprüfen willst, ob sich ein signal von einer Flanke zur 
nächsten des taktes verändert hat, verwende das:
architecture ...
  signal temp : std_logic;
begin
  process (clk,input,temp)
  begin
    if (clk'event and clk='1') then -- Steigende Takt-Flanke
      temp <= input; -- Alten Wert setzen
      if ((input xor temp) = '1') then -- Hat sich das input-Signal verändert?
        -- Hier irgendetwas ausführen
      end if;
    end if;
  end process;
end architecture;


Übrigens: if- Schleife ist falsch, ein if-Block wird immer nur 0 oder 
1 mal ausgeführt, und ist deshalb keine Schleife.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine ausführliche und hilfreiche Antwort. Nun ist mir einiges 
klarer.

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

Bewertung
0 lesenswert
nicht lesenswert
> Modelsim meckert beim Kompilieren nicht herum, aber mit Xilinx ISE geht
> das nicht und es meckert herum wegen irgendwas von wegen Synchronität...
VHDL ist eine Systembeschreibungs- und Verifikationssprache. Nur ein 
klitzekleiner Teil des VHDL-Sprachumfangs ist auf Hardware abbildbar.

Eine simple Beschreibung wie
  ausgang <= eingang after 500 ns;
ist z.B. schon nicht mehr synthetisierbar. Darüber hinaus ist schon eine 
einfache Integer-Division nicht synthetisierbar (solange der Nenner 
nicht zufällig fix und eine Zweier-Potenz ist).

Du mußt dir klar darüber sein, dass es in einem FPGA nur Logik (LUTs) 
und Flipflops gibt. Ein Flipflop ist idR. nur auf eine der beiden 
möglichen Flanken sensitiv. Dort gibt es also nur entweder rising_edge() 
oder falling_edge().

Sieh dir mal die in der Literatur gängigen Beschreibungen für 
FPGA-Designs an. Du wirst keine finden, in der das Taktsignal /irgendwo 
in der Mitte/ eines Prozesses abgefragt wird. Schon einfachste 
Abweichungen von der üblichen Schreibweise sorgen für Diskussionen, wie 
ich in http://www.lothar-miller.de/s9y/categories/6-Clock-Enable 
festgehalten habe ;-)
In Ausnahmefällen geht sowas, aber wie gesagt: es stehen im FPGA nur FFs 
und LUTs zur Verfügung. Darauf muß deine Beschreibung abgebildet werden 
können.

Autor: Daniel (root) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die if-Schleife ist kein VHDL Phänomen. Das weiss ich aus meiner
Tutorerfahrung ;-)

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel (root) schrieb:
> Die if-Schleife ist kein VHDL Phänomen. Das weiss ich aus meiner
> Tutorerfahrung ;-)

Oh ja, alle Jahre wieder wenn ich meinen Erstis JAVA beibringen muss :)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jaja bei der if-Schleife habe ich mal wieder nicht nachgedacht und 
einfach irgendwas geschrieben. for-schleifen sind es in java halt. kA 
warum ich dann if-schleife schreibe :)

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.