Index-Zugriff bei Vektor (m downto n)

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren