www.mikrocontroller.net

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


Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

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

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: D. I. (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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-Mehrdi...

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
if befehl = x"D" then
for g in 0 to 7 loop
    for j in 0 to 5 loop --to_integer(unsigned(n-1)) loop
        if screen(to_integer(unsigned(x)))(to_integer(unsigned(y))+j) = '0'  then
            screen(to_integer(unsigned(x)))(to_integer(unsigned(y))+j) <= game(to_integer(unsigned(I))+g);
        else
            screen(to_integer(unsigned(x)))(to_integer(unsigned(y))+j) <= not game(to_integer(unsigned(I))+g);
            register8(15) <= "00000001";
       end if;
    end loop;
end loop;
end if;

screen hat folgenden Datentypen:
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

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
variable x : std_logic_vector(3 downto 0) := (others => '0');
variable y : std_logic_vector(3 downto 0) := (others => '0');

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.