Nebenläufige bedingte Mehrfachzuweisungen an ein Signal - fehlende Warning?

Gast #3644961
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.
Gast #3644986
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
#3644990
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.
Gast #3645236
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?
Gast #3645415
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren