www.mikrocontroller.net

Forum: FPGA, VHDL & Co. State Machine mit warte-state


Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte gerne mit einem parallelen Bus vom FPGA lesen können. Der 
Busmaster setzt seine Signale wie Chipselect und output-en auf '0' und 
wenn die Lesebedingung erfüllt ist, lege ich mit jeder Taktflanke Daten 
auf den Bus.

Nun habe ich das Problem, dass scheinbar bei jedem Lesezugriff, wo die 
Lesebedingung erfüllt ist, zwei Taktflanken enthalten sind, obwohl nur 
ein Wert gelesen wird. Der Master bekommt also nur jeden zweiten Wert 
mit.

Als Lösung habe ich mir eine Statemachine gebaut, die bei der ersten 
Flanke die Daten auf den Bus legen soll und dann in einen Warte-state 
springt und dort auf CS = '1' abfragt. Denn dann ist der Lesezugriff 
vorbei. Somit würde nur ein Wert gelesen und auch nur ein Wert auf den 
Bus gelegt.

Nun scheint das aber noch nicht so ganz zu funktionieren, es werden 
weiterhin zwei Werte auf den Bus gelegt, aber nur einer gelesen.

Habe ich alles richtig beschrieben?
  process (PClk)
  begin
    if rising_edge(PClk) then
      if reset = '0' then
        per_state <= LESEN;
      else
        case per_state is
          -- LESEN
          when LESEN =>
            if (PCS1 = '0' and POEn = '0' and PRnW = '1' and EMPTY_FIFO_A ='0' and EMPTY_FIFO_B ='0') then
              if PADD(22) ='0' then
                RD_EN_A <= '1';
                PDATA <= PDATA_A;
                per_state <= WARTE;
              else
                RD_EN_B <= '1';
                PDATA <= PDATA_B;
                per_state <= WARTE;
              end if;
            else
              RD_EN_A <= '0';
              RD_EN_B <= '0';
              PDATA <= (others => 'Z');
            end if;
          -- WARTE
          when WARTE =>
            if (PCS1 = '0' and POEn = '0' and PRnW = '1') then
              RD_EN_A <= '0';
              RD_EN_B <= '0';
              PDATA <= (others => 'Z');
              per_state <= LESEN;
            end if;
        end case;
      end if;
    end if;
  end process;

Wie ich es aktuell gemacht habe ist, dass bei der ersten Flanke die 
Daten auf den Bus gelegt werden (entweder aus Fifo A oder B) und bei der 
zweiten Flanke dann die daten HighZ gelegt werden. Aber bei der dritten 
Flanke würden dann wieder Daten auf den Bus gelegt werden. Wie kann ich 
beschreiben, dass nur die erste Flanke berücksichtigt wird und dann erst 
der LESEN state wieder angesprungen wird, wenn CS = '1' geht?

Vielen Dank!
Andi

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indem du im Zustand WARTE auch wirklich wartest. derzeit machst du 
eigentlich das selbe wie in LESEN...
          when WARTE =>
            RD_EN_A <= '0';
            RD_EN_B <= '0';
            PDATA <= (others => 'Z');
            if (PCS1 = '1') then -- deselektiert -> bereit für nächsten Lesezugriff
              per_state <= LESEN;
            end if;
Die anderen Signale POEn und PRnW solltest du dir in dem Zusammenhang 
auch mal anschauen: sind die beim Warten nötig?

Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mhm... klingt logisch... scheinbar zu logisch um selber darauf zu 
kommen.
Ich werde es gleich mal austesten.

Zum wiederholten Male... Vielen Vielen Dank Lothar!

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.