Forum: FPGA, VHDL & Co. VHDL - unerwartetes Verhalten


von Thomas Pfeifer (Gast)


Lesenswert?

Hallo zusammen,
habe mit vor ein paar Tagen ein Spartan3-Kit zugelegt und mache nun
meine ersten Gehversuche in VHDL.

Inzwischen habe ich auf dem VGA-Monitor einen Balken, den ich mit zwei
Tastern hin- und her bewegen kann.

Der Code dazu sieht so aus:

  signal x   : std_logic_vector (8 downto 0);

  (... VGA-Signal-Erzeugung, Balken an Position x zeichnen...)

  if (vertical_counter=521) then --frame-sync (60/s)
    vertical_counter <= "0000000000";
    if left='1' then
      x<=x-1;
    end if;
    if right='1' then
      x<=x+1;
    end if;
  end if;

left und right sind dabei mit den Tastern verbunden.
Funktioniert auch wunderbar. Interessant wird es aber, wenn man beide
Taster gleichzeitig drückt.
Anders als erwartet bleibt der Balken dann nicht stehen, sondern
wandert nach rechts !

Nun frage ich mich warum.
Ist das Verhalten gar undefiniert weil x dann ja quasi gleichzeitig bei
jedem vsync inkrementiert und dekrementiert wird ?
Warum gibt ISE (V8.1i) dann kein Warning aus ? Oder muss man auf
soetwas selber achten ?

von Rainer S. (rainersp)


Lesenswert?

Hallo Thomas,

das Verhalten ist soweit undefiniert, wenn Du zwei entgegensätzliche
Reaktionen programmierst. ISE optimiert sich das in der Synthese dann
so hin, das beide Sachen funktionieren. Was aber passiert, wenn beide
Tasten gedrückt sind, ist nicht vorherzusagen. Du musst dann an solchen
Stellen das Verhalten entsprechend vorgeben.

Gruß,
Rainer

von Ssss S. (sssssss)


Lesenswert?

Hi!

Lass dir mal anzeigen was der vhdl Compiler daraus generiert
(view RTL Schematic):

Bei mir wird daraus folgendes:
counter updown:
CE = right or left
UP = right

Auf sowas musst du selber achten...
Beim drücken beider Buttons steht dort ja:
x<=x-1;
x<=x+1;
und der compiler guckt sich das dann an und nimmt in dem Fall
wohl (immer?) die letzte Zuweisung...

du willst vermutlich folgendes:
1
if (left = '1' AND right = '0') then
2
  x <= x-1;
3
elsif (left = '0' AND right = '1') then
4
  x <= x+1;
5
else
6
  x <= x;
7
end if;

Gruss,
Simon

von FPGAküchle (Gast)


Lesenswert?

Hallo Thomas,

die Reihenfolge der Zuweisungen in einem process ist klar definiert,
das Signal bekommt den Wert der letzten Zuweisung. Und das die bei
right. Die Zuweisungen sind somit von oben nach unten steigend
prioritisiert.

Ein saubere Schreibweise für dieses Verhalten ist:

if rigth = '1' then
      x<=x+1;
    elsif left= '1' then
      x<=x-1;
    end if;

Was Du willst (nix wenn beide gedrückt ist, oder beide nicht gedrückt)
schreibt man:

if left='1' then
  if right = '0'
      x<=x-1;
    end if;
elsif right='1' then
      x<=x+1;
    end if;

MfG
FPGAküchle

von Thomas Pfeifer (Gast)


Lesenswert?

Alles klar !
Danke für die schnellen Antworten.

Beste Grüße
Thomas

von Thomas Pototschnig (Gast)


Lesenswert?

Dürfen If-Statements nicht nur in Prozessen vorkommen?

von Ssss S. (sssssss)


Lesenswert?

Die Prozessdeklaration fehlt/wurde extra weggelassen ;)
Ist aber innerhalb eines Prozesses (oben der vga teil)

Gruss,
Simon

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.