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


von Oliver (Gast)


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

von Niklas G. (erlkoenig) Benutzerseite


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:
1
architecture ...
2
  signal temp : std_logic;
3
begin
4
  process (clk,input,temp)
5
  begin
6
    if (clk'event and clk='1') then -- Steigende Takt-Flanke
7
      temp <= input; -- Alten Wert setzen
8
      if ((input xor temp) = '1') then -- Hat sich das input-Signal verändert?
9
        -- Hier irgendetwas ausführen
10
      end if;
11
    end if;
12
  end process;
13
end architecture;


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

von Oliver (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
1
  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.

von Daniel (root) (Gast)


Lesenswert?

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

von D. I. (Gast)


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 :)

von Oliver (Gast)


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 :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.