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


von vhtl (Gast)


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)


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)


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)


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:

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

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.