Forum: FPGA, VHDL & Co. Array in Matrix einlesen


von Har R. (jato)


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

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


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);

von Har R. (jato)


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?

von T. M. (xgcfx)


Lesenswert?

Zeig mal, welche Bibliotheken du per include & use eingebunden hast.

von Har R. (jato)


Lesenswert?

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


Die std_logic_arith soll man ja irgendwie nicht mehr nutzen, da sie 
veraltet ist. Deshalb numeric...

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


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.

von Har R. (jato)


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...

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


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;

von jato (Gast)


Lesenswert?

Achso, ok, das ja einfach...
So hätt ichs in C auch gemacht, aber in VHDL hatte ichs wegen meiner 
schlechten Schreibweise nicht hinbekommen...
Danke für die Hilfe!!!

von Har R. (jato)


Lesenswert?

achja, letzter Beitrag war vonb mir!!

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


Lesenswert?

jato schrieb:
> So hätt ichs in C auch gemacht
C? Ein Programmierer? Da kommen mir so langsam Bedenken...  :-o
Was willst du denn damit machen? Dir ist schon klar, dass hier einfach 
nur Leitungen/Verbindungen/Verdrahtungen beschrieben sind, nichts 
weiter?

von Har R. (jato)


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.

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.