www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Statemachine "überspringt" Zustand


Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin gerade etwas Ratlos...

Ich habe es jezt hinbekommen das ich mit dem FPGA Board per RS232 
Zeichen senden und Empfangen kann. Als nächstes wollte ich es so machen, 
das man vom PC aus 2 Zeichen sendet, der FPGA 
addiert/subtrahiert/multipliziert/... die dann und gibt das Ergebnis 
zurück.

Dazu habe ich zwei Zustände:
START => Der FPGA wartet auf den Empfang eines Zeichen gibt dieses auf 
die LEDs aus speichert das Zeichen in "OPCODE" und wechselt in den 
Zustand "DECODE".
DECODE =>
- OPCODE = 0x60 der FPGA sendet die Summe der zwei letzten Zeichen und 
wechselt zu START
- OPCODE = 0x10 der FPGA empfängt das nächste Zeichen und speichert es, 
das vorherige rutscht eine Postion nach unten (TOP1+TOP2), wechsel zu 
Start
- SONST: sende das Zeichen '-', Gehe zu Start

Das bilden der Summe funktioniert auch, ebenso das senden des Zeichens 
'-'

Nur das Empfangen des zusätzlichen Zeichens macht ärger, da ich in 
diesem Falle immer den OPCODE Anstelle des nächsten Zeichens empfange...

Hier erstmal der Code:
CPU: process(CLK_50M)
begin
    if rising_edge(CLK_50M) then
    -- Default: Weder lesen noch schreiben...
    rx_read  <= '0';
    tx_write <= '0';
    wr       <= '0';
    tx_data  <= (others => '-');
    -- End Default
    case state is
    when START =>
           if (rx_ready = '1') then
                rx_read <= '1';
                OPCODE  <= rx_data;
                LED     <= rx_data;
                state   <= DECODE;
            end if;
      when DECODE =>
          case OPCODE is
                when X"10" =>
                    if (rx_ready = '1') then
                        rx_read    <= '1';
                        data_in    <= X"000000" & rx_data;
                        wr         <= '1';
                        write_addr <= write_addr +1;
                        --SP         <= SP + 1;
                        LED        <= (others => '1');
                        state      <= START;
                    end if;
                when X"60" =>
                    if (tx_full = '0') then
                        tx_write <= '1';
                        tx_data  <= TOP1(7 downto 0) + TOP2(7 downto 0);
                        state    <= START;
                        LED      <= (others => '0');
                    end if;
                when others =>
                    if (tx_full = '0') then
                        tx_write <= '1';
                        tx_data  <= std_logic_vector(to_unsigned(character'pos('-'), 8));
                        state    <= START;
                    end if;
            end case;
        end case;
   end if;
Es sieht so aus, alsob er in dem Fall direkt nach DECODE springt (was er 
ja erst einen Takt später tun sollte), und dort gleich das "alte" 
Zeichen nochmal liest.

Ich sende also:
- 0x10 --> Alle LEDs gehen an
- 0xAA --> Jede Zweite LED geht an und der FPGA quitiert mit -

Was ich erwarten würde:
- 0x10 --> 1 Led an
- 0xAA --> Alle Leds an

Als RS232 Transiver nutze ich die Macros vom KCPSM3/PicoBlaze, und laut 
Anleitung sollte sobald das read signal einmal 1 gewesen ist das neue 
Datenpaket am Ausgang anliegen (oder halt signalisiert werden das der 
Puffer leer ist).

Vieleicht sieht ja jemand meinen Fehler, ich steh gerade etwas auf dem 
Schlauch :(

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab jezt versucht das auslesen des Parameters mal in den "START" Zustand 
zu verlegen...
case state is
when START =>
       if (rx_ready = '1') then
            rx_read <= '1';
            if (OPCODE = X"10") then
                data_in    <= X"000000" & rx_data;
                wr         <= '1';
                write_addr <= write_addr +1;
                LED        <= (others => '1');
                OPCODE     <= rx_data;
            else
                OPCODE  <= rx_data;
                LED     <= rx_data;
                state   <= DECODE;
            end if;
        end if;
  when DECODE =>
      case OPCODE is
            when X"10" =>
                    state      <= START;
Meine Überlegung war, das falls ich doppelte Zeichen Empfange er solange 
diese überspringt bis er ein anderes Zeichen Empfängt... Verhalten ist 
aber das selbe wie vorher, so langsam versteh ich garnix mehr...

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, lag nicht an meiner Statemachine... Anscheind wird bei dem RX 
Macro erst zwei Takte nach dem lesen der Zustand des "daten vorhanden" 
Flag erneuert... auf jedenfall ne böse Falle, hab jezt einfach nen 
zusätzlichen Wartezustand eingefügt nun gehts grrr

Autor: Abc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst immer posten, dann überlegen und debuggen. Oder doch lieber 
umgekehrt ?  ;O)

Autor: Lymangood (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War bestimmt nur ein FlipFlop kaputt.

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.