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
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);
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?
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...
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.
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...
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; |
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!!!
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.