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


von Sebastian J. (Gast)


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

von Tom (Gast)


Lesenswert?

Hallo,

versuche es mal mit
1
when ohters => A <= 0;

Gruß
Tom

von Sebastian J. (Gast)


Lesenswert?

...ah, na klar. Betriebsblind :o)

DANKE!

von Sebastian J. (Gast)


Lesenswert?

...nee, zu voreilig, hatte ich schon so, war nur ein schreibfehler im
Forum ...

von Klaus F. (kfalser)


Lesenswert?

oder
"others" statt "ohters" ?

Klaus

von Sebastian J. (Gast)


Lesenswert?

...auch das ist ein tipfehler im forum

von Sebastian J. (Gast)


Angehängte Dateien:

Lesenswert?

ok, jetzt mit code ...

von alex (Gast)


Lesenswert?

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

von Sebastian J. (Gast)


Lesenswert?

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

von alex (Gast)


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?

von Klaus F. (kfalser)


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

von Sebastian J. (Gast)


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!

von Sebastian J. (Gast)


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 ...

von Klaus F. (kfalser)


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

von Sebastian J. (Gast)


Lesenswert?

...ja, wohl war. ich sollte meinen kopf wieder mal einschalten...

von Klaus F. (kfalser)


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

von Sebastian J. (Gast)


Lesenswert?

...werde ich mir zu herzen nehmen!

gruß sebastian

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
Noch kein Account? Hier anmelden.