mikrocontroller.net

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


Autor: Har Ry (jato)
Datum:

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

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

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

Autor: Har Ry (jato)
Datum:

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

Autor: T. M. (xgcfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal, welche Bibliotheken du per include & use eingebunden hast.

Autor: Har Ry (jato)
Datum:

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

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

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

Autor: Har Ry (jato)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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...
  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 arry0, arry1, arry2 : arr;

    begin
        for k in 0 to 2 loop
          matrix(0, k) := arry0(k);
          matrix(1, k) := arry1(k);
          matrix(2, k) := arry2(k);
        end loop;

Autor: jato (Gast)
Datum:

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

Autor: Har Ry (jato)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achja, letzter Beitrag war vonb mir!!

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

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

Autor: Har Ry (jato)
Datum:

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

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.