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 ?
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
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
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
Alles klar ! Danke für die schnellen Antworten. Beste Grüße Thomas
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.