Array in Matrix einlesen

OP #2020312
Lesenswert?
• ▲
▼
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 #2020420
Lesenswert?
• ▲
▼
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 #2020563
Lesenswert?
• ▲
▼
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 #2020639
Lesenswert?
• ▲
▼
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 #2020658
Lesenswert?
• ▲
▼
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 #2020675
Lesenswert?
• ▲
▼
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 #2021134
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren