Forum: FPGA, VHDL & Co. Integer Array


von Dennis (Gast)


Lesenswert?

Hallo

Ne kurze Frage, warum das hier funktioniert...
1
TYPE word_ROM is array (0 to 19) of integer;
2
3
variable Word : Word_ROM := (1,0,2,0,3,0,4,0,0,0,0,0,0,0,0,0,0,0,1,2);
4
5
Pixel := ascii(Word(Word_x))(Char_y)(Char_x);

zur Erklärung:
Pixel := ascii-Package(Zeichennummer im package(Position im 
Word_ROM)(y-Position im Zeichen) (x-Position im Zeichen)

klappt alles bestens...mir wir das auf dem Bildschirm angezeigt was 
soll.

...hier jedoch der Fehler kommt.

Error (10383): VHDL error at OSD.vhd(126): object cannot be indexed 
because it has integer type rather than array type
Error: Quartus II Analysis & Synthesis was unsuccessful. 1 error, 1 
warning
  Error: Peak virtual memory: 182 megabytes
  Error: Processing ended: Tue May 03 15:35:49 2011
  Error: Elapsed time: 00:00:02
  Error: Total CPU time (on all processors): 00:00:02
1
TYPE word_type is array (0 to 19) of integer;
2
TYPE word_ROM is array (0 to 15) of word_type; 
3
4
variable Word : Word_ROM := (               (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),           (2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),           (3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3),           (4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4),           (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),           (2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),           (3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3),           (4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4),           (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),           (2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),           (3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3),           (4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4),           (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),           (2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),           (3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3),           (4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4)           );
5
6
Pixel := ascii(Word(Word_y )(Word_x))(Char_y)(Char_x);

Hier habe ich das Array erweitert, um mehr Zeichen ausgeben zu können.

von Dennis (Gast)


Lesenswert?

...verdammt, da hats die Zeilenümbrüche verhauen

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


Lesenswert?

Dennis schrieb:
> Pixel := ascii(Word(Word_y )(Word_x))(Char_y)(Char_x);
Funktioniert die Simulation? Falls ja: sieh mal nach, ob dein 
Synthesizer vierdimensionale Arrays überhaupt umsetzen kann...

XST z.B. kann nur drei Dimensionen...  :-/
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity MultidimArray is
6
    Port ( clk  : in  STD_LOGIC;
7
           dout : out STD_LOGIC_VECTOR (3 downto 0));
8
end MultidimArray;
9
10
-- 5-dimensionales Array: Sim OK, Synthese NOK, weil XST nur bis 3 Array-Ebenen zulässt
11
architecture BehavioralA of MultidimArray is
12
subtype BasisTyp is std_logic_vector(3 downto 0); 
13
type SmallArrayTyp is array (0 to 3, 0 to 1) of BasisTyp; 
14
type BigArrayTyp is array (0 to 3, 0 to 1) of SmallArrayTyp; 
15
signal MeinArray : BigArrayTyp := ( 
16
    (((x"8",x"9"),(x"a",x"b"),(x"c",x"d"),(x"e",x"f")) , ((x"1",x"2"),(x"3",x"4"),(x"5",x"6"),(x"7",x"8"))),
17
    (((x"1",x"3"),(x"5",x"7"),(x"9",x"b"),(x"d",x"f")) , ((x"2",x"4"),(x"6",x"8"),(x"a",x"c"),(x"e",x"0"))),
18
    (((x"d",x"e"),(x"a",x"d"),(x"b",x"e"),(x"e",x"f")) , ((x"b",x"a"),(x"d",x"c"),(x"a",x"b"),(x"1",x"e"))),
19
    (((x"5",x"5"),(x"a",x"a"),(x"a",x"5"),(x"5",x"a")) , ((x"b",x"a"),(x"d",x"c"),(x"0",x"f"),(x"f",x"e")))  );
20
signal cnt : unsigned (7 downto 0) := (others => '0');
21
begin
22
  process 
23
  variable ol,oc,il,ic : integer;
24
  begin
25
     wait until rising_edge(clk);
26
     cnt <= cnt+1;
27
     oc := to_integer(cnt(5 downto 4));
28
     ol := to_integer(cnt(3 downto 3));
29
     ic := to_integer(cnt(2 downto 1));
30
     il := to_integer(cnt(0 downto 0));
31
     dout <= MeinArray(oc,ol)(ic,il);
32
  end process;     
33
34
end BehavioralA;
35
36
-- 4-dimenisionales Array: Sim OK, Synthese NOK, weil XST nur bis 3 Array-Ebenen zulässt
37
architecture BehavioralB of MultidimArray is
38
subtype BasisTyp is std_logic_vector(3 downto 0); 
39
type SmallArrayTyp is array (0 to 3, 0 to 1) of BasisTyp; 
40
type BigArrayTyp is array (0 to 1) of SmallArrayTyp; 
41
signal MeinArray : BigArrayTyp := ( ((x"8",x"9"),(x"a",x"b"),(x"c",x"d"),(x"e",x"f")) , 
42
                                    ((x"1",x"2"),(x"3",x"4"),(x"5",x"6"),(x"7",x"8")) );
43
signal cnt : unsigned (7 downto 0) := (others => '0');
44
begin
45
  process 
46
  variable ol,oc,il,ic : integer;
47
  begin
48
     wait until rising_edge(clk);
49
     cnt <= cnt+1;
50
     oc := to_integer(cnt(4 downto 3));
51
     ol := to_integer(cnt(3 downto 3));
52
     ic := to_integer(cnt(2 downto 1));
53
     il := to_integer(cnt(0 downto 0));
54
     dout <= MeinArray(ol)(ic,il);
55
  end process;     
56
57
end BehavioralB;
58
59
-- 3-dimensionales Array: Sim OK, Synthese OK
60
architecture BehavioralC of MultidimArray is
61
subtype BasisTyp is std_logic_vector(3 downto 0); 
62
type SmallArrayTyp is array (0 to 3, 0 to 1) of BasisTyp; 
63
signal MeinArray : SmallArrayTyp := ( ((x"8",x"9"),(x"a",x"b"),(x"c",x"d"),(x"e",x"f")) );
64
signal cnt : unsigned (7 downto 0) := (others => '0');
65
begin
66
  process 
67
  variable ol,oc,il,ic : integer;
68
  begin
69
     wait until rising_edge(clk);
70
     cnt <= cnt+1;
71
     oc := to_integer(cnt(4 downto 3));
72
     ol := to_integer(cnt(3 downto 3));
73
     ic := to_integer(cnt(2 downto 1));
74
     il := to_integer(cnt(0 downto 0));
75
     dout <= MeinArray(ic,il);
76
  end process;     
77
78
end BehavioralC;

von Dennis (Gast)


Lesenswert?

...ich nutze einen Cyclone III

ich werde für ein 4. Dim mal ne Simulation machen. Dachte ja ich kann 
die 3 Dim.-Version einfach nur umschreiben auf 4...na mal schaun obs 
geht

von Dennis (Gast)


Lesenswert?

...also sim geht und synthese auch, sofern ich
1
Pixel := ascii(Word(Word_y )(Word_x))(Char_y)(Char_x);

kommentiere.

Also scheint entweder meine Syntax der Array-Ansteuerung flasch zu sein 
oder doch ein Synthese Problem?

Das Array selber wir aber synthetisiert.

von Rainer (Gast)


Lesenswert?

...war ein Fehler in der Syntax

so hier funktioniert es.

Pixel := ascii(Word(Word_y)(Word_x))(Char_y)(Char_x);

von Dennis (Gast)


Lesenswert?

....ist ja das selbe wie bei mir...komischerweise gehts jetzt auch bei 
mir.

mal ne andere Frage.

Kann ich in einem std_logic_vector andere werte wie 0 und 1 unterbringen 
die man auch auswerten kann?

von D. I. (Gast)


Lesenswert?

Dennis schrieb:
> Kann ich in einem std_logic_vector andere werte wie 0 und 1 unterbringen
> die man auch auswerten kann?

ja: 'H', 'L', 'X', 'U', '-', 'W', 'Z'

von Dennis (Gast)


Lesenswert?

würde auch erkannt werden was kommt? sagen wir mal hier.

if signal = '1' then
a
elsif signal = '0' then
b
elsif signal = '-' then
c
End if;

ich habs mit L und H probiert da regiert er auf die bedingungen wie wenn 
1 oder 0 kommt.

von Duke Scarring (Gast)


Lesenswert?

Dennis schrieb:
> würde auch erkannt werden was kommt?
Fragst Du für die Simulation oder für die Synthese?

Duke

von Dennis (Gast)


Lesenswert?

Synthese...signaltap zeigt mir '0' und '1' logischerweise an. Ich 
brauche aber zwingend einen dritten eindeutigen zustand den ich 
verwerten kann

von Duke Scarring (Gast)


Lesenswert?

Dennis schrieb:
> Ich
> brauche aber zwingend einen dritten eindeutigen zustand den ich
> verwerten kann
3 Zustände? Das passt nicht in ein Bit (binary digit). Du bräuchtest ein 
Tritt (trinary digit).

Verrate uns doch mal, was Du machen willst?

Duke

von Dennis (Gast)


Lesenswert?

also ich habe ja einen Ascii-Zeichensatz. der besteht aus einem 3 
Dim-Array
1
TYPE font_type is array (0 to 15) of std_logic_vector (0 to 15);
2
TYPE font_ROM is array (0 to 15) of font_type;

und ist gefüllt mit 0 und 1. Bei 0 macher nix bei 1 "wird" das Pixel im 
Bild schwarz.

hier rufe ich es dann auf.
Pixel := ascii(Word(Word_y )(Word_x))(Char_y)(Char_x);

Geht auch alles wunderbar. Jetzt wollte ich um die Zeichen noch einen 
andersfarbigen (weißen) Rand machen. Da die Zeichen ja schwarz sind und 
bei schwarzen Hintergrund ja nix zu sehen ist.

Also wollte ich im Zeichen Array noch einen dritten Zustand machen. Ich 
habe probiert das Array statt mit std_logic_vektor mit integer 
aufzubauen so wie oben. dann könnte ich ja beliebig viele Zustände 
eintragen. Nur dann hab ich ein 5-Dim Array als Zeichensatz.

müsste dann so aussehen:
1
TYPE font_type is array (0 to 15) of integer;
2
TYPE font_type1 is array (0 to 15) of integer;
3
TYPE font_ROM is array (0 to 15) of font_type1;

nur der Aufruf klappt dann nicht mehr.

von Dennis (Gast)


Lesenswert?

...kann es sein, dass ich beim Zeichensatz mit integer Array noch in die 
z-Ebene muss
1
TYPE font_type is array (0 to 15) of integer;   #1
2
TYPE font_type1 is array (0 to 15) of font_type;  #2
3
TYPE font_ROM is array (0 to 15) of font_type1; #3
4
5
CONSTANT ascii : font_ROM := ...  
6
 
7
TYPE word_type is array (0 to 19) of integer;
8
TYPE word_ROM is array (0 to 15) of word_type; 
9
10
variable Word : Word_ROM := ...
11
12
Pixel := ascii(Word(Word_y )(Word_x))(Char_y)(Char_x);

Aber mit word müsste ich ins Ascii array springen nach #3, mit Char_y 
nach #2 und Chra_x nach #1...also habe ich doch eindeutige Adressierung.

von Dennis (Gast)


Lesenswert?

...hab den Fehler gefunden. Ich hatte vergessen eine deklaration zu 
ändern. die stsnd noch auf std_logic und konnte mit den integer werten 
logischerweise nix anfangen.

Jetzt funzt alles auch mit dem Zeichensatz aus den integer array's.

jetzt muss ich nur noch geruasfinden, wie ich diese array hier.
1
TYPE word_type is array (0 to 19) of integer;
2
TYPE word_ROM is array (0 to 15) of word_type; 
3
4
variable Word      : Word_ROM := (
5
                     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
6
                     (2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
7
                     (3,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3),
8
                     (4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4),
9
                     (1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
10
                     (2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
11
                     (3,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,3),
12
                     (4,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,4),
13
                     (1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),
14
                     (2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2),
15
                     (3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,3),
16
                     (4,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,4),
17
                     (1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1),
18
                     (2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2),
19
                     (3,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,3),
20
                     (4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4)
21
                     );

...mit JTAG verändern kann. Also im laufenden Betrieb des FPGA den 
Inhalt ändern kann.

von Dennis (Gast)


Lesenswert?

...über LPM_CONSTANT gehts...nur wie ich das Array ansprechen muss 
bekomm ich nicht hin

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.