Forum: FPGA, VHDL & Co. Index-Zugriff bei Vektor (m downto n)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von vhtl (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in meinem Code möchte ich dies hier machen (Konvertierung und Casting 
der übersichtlichkeit halber weggelassen):
1
signal a : std_logic_vector(15 downto 7);
2
signal i : std_logic_vector(3 downto 0);  // aber Wert >= 7 gilt immer
3
...
4
a <= IN;  -- 9 Bit Eingang
5
...
6
s <= a(i);

Dazu liefert mir Xilinx (wohl zu recht)
1
WARNING:Xst:790 - Index value(s) does not match array range, simulation mismatch.

Aber wird das auch falsch synthetisiert? Wenn nichts, was würde ein "out 
of bounds" hier bewirken?

Und welche Alternativen gibt es? Mir fällt
1
signal a : std_logic_vector(15 downto 0);
2
signal i : std_logic_vector(3 downto 0);  // aber Wert >= 7
3
a <= IN & "0000000";
4
s <= a(i);

ein, aber dann sind a(6 downto 0) konstant und werden herausoptimiert. 
Stimmt das Syntheseergebnis dann überhaupt noch?

Oder ich schreibe
1
signal a : std_logic_vector(8 downto 0);
2
signal i : std_logic_vector(3 downto 0);  // aber Wert >= 7
3
a <= IN;
4
s <= a(i - 7);

aber die Subtraktion kostet vielleicht zuviele Resourcen?

Was ist die optimale Lösung für dieses Problem?

von Sym (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nach 3x lesen habe ich verstanden, was du möchtest: Nämlich ein Bit aus 
dem Vektor a zurückgeben.
Das machst du am besten mit einer for-Schleife. Also:
1
s <= '0';
2
for k in 0 to a'length-1 loop
3
  if k = integer(unsigned(i)) then
4
    s <= a(k+a'low);
5
  end if;
6
end loop;

Wie du den Iterator wählst, bleibt dir überlassen (ob mit a'low to 
a'high, oder 0 to a'length-1).

von vhtl (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank! An Schleifen habe ich mich nicht gewagt, da mir das 
Syntheseergebnis völlig unklar ist. Aber ich schaue mir das Ergebnis des 
Vorschlags mal genau an.

von Charles G. (Firma: Ingenieurbuero Gardiner) (cfgardiner)


Bewertung
0 lesenswert
nicht lesenswert
Ohne es auf die schnelle durch den compiler gejagt zu haben, so etwas 
ähnliches dürfte auch gehen:

Library IEEE;
Use IEEE.numeric_std.all;

Architecture ....
signal a : std_logic_vector(15 downto 7);
signal i : std_logic_vector(3 downto 0);  // aber Wert >= 7 gilt immer
...

a <= IN;  -- 9 Bit Eingang
...
process (a, i)
   variable v_sel : natural;
begin
   v_sel    := to_integer(unsigned(i));
   if (v_sel > 7) then
      s  <= a(v_sel);
   else
      s  <= a(7);
   end if;
end process;


Synthesetechnisch dürften zwei Muxen herauskommen eine 2-1 sowie ein 8-1 
in Kaskade.

von Duke Scarring (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sym schrieb:
> Das machst du am besten mit einer for-Schleife
Man kann es sich auch kompliziert machen, oder?
Warum nimmst Du nicht gleich i als Index für das Bit?

Bei mir funktioniert das:
1
    signal sel_int : integer range 7 to 15;
2
3
...
4
5
    sel_int <= to_integer( unsigned( sel));
6
    output  <= input( sel_int);

Damit läuft auch die Simulation erwartungsgemäß:
1
# Loading std.standard
2
# Loading std.textio(body)
3
# Loading ieee.std_logic_1164(body)
4
# Loading ieee.numeric_std(body)
5
# Loading work.index_tb(testbench)#1
6
# ** Note: index: 7-->'1'
7
# ** Note: index: 8-->'0'
8
# ** Note: index: 9-->'0'
9
# ** Note: index: 10-->'1'
10
# ** Note: index: 11-->'1'
11
# ** Note: index: 12-->'0'
12
# ** Note: index: 13-->'0'
13
# ** Note: index: 14-->'1'
14
# ** Note: index: 15-->'1'

Vollständiger Code (inkl. Testbench) im Anhang...

Duke

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]
  • [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.