Forum: FPGA, VHDL & Co. Fehler bei dem Index eines 2dimensionalen Arrays


von sensor (Gast)


Lesenswert?

Immer wenn ich den unten stehenden Code synthetisieren möchte, bekomme 
ich die Warnung "Index value(s) does not match array range, simulation 
mismatch.". Was mache ich falsch?

1
if befehl = x"D" then
2
for g in 0 to 7 loop
3
  for j in 0 to 5 loop --to_integer(unsigned(n-1)) loop
4
  (to_integer(unsigned(y))+j) = '0' then
5
      screen(to_integer(unsigned(x)))(to_integer(unsigned(y))+j) <= game(to_integer(unsigned(I))+g);
6
  
7
      screen(to_integer(unsigned(x)))(to_integer(unsigned(y))+j) <= not game(to_integer(unsigned(I))+g);
8
       register8(15) <= "00000001";
9
    end if;
10
  end loop;
11
end loop;
12
end if;

von sensor (Gast)


Lesenswert?

Noch eine kleine Anmerkung.. In der Reihe mit 
"(to_integer(unsigned(y))+j) = '0' then" habe ich beim Kopieren wohl ein 
"if" vergessen, welches eigentlich dabei stand. Außerdem ist eine Reihe 
darunter das "else" verschwunden. Keine Ahnung wie es verschwinden 
konnte...

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


Lesenswert?

sensor schrieb:
> Was mache ich falsch?
Du postest nicht die Typen des Arrays und nicht von x und nicht von y...

> wenn ich den unten stehenden Code synthetisieren möchte, bekomme
> ich die Warnung "Index value(s) does not match array range, simulation
> mismatch."
Das bedeutet, dass die Synthese meint, die Hardware könnte u.U. nicht 
zur Simulation passen. Das passiert gern mal, wenn uneingeschränkte 
Integer verwendet werden...

> In der Reihe mit "(to_integer(unsigned(y))+j) = '0' then" habe
> ich beim Kopieren wohl ein "if" vergessen
Mich wundert sowieso, warum du einen Integer mit '0' vergleichen 
willst...

von D. I. (Gast)


Lesenswert?

Zweidimenstionale Array indiziert man doch nicht mit ()() sondern mit
( , ) afair

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


Lesenswert?

D. I. schrieb:
> Zweidimenstionale Array indiziert man doch nicht mit ()() sondern mit
> ( , ) afair
Es sind abhängig von der Typdefinition des Arrays beide Schreibweisen 
möglich:
http://www.lothar-miller.de/s9y/archives/39-Mehrdimensionale-Arrays.html

von sensor (Gast)


Lesenswert?

Hallo,

vielen Dank für eure Antworten. Es tut mir sehr leid, dass der Code 
trotz Ergänzungen immer noch nicht vollständig war. Da ich den Code so 
übersichtlich wie möglich posten wollte, habe ich eine Reihe von 
Informationen weggelassen, wodurch diverse notwendige Dinge gefehlt 
haben. Außerdem habe ich vergessen, die Typen anzugeben. Auch dafür 
entschuldige ich mich.
1
if befehl = x"D" then
2
for g in 0 to 7 loop
3
    for j in 0 to 5 loop --to_integer(unsigned(n-1)) loop
4
        if screen(to_integer(unsigned(x)))(to_integer(unsigned(y))+j) = '0'  then
5
            screen(to_integer(unsigned(x)))(to_integer(unsigned(y))+j) <= game(to_integer(unsigned(I))+g);
6
        else
7
            screen(to_integer(unsigned(x)))(to_integer(unsigned(y))+j) <= not game(to_integer(unsigned(I))+g);
8
            register8(15) <= "00000001";
9
       end if;
10
    end loop;
11
end loop;
12
end if;

screen hat folgenden Datentypen:
1
type screens is array (natural range 63 downto 0) of std_logic_vector (natural range 31 downto 0);

"x" und "y" sind vom Typ std_logic_vector.

Es tut mir wirklich leid, dass ihr mir auf Grundlage meines Fehlers 
versucht habt mir zu helfen.

Liebe Grüße

von sensor (Gast)


Lesenswert?

>Das bedeutet, dass die Synthese meint, die Hardware könnte u.U. nicht
>zur Simulation passen. Das passiert gern mal, wenn uneingeschränkte
>Integer verwendet werden..

Darüber habe ich mir auch schon Gedanken gemacht, aber eine Übertragung 
in eine Variable der "normalen" Typen sollte dieses Problem ja nicht 
beheben, da es nichts an der "Übergröße" ändern würde. Ich werde, sobald 
ich wieder Zeit habe, die Werte mal in Variablen eines Subtypes von 
Integer übertragen und schauen ob die Warnung verschwindet.

Vielen Dank nochmal.

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


Lesenswert?

sensor schrieb:
> "x" und "y" sind vom Typ std_logic_vector.
Wie breit jeweils?

von sensor (Gast)


Lesenswert?

2-byte, also es ist theoretisch größer als der Index, jedoch werden die 
Variablen nur mit den passenden Größen verwendet, wie man auch an der 
Simulation sehen kann.

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


Lesenswert?

sensor schrieb:
> 2-byte, also es ist theoretisch größer als der Index,
Und da sagt die Synthese (die die Vektoren intern auf die nötige Breite 
begrenzt, und ja nicht weiß, ob da in der Simulation mal z.B. x=11 oder 
y=99 werden kann) dass evtl. die Simulation nicht stimmt.

> jedoch werden die Variablen nur mit den passenden Größen verwendet
Es sind Signale... ;-)

von sensor (Gast)


Lesenswert?

Vielen Dank für die Erklärung. Leider befürchte ich, dass wegen den 
Warnungen die Synthese so langsam ist. Lasse ich den Teil aus, ist sie 
um ein vielfaches schneller.

> Es sind Signale... ;-)

In meinem Fall sind "x" und "y" Variablen.
1
variable x : std_logic_vector(3 downto 0) := (others => '0');
2
variable y : std_logic_vector(3 downto 0) := (others => '0');

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


Lesenswert?

sensor schrieb:
>> Es sind Signale... ;-)
> In meinem Fall sind "x" und "y" Variablen. ...
So kommen wir langsam aber sicher zum Code...

> variable x : std_logic_vector(3 downto 0) := (others => '0');
> variable y : std_logic_vector(3 downto 0) := (others => '0');
Warum machst du daraus nicht einfach einen eingeschränkten Integer. Das 
würde auch den Arrayzugriff besser lesbar machen...

von sensor (Gast)


Lesenswert?

Vielen Dank nochmal. Ja, ich werde es so machen, wie du mir 
vorgeschlagen hast. Die "x" und "y" braucht man auch noch andersweitig 
mit größeren Werten, weswegen ich es bis jetzt nicht gemacht habe.

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.