Forum: FPGA, VHDL & Co. Problem bei Funktionsaufruf mit std_logic_vector


von Matthias G. (mgottke)


Lesenswert?

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?

von Duke Scarring (Gast)


Lesenswert?

Eventuell so:
[vhdl]
  for i in bitmask'range loop

-- statt so
--for i in BITMASK_LENGTH - 1 downto 0 loop
[vhdl]

Bei "0000111" ist möglicherweise die Reihenfolge andersrum :-?

Duke

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


Lesenswert?

Wenn ein Bitvektor nicht constrained ist, dann ist dessen Bitreihenfolge
(0 to ...). Und wenn du dann deinen Vektor darüber gibst, ist das Bit 0 
auf einmal das höchstwertige.

Das hatten wir schonmal im 
Beitrag "Ein kleines Problem mit VHDL"

von Matthias G. (mgottke)


Lesenswert?

Danke für die Tips, ich hatte jetzt zwei Lösungsansätze die sicherlich 
beide gehen. Aber ich habe nur die 2. genommen.
1. Ansatz: mit bitmask'ascending feststellen ob steigender oder 
fallender Index vorliegt und dann die Schleife entweder mit
   for i in bitmask'range loop
oder mit
   for i in bitmask'reverse_range loop
laufen lassen.
2. Ansatz: Eine zusätzliche Variable definieren
   variable v_bitmask : std_logic_vector(bitmask'length-1 downto 0);
dann
   v_bitmask := bitmask;
Bei v_bitmask ist ja der Index immer fallend dann geht auch die Schleife
   for i in v_bitmask'length - 1 downto 0 loop
oder alternativ auch so:
   for i in v_bitmask'range loop

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.