Index-Zugriff bei Vektor (m downto n)

Gast #4841322
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?
Gast #4841474
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).
Gast #4842354
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.
(Firma: Ingenieurbuero Gardiner) #4842425
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.
Gast #4848105
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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [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 einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.