www.mikrocontroller.net

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


Autor: Thomas Pfeifer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Rainer Spitzhirn (rainersp)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht 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:
if (left = '1' AND right = '0') then
  x <= x-1;
elsif (left = '0' AND right = '1') then
  x <= x+1;
else
  x <= x;
end if;

Gruss,
Simon

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Pfeifer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar !
Danke für die schnellen Antworten.

Beste Grüße
Thomas

Autor: Thomas Pototschnig (Gast)
Datum:

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

Autor: Ssss Ssssss (sssssss)
Datum:

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

Gruss,
Simon

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.