VHDL - unerwartetes Verhalten

Gast #298093
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 ?
#298094
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
#298095
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
Gast #298096
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.