mikrocontroller.net

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


Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht 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:
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:
   function xyz
   (
      ...
      bitmask   : std_logic_vector;
      ...
   )  return ...
      ...
      constant BITMASK_LENGTH  : integer := bitmask'length; 
      variable bitmask_pos    : integer;
      ...
   begin
      ...
      for i in BITMASK_LENGTH - 1 downto 0 loop
         if bitmask(i) = '1' then
            bitmask_pos := i;
         end if;
      end loop;
      ...
   end xyz;

Die Funktion liefert in Abhängigkeit der Art des Aufrufes 
unterschiedliche Ergebnisse.
-- Aufrufvariante 1:
xyz_result <= xyz(... , "0000111", ...);

-- Aufrufvariante 2:
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?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.