Forum: FPGA, VHDL & Co. VHDL Probleme mit zugriff auf Array


von Une (Gast)


Lesenswert?

Hallo,

habe ein Problem mit dem Ansprechen von Arrays in VHDL kann mir jemand 
Helfen?


Deklaration des Arrays:
1
type S_array is array(15 downto 0) of std_logic_vector (3 downto 0);
2
    constant S1 : S_array := (x"2",x"5",x"1",x"9",x"E",x"A",x"C",x"8",x"6",x"4",x"7",x"F",x"D",x"B",x"0",x"3");
3
    constant S2 : S_array := (x"B", x"4", x"1", x"F", x"0", x"3", x"E", x"D", x"A", x"8", x"7", x"5", x"C", x"2", x"9", x"6" );
4
    constant S3 : S_array := (x"D", x"A", x"B", x"1", x"4", x"3", x"8", x"9", x"5", x"7", x"2", x"C", x"F", x"0", x"6", x"E" );
1
     variable l  : unsigned (3 downto 0);
2
     variable r : unsigned (3 downto 0);
3
4
5
    input1 := unsigned(din (31 downto 24));
6
    input2 := unsigned(din (23 downto 16));
7
    input3 := unsigned(din (15 downto 8));
8
    input4 := unsigned(din (7 downto 0));
9
10
    -- prozedut input1
11
    l := (input1 and x"0F") srl 4;
12
    r :=  input1 and x"F0";
13
    
14
    state := S1(l xor r);

als Fehlermedung kommt immer
ncvhdl_p: *E,INTYMM (./HDL/fox64Sigma4Datapath.vhdl,57|15): array index 
type mismatch [6.4].

Zeite 51 ist genau die Zeite wo aus dem Array was ausgelesen wird.

Danke Une

von Duke Scarring (Gast)


Lesenswert?

Une schrieb:
> state := S1(l xor r);

Der Feldindex muß integer sein, nicht unsigned:
1
 state := S1( to_integer( l xor r));

Duke

von Une (Gast)


Lesenswert?

Hallo Duke,

habe es versucht mit
1
 state := S1( to_integer( l xor r));

nun kommt aber folgende Fehler in der gleichen Zeile:
ncvhdl_p: *E,EXPTYP (./HDL/fox64Sigma4Datapath.vhdl,57|15): expecting an 
expression of type UNSIGNED 87[8.4] 93[8.5].

Une

von Duke Scarring (Gast)


Lesenswert?

Une schrieb:
> nun kommt aber folgende Fehler in der gleichen Zeile:
> ncvhdl_p: *E,EXPTYP (./HDL/fox64Sigma4Datapath.vhdl,57|15): expecting an
> expression of type UNSIGNED 87[8.4] 93[8.5].
Dann eben so:
1
    state := S1( to_integer( unsigned(l xor r)));

Duke

P.S.: Falls Du gerade erst mit VHDL anfängst und den Code auch noch 
synthetisieren willst, vergiss die Variablen für's erste...

von Une (Gast)


Lesenswert?

Habe das Problem gelöst ...

Danke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Une schrieb:
> Habe das Problem gelöst ...
Schön. Und wie?
Nur falls jemand mal die selbe Frage hat...

von Une (Gast)


Lesenswert?

habe nicht den std_logic_vector Datentype verwendet sondern unsigned.
1
type S_array is array(15 downto 0) of unsigned (3 downto 0);


Gruß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Was war der Grund, wrum keiner dein Problem sehen konnte. Die Definition 
von state wurde nicht gepostet. Offenbar hat ist state ein 
std_logic_vector... :-/
1
type S_array is array(15 downto 0) of std_logic_vector (3 downto 0);
2
    constant S1 : S_array := .....
3
:
4
    state := S1(...);

Dann hättest du also auch "einfach" so schreiben können:
1
state := std_logic_vector(S1(to_integer(unsigned(l xor r))));

Fazit: es ist in VHDL elementar wichtig, sich über die zu verwendenen 
Datentypen ausführlich Gedanken zu machen. Sonst artet das immer gleich 
in eine Konvertierungsorgie aus...

von Une (Gast)


Lesenswert?

Hallo Lothar,

Danke für den Tipp werde mir in Zukunft mehr Gedanken über die 
Datentypen machen.

Gruß

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.