www.mikrocontroller.net

Forum: FPGA, VHDL & Co. case / when others


Autor: Sebastian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich versuche es erstmal ohne angehängten code.

Kann sich jemand vorstellen oder weiß jemand von euch, warum der Befehl
<< when ohters => A = 0; >> innerhalb einer case anweisung nicht
synthetisiert wird(A ist die zustandsvariable/integer)? diesen fall
habe ich gerade und kann mir nicht erklären, warum das so ist bzw.
finde den fehler nicht. habe ich vorher auch noch nie gehabt obwohl ich
diese anweisung nicht zum ersten  mal verwende ???
gruß sebastian

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

versuche es mal mit

when ohters => A <= 0;


Gruß
Tom

Autor: Sebastian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ah, na klar. Betriebsblind :o)

DANKE!

Autor: Sebastian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...nee, zu voreilig, hatte ich schon so, war nur ein schreibfehler im
Forum ...

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder
"others" statt "ohters" ?

Klaus

Autor: Sebastian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...auch das ist ein tipfehler im forum

Autor: Sebastian J. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ok, jetzt mit code ...

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und so:
when others => A <= (others => '0');

Autor: Sebastian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...nein, mein synthesewerkzeug streikt weiter. der befehl funktoniert
nicht in verbindung mit einem integersignal.

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..dann liegt es wahrscheinlich daran, dass A von 0 bis 12 deklariert ist
und alle Fälle mit "case n" (n von 0 bis 12) untersucht werden und in
solchem Fall kein "when others" benötigt wird...
Welche Fehlermeldung erzeugt denn das Synthesewerkzeug?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast dem Compiler gesagt, daß die Variable A von 0 bis 12 geht.
Im Case Statement sind damit alle Fälle abgedeckt, für die others
clause bleibt nichts mehr übrig.
Du hattest wahrscheinlich eine fail-safe Konstruktion im Sinn um die
übrigen 3 Zustände abzudecken, wenn man A mit 4 Bit darstellt.

Dazu mußt Du entweder :
- A von 0 bis 15 laufen lassen
- Als State Variable einen 4 Bit Std_logic_vector verwenden.
- oder den Compiler anweisen, einen Fail-Safe Konstruktion einzubauen.
Das geht (glaube ich) mit Hilfe der Synthese-Optionen.

An deinem Code ist mir auch noch aufgefallen, daß Du den Takt vorteilst
und den Ausgang des Teilers als Takt für deine State-Machine verwendest.
Das soll man aus mehreren Gründen nicht machen.
Innerhalb deines FPGA's oder CPLD's gibt es eigene Leitungen für den
Takt, welche dann nicht verwendet werden.
Viel besser ist es, nur den Takt clock zu werwenden.
Ein Vorteiler liefert dann nur einen Puls "clk" alle 65563 Takte, und
um die Case A anweisung gibst Du noch ein
if (clk = '0') then
   case A
....
end if.

Damit das Case statement nur alle 65563 Zyklen aktiv.

Grüße
Klaus

Autor: Sebastian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...es sagt: Case OTHERS is not synthesized.

@all: kann mal bitte jeman das kleine Programm bei sich testen und
schauen, ob alle Ausgänge der Reihe nach angesprochen werden, kurz um,
ob alle Zustände korrekt ablaufen. Ich habe irgend ein Problem nach nem
Softwareupdate und versuche grad einzugrenze bzw. heraus zu finden, was
im Code noch falsch sein könnte ...

Das wäre großartig. Vielen Dank!

Autor: Sebastian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Klaus: Danke für die Hinweise. Allerdings brauche ich die Signale so
langsam, damit ich bei der Inbetriebnahme der gesamten Platine wirklich
jeden verwendeten Ausgang vernünftig testen kann, nacheinander
anspreche.
Ok, ich kann natürlich auch einfach alle Ausgänge gleichzeitig
schalten, es muss ja nicht nacheinander sein ... naja, warum einfach
wenns auch kompliziert geht ...

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du das Signal A mit jeder aufsteigenden Flanke von clock auf 0 und Du
setzt A mit jeder aufsteigenden Flanke von clk auf einen neuen Wert.
Erstens gibts keine Hardware, (jedenfalls nicht in den erhältlichen
FPGA's) bei der man ein Signal mit 2 verschiedenen Flanken setzen kann
und zweitens bleibt A immer 0, weil clock viel öfter kommt.

Klaus

Autor: Sebastian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ja, wohl war. ich sollte meinen kopf wieder mal einschalten...

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der andere Ratschlag von mir bzg. der Taktsignale hat nichts mit langsam
oder schnell zu tun.
Einen niederen Takt aus einem höheren so zu erzeugen wie Du es gemacht
hast, ist immer ungünstig.
- Werden die speziellen Leitungen im Chip für die Taktverteilung nicht
verwendet, dann können die Tools meist nicht das korrekte Timing
garantieren.
- Der niedere Takt (clk) ist zum höheren Takt verzögert, weil er am
Ausgang eines Flip-Flop auftritt. Die Schaltungsteile, welche mit
deinem langsamen Takt laufen, sind ebenfalls verzögert. Wenn Du nun
Signale hast, welche zwischen den beiden Clock-Domains hin- und
hergehen, dann müssten diese Verzögerungen in der Berechung der Setup-
und Hold-Zeiten berücksichtigt werden. Die Tools machen das meist aber
nicht.
Außerdem hängen die Verzögerungen von Bausteingröße und -Typ ab, sodaß
ein eventuell funktionierendes Design nur deshalb nicht mehr
funktioniert, weil der Hersteller des FPGA's etwas Gutes tun wollte
und den Baustein schneller gemacht hat.

Tu Dir also einen Gefallen und lerne rechtzeitig, wie man
Schaltungsteile mittels eines Enable-Signals (wie oben beschrieben)
langsamer laufen läßt.

Grüße
Klaus

Autor: Sebastian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...werde ich mir zu herzen nehmen!

gruß sebastian

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.