www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Grundlegendes Problem oder nur Stilfrage?


Autor: Breti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe mir ein VHDL Modul für den OPB geschrieben, bei dem das Timing 
nicht 100%ig korrekt ist und somit Fehler verursacht. Ich habe den 
Fehler leider noch nicht gefunden. Ich habe häufig folgneden Schreibstil 
verwendet und frage mich, ob die Synthese (XST) damit evt. Probleme 
haben könnte oder ob das vom Stil her ok ist:


signal bla: std_logic;
signal state: irgendeine aufzählung von states

process (clk) is
begin
  if rising_edge(clk) then
    if reset='1' then
       bla <= '0';
    else
      bla <= '0';
      case state is
        when a =>
          state <= b;
        when b =>
          bla <= '1';
          state <= c;
        when c =>
          state <= a;
      end case;
    end if;
  end if;
end process;

Ich setzte bla also in jedem Takt auf '0' außer, wenn state = b gilt. 
Ich spare mir hir also das setzen von bla <= '0' in jedem einzelnen 
state, indem ich es an den anfang vor das case setze. Ich bin mir aber 
unsicher, ob das nicht ein Problem gibt, wenn das dann später im 
gleichen clock zyklus "überschrieben" bzw. doch auf '1' gesetzt wird 
sobald der state b erreicht wird. Was macht die Synthese daraus?

Ganz konkret ist mein Problem, dass das signal bla ein read-enable für 
einen fifo ist und manchmal offenbar ein wert zuviel aus der fifo 
gelesen wird.

Was sagt ihr dazu?

Gruß,
Thomas

Autor: Stefan Hanke (stefanhanke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Breti wrote:
> Ich setzte bla also in jedem Takt auf '0' außer, wenn state = b gilt.
> Ich spare mir hir also das setzen von bla <= '0' in jedem einzelnen
> state, indem ich es an den anfang vor das case setze. Ich bin mir aber
> unsicher, ob das nicht ein Problem gibt, wenn das dann später im
> gleichen clock zyklus "überschrieben" bzw. doch auf '1' gesetzt wird
> sobald der state b erreicht wird. Was macht die Synthese daraus?
Nein, das ist ok. Es gilt: die letzte Signalzuweisung gewinnt ;-)

 -- stefan

Autor: Joerg Wolfram (joergwolfram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das if wahr ergibt, dann wird der else-Zweig (oder auch ein elsif) 
nicht mehr abgearbeitet, also sollte es daran nicht liegen.

Jörg

Autor: Breti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg: In innersten IF-Zweig ist noch ein bla <= '0'. Dieses wird 
manchmal durch ein bla <= '1' in der CASE Anweisung ersetzt.

Autor: Spartanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grundsätzlich OK. Mache meine State-Machines eigentlich auf dieselbe Art 
mit der Defaultzuweisung vor dem case. Das machte bei mir bisher keine 
Probleme.

Ich vermisse aber in deiner SM ein "when others".
Außerdem wird in deinem Reset kein Reset-State definiert.. was aber 
eigentlich egal ist (irgendeiner wirds schon sein).
Probieren kannst du auch noch das Encoding der SM einzustellen bei den 
Optionen von XST.

Wenn das alles nicht hilft denke ich eher der Fehler kommt von dem 
Schaltungsteil, der die States definiert...und vermute stark dass 
asynchrone Signale dortreinspucken, die den State b öfters erzwingen als 
du willst.

Oder ist deine SM wirklich so wie du sie gepostet hast?? Dann wärs ja 
keine SM, sondern eigentlich ein Zähler!? (nach der Synthese)
Sinnvoll wäre also vielleicht eher dein richtiger Code.


Gruß


Autor: Breti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich hatte die Statemachine nur so grob skizziert, um die Frage zu 
erklären. Natürlich hat meine noch ein "when others" und ein reset-state 
gibt es auch.

Ich habe auch mittlerweile den Fehler gefunden: Die Fifo Statemachines 
sind ok. Was den Fehler macht ist die Statemachine, die die Daten vom 
Fifo liest und auf den ISA Bus schreibt. Aus irgendeinem Grund wird dort 
der Lesezyklus manchmal doppelt Mal durchlaufen. Eigentlich sollte das 
nicht sein, da die Statemachine nach jedem Zugriff so lange wartet, bis 
"/IOR" wieder auf logisch 1 ist. Passieren tuts aber trotzdem und ich 
weiß nicht wieso.

Gruß,
Thoams

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.