Bei mir tritt im Zusammenhang mit einem Funktionsaufrufe und der
Übergabe einer Konstanten als std_logic_vector ein Problem auf.
Innerhalb der Funktion will ich im std_logic_vector die erste
(niederwertigste) Position ermitteln, an der eine '1' steht.
Beispiel:
1 | constant bitmask_7_bit : std_logic_vector (6 downto 0) := "0000111";
|
Hier wäre die Position somit 0.
Dazu mal ein Auszug aus der Funktion:
1 | function xyz
|
2 | (
|
3 | ...
|
4 | bitmask : std_logic_vector;
|
5 | ...
|
6 | ) return ...
|
7 | ...
|
8 | constant BITMASK_LENGTH : integer := bitmask'length;
|
9 | variable bitmask_pos : integer;
|
10 | ...
|
11 | begin
|
12 | ...
|
13 | for i in BITMASK_LENGTH - 1 downto 0 loop
|
14 | if bitmask(i) = '1' then
|
15 | bitmask_pos := i;
|
16 | end if;
|
17 | end loop;
|
18 | ...
|
19 | end xyz;
|
Die Funktion liefert in Abhängigkeit der Art des Aufrufes
unterschiedliche Ergebnisse.
1 | -- Aufrufvariante 1:
|
2 | xyz_result <= xyz(... , "0000111", ...);
|
3 |
|
4 | -- Aufrufvariante 2:
|
5 | xyz_result <= xyz(... , bitmask_7_bit, ...);
|
In der ersten Variante ermittelt die Funktion nach Schleifenaustritt für
bitmask_pos die 4 bei der zweiten Variante die 0. Hier wird einfach die
Reihenfolge unterschiedlich interpretiert. Einmal ist bitmask(6) eine
'1' beim anderen mal eine '0'.
Interessant ist zudem, dass Modelsim, wenn man beim durchsteppen mit der
Maus auf bitmask zeigt, beide male 0000111 anzeigt und nicht das eine
mal 1110000.
Wie kann ich denn dieses Problem umgehen?