Array in Matrix einlesen

OP #2020312
Hallo,
ich habe das Problem, dass ich ein bestehendes Array in eine Matrix 
einlesen möchte. Das Array und die Matrix habe ich mit 2 eigenen Typen 
erstellt. Ich hatte die Idee, dass ich die Werte einzeln aus dem Array 
in einer Speichervariablen zwischenspeicher und dann in die Matrix 
koppiere. Dies wollte ich mit zwei for-Schleifen realisieren.

  type matr is array(0 to 2, 0 to 2) of unsigned(15 downto 0);
  type arr is array (0 to 2) of unsigned (15 downto 0);

  variable matrix : matr;
  variable speicher : integer;
  variable j : unsigned(11 downto 0);
  variable k : unsigned(11 downto 0);
  variable arry : arr;

    begin
      for j in 0 to 2 loop
        for k in 0 to 2 loop
          speicher := arry(k);
          matrix(j)(k) := (speicher);
        end loop;
      end loop;

Fehlermeldungen:
** Error: D:/Arbeit/Projekt Interferometer/Projekt 
Interferometer/Versuche/Versuch.vhd(32): Target type 
std.standard.integer in variable assignment is different from expression 
type ieee.numeric_std.unsigned.
** Error: D:/Arbeit/Projekt Interferometer/Projekt 
Interferometer/Versuche/Versuch.vhd(33): Target type 
ieee.std_logic_1164.std_ulogic in variable assignment is different from 
expression type std.standard.integer.
** Error: D:/Arbeit/Projekt Interferometer/Projekt 
Interferometer/Versuche/Versuch.vhd(33): Too few indexes (1) for indexed 
name prefix type matr (dimensionality 2).
** Error: D:/Arbeit/Projekt Interferometer/Projekt 
Interferometer/Versuche/Versuch.vhd(37): VHDL Compiler exiting

Die Programmierung ist wahrshcinelich ziemlich Stümperhaft, aber ich bin 
neu in VHDL...
Kann man das so machen und wenn ja wo liegt dann mein Fehler, oder muss 
ich das anders realisieren?!?
Außerdem ist das nur der Anfang. Eigenltich habe ich 3 Arrays, die ich 
in eine Matrix koppieren muss. Deshalb auch (0 to 2).
Viele Grüße und danke shcon mal für etwaige Hilfe,
Jato
Moderator (Firma: Titel) Persönliche Seite
Har Ry schrieb:
> matrix(j)(k) := (speicher);
speicher ist ein integer, ein Element der matrix aber ein 
unsigned(15 downto 0). Das passt nicht zusammen.

Mal angenommen, du verwendest die numeric_std, dann müsste das so 
aussehen:
  speicher := to_integer(arry(k));
  matrix(j)(k) := unsigned(speicher,16);

Oder eben:
   variable speicher : unsigned(15 downto 0);
   :
          speicher := arry(k);
          matrix(j)(k) := speicher;

Die kürzeste Form wäre aber:
          matrix(j)(k) := arry(k);
OP
Oh, da ist mir ein Fehler untergekommen. Das war vorher auch kein 
integer, sondern ich hatte ihn schon als unsigned. Und beide Varianten 
geben mir Fehlermeldungen...
    matrix(j)(k) := arry(k);
** Error: D:/Arbeit/Projekt Interferometer/Projekt 
Interferometer/Versuche/Versuch.vhd(33): Target type 
ieee.std_logic_1164.std_ulogic in variable assignment is different from 
expression type ieee.numeric_std.unsigned.
** Error: D:/Arbeit/Projekt Interferometer/Projekt 
Interferometer/Versuche/Versuch.vhd(33): Too few indexes (1) for indexed 
name prefix type matr (dimensionality 2).


  type matr is array(0 to 2, 0 to 2) of unsigned(15 downto 0);
  type arr is array (0 to 2) of unsigned (15 downto 0);

  variable matrix : matr;
  variable speicher : unsigned(15 downto 0);
  variable j : unsigned(15 downto 0);
  variable k : unsigned(15 downto 0);
  variable arry : arr;

    begin
      for j in 0 to 2 loop
        for k in 0 to 2 loop
          speicher := arry(k);
          matrix(j)(k) := speicher;
        end loop;
      end loop;
** Error: D:/Arbeit/Projekt Interferometer/Projekt 
Interferometer/Versuche/Versuch.vhd(33): Target type 
ieee.std_logic_1164.std_ulogic in variable assignment is different from 
expression type ieee.numeric_std.unsigned.
** Error: D:/Arbeit/Projekt Interferometer/Projekt 
Interferometer/Versuche/Versuch.vhd(33): Too few indexes (1) for indexed 
name prefix type matr (dimensionality 2).



Bei beiden also die gleiche Fehlermeldung...ich habe keine Ahnung, warum 
er das nicht macht. Alles sind vom Typ unsigned, und eigentlich gehe ich 
acuh ein 2 dimensionales array durch, dachte ich...oder etwa nicht?
Moderator (Firma: Titel) Persönliche Seite
Har Ry schrieb:
> type matr is array(0 to 2, 0 to 2) of unsigned(15 downto 0);
> :
>           matrix(j)(k) := speicher;
Schreib da besser mal
   matrix(j, k) := speicher;
Denn so hast du den Typ ja auch definiert.


BTW: Libraries....
Man kanns offenbar nicht oft genug sagen ;-)
Verwende statt der herstellerabhängigen

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

die genormte

use IEEE.numeric_std.ALL;

Aber auf keinen Fall beide zusammen.
OP
Jop, deshalb nehm ich ja auch die numeric_std.all. Aber man ließt noch 
in vielen Foren, dass man die std_logic_arith nemen soll. Wollt mich nur 
rechtfertigen, bevor mir das wieder geraten wird. ;-)

Achso, und danke Lothar, so klappts!!!

So, jetzt zu meiner zweiten Frage. Wenn ich 3 verschiedene arrays in die 
Matrix laden will, wie mach ich das dann? Ist wahrschienlich nur noch ne 
Sache logischen nachdenkens, aber irgendwie klappt das heute nicht so 
ganz...
Moderator (Firma: Titel) Persönliche Seite
Har Ry schrieb:
> So, jetzt zu meiner zweiten Frage. Wenn ich 3 verschiedene arrays in die
> Matrix laden will, wie mach ich das dann?
Ja, eins nach dem Andern eben, oder alle nacheinander...
1
  type matr is array(0 to 2, 0 to 2) of unsigned(15 downto 0);
2
  type arr is array (0 to 2) of unsigned (15 downto 0);
3

4
  variable matrix : matr;
5
  variable speicher : unsigned(15 downto 0);
6
  variable j : unsigned(15 downto 0);
7
  variable k : unsigned(15 downto 0);
8
  variable arry0, arry1, arry2 : arr;
9

10
    begin
11
        for k in 0 to 2 loop
12
          matrix(0, k) := arry0(k);
13
          matrix(1, k) := arry1(k);
14
          matrix(2, k) := arry2(k);
15
        end loop;
OP
Ja ist schon klar. Ich muss einige Rechnungen aufm FPGA durchführen und 
brauche für die Formeln unter anderem Matritzen und Vektoren.
Und mit C meinte ich nur, dass ich mir dort Matritzen und Vektoren 
leichter anzeigen lassen kann kann als in VHDL.
Das was ich hier gezeigt hatte war nicht das richtige Programm, sondern 
vielmehr ein Versuch das hinzubekommen in Kurzform.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.