Forum: FPGA, VHDL & Co. Case Statement: Müssen in allen Cases alle Zuweisungen drin stehen?


von noips (Gast)


Lesenswert?

Hallo,

ich meine irgendwo gelesen zu haben, dass in einem Case-Statement in 
allen Cases jedes Signal, welches in diesem Statement vorkommt, eine 
Zuweisung haben muss. Mit anderen Worten, wenn ich in einer 
"when-Abfrage" einem bestimmten Signal etwas zuweise, so muss ich in 
allen übrigen "when-Abfragen" diesem Signal auch etwas zuweisen, auch 
wenn sich dieses Signal bei den übrigen Bedingungen nicht ändern soll. 
Stimmt das? (hoffe, ich habe es verständlich erklärt)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Zeig mal ein Beispiel. Interessant ist dabei: hast du das case in einem 
synchronen/getakteten oder einen kombinatorischen Prozess?

Denn wenn du in einm case etwas zuweist, und in eineme anderen nicht, 
dann muß das entsprechende signal speichern können. In einem 
getakteten Prozess wird das ein unkritisches Flipflop. In einem 
kombinatorischen Prozess wird in einem zwielichtigen Latch gespeichert.

von noips (Gast)


Lesenswert?

Lothar Miller schrieb:
> In einem
> kombinatorischen Prozess wird in einem zwielichtigen Latch gespeichert.

Gerade das war mein Problem. Ich hatte das in einem kombinatorischen 
Prozess. Meine FSM ist hängen geblieben. Ich habe Warnungen von Lattice 
Diamond näher angeschaut und fand, dass Latches generiert werden. Nun 
habe ich die Zuweisungen ergänzt und alles läuft wie geschmiert.

Ich bedanke mich!

von Georg A. (georga)


Lesenswert?

> habe ich die Zuweisungen ergänzt

Was danach klingt, als hättest du jetzt jeden when-Fall einzeln 
versorgt. Die Latches vermeidet man viel konsequenter, wenn man als 
erstes im Prozess allen Signalen einen "Defaultwert" zuweist. Ein 
späteres if/case kann das problemlos überschreiben und man kann nicht 
einzelne Fälle vergessen.

von noips (Gast)


Lesenswert?

Georg A. schrieb:
> wenn man als
> erstes im Prozess allen Signalen einen "Defaultwert" zuweist.

Meinstu du so:
1
process (C) begin
2
    A <= '0'; -- Default Value
3
    B <= '0'; -- Default Value
4
    case C is
5
        when '0' => A <= '1';
6
        when '1' => B <= '1';
7
    end case;
8
end process;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ja. Denn es gilt:
In einem Prozess "gewinnt" die letzte Zuweisung an ein Signal.
Und wenn nach der Defaultzuweisung nichts mahr kommt, dann ist das 
Signal trotzdem definiert, und muß kein Speicherverhalten aufweisen.

von Stellensucher (Gast)


Lesenswert?

Ich danke euch!

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.