Forum: FPGA, VHDL & Co. Nebenläufige bedingte Mehrfachzuweisungen an ein Signal - fehlende Warning?


von Ralf (Gast)


Lesenswert?

Ich verwende nachfolgenden Code innerhalb eines getakteten Prozesses:
1
      if (unsigned(g2_count) < 1252) then
2
         g2_count <= std_logic_vector (unsigned (g2_count) + 17);
3
      else
4
         g2_count <= std_logic_vector (unsigned (g2_count) + 23 - 1252);
5
         g2_offset <= off_count;
6
         off_count <= std_logic_vector (unsigned (off_count) + 7);
7
      end if;
8
      
9
      if (unsigned(ng3_count) < 1153) then
10
         g3_count <= std_logic_vector (unsigned (ng3_count) + 19);
11
      else
12
         g3_count <= std_logic_vector (unsigned (ng3_count) + 19 - 1153);
13
         off_count <= std_logic_vector (unsigned (off_count) + 7);
14
         g3_offset <= off_count;
15
      end if;

Die Zähler g1-g4 sollen bei ihrem jeweiligen MAX-Wert überlaufen, den 
Rest mit in die neue Periode nehmen, was auch funktioniert. Die 
Primzahlen als Inkrement sorgen dafür, dass beide Zähler alle denkbaren 
Werte annehmen.

Mir kommt es auf die zuweisung des off_count an. Jedesmal, wenn er 
benutzt wird, wird ein neuer Wert zugewiesen, damit der offset ändert. 
Dies würde man sauber mit einem enable lösen und getrennt realiseren - 
es geht aber auch so. Der Punkt ist nun der, dass theoretisch beide 
Bedinugngen greifen können, der Counter also scheinbar! redundant 
inkremetiert wird, was er nicht soll und wohl auch nicht wird. Was aber 
wäre nun, wenn ich im zweiten Ast eine + 9 eintrage? Dann wären die 
Bedingungen widersprüchlich. Müsste dann der Compiler nicht meckern? 
ModelSIM sagt nichts dazu.

Oder darf ich das interpretieren, dass hier einfach ein default-Effekt 
greift und damit die erste Anweisung gilt solange die andere nicht 
greift und diese überschreibt?

Nur der Vollständigkeit halber: Dass im "Kollisionsfall" beide Zähler 
denselben Offset abbekommen, ist nicht von Bedeutung und akzeptabel.

von berndl (Gast)


Lesenswert?

Ralf schrieb:
> innerhalb eines getakteten Prozesses

das ist dann keine nebenlaeufige (concurrent) Zuweisung im Prozess, 
sondern eine sequentielle. Es gilt die letzte Zuweisung, dein off_count 
wird also entweder gar nicht oder um 7 inkrementiert. Den neuen 
off_count hast du dann im naechsten Zyklus

von Duke Scarring (Gast)


Lesenswert?

Ralf schrieb:
> g2_count <= std_logic_vector (unsigned (g2_count) + 17);
Warum definierst Du g2_count nicht gleich als unsigned?
Damit wäre der Code lesbarer.

Ralf schrieb:
> Dann wären die
> Bedingungen widersprüchlich.
Nein. Die letzte Zuweisung (im Prozess) gewinnt.

Duke

von Klaus F. (kfalser)


Lesenswert?

Ralf schrieb:
> Was aber
> wäre nun, wenn ich im zweiten Ast eine + 9 eintrage? Dann wären die
> Bedingungen widersprüchlich. Müsste dann der Compiler nicht meckern?
> ModelSIM sagt nichts dazu.

Die letzte Zuweisung gilt.
Da ist nichts widersprüchlich, so funktioniert VHDL.
Innerhalb eines Prozesses werden die Zuweisungen sequenziell ausgeführt.
Erst wenn der Prozess stoppt (bei einem Wait, oder am Ende der 
Zuweisungsliste) wird der zuletzt geschriebene Wert effektiv an alle 
Signale zugewiesen.

Die Anweisungen
1
a <= '1';
2
a <= '0';
3
if b = '1' then 
4
   a <= '1';
5
end if;

ist somit komplett in Ordnung.
Die erste Zuweisung an a ist nutzlos, weil a sofort wieder überschrieben 
wird.
Die zweite Zuweisung an a bleibt aber erhalten, außer sie wird von der 
3. Zuweisung überschrieben.
Damit wird a z.B. ein Default-Wert zugewiesen, der nur in manchen Fällen 
korrigiert wird.

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


Lesenswert?

Duke Scarring schrieb:
> Warum definierst Du g2_count nicht gleich als unsigned?
Oder gleich als eingeschränkten Integer...

von Ralf (Gast)


Lesenswert?

signed oder INT sind die Gx-Vektoren deshalb nicht, weil aus denen BITs 
extrahier werden und sie auch so zusammengesetzt werden. Ansonsten wäre 
es einfacher, gleich Zähler zu nehmen, das ist richtig.

Wenn die "letzte Anweisung gewinnt", wird das dann als verschachteltes 
IF gebaut?

von berndl (Gast)


Lesenswert?

Ralf schrieb:
> Wenn die "letzte Anweisung gewinnt", wird das dann als verschachteltes
> IF gebaut?

Deine HW wird so gebaut, dass sie genau das sequentielle Verhalten 
deiner Beschreibung abbildet. D.h. es werden Multiplexer und 
Prioritaetsdecoder eingebaut. Verhalten muss es sich so, wie du's 
hinschreibst...

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.