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.