Forum: FPGA, VHDL & Co. Vektorposition im Array auslesen


von Dennis (Gast)


Lesenswert?

Moin Moin an die VHDL Gemeinde...

Ich seh den Wald vor lauter Bäumen nicht mehr.

Kann mir mal bitte einer sagen was für ein Wert in der Variable "pixel" 
steckt bei dieser Syntax?
1
ARCHITECTURE Behavioral of PIC is
2
3
type font_type is array (0 to 15) of std_logic_vector (0 to 15);
4
type font_ROM is array (0 to 1) of font_type; 
5
              
6
constant ascii: font_ROM :=            
7
              (("0000000000000000",  -- 0  #0
8
                            "0000000000000000", 
9
                            "0000000000000000",
10
                            "0000000000000000",
11
                            "0000000000000000",
12
                            "0000000000000000",
13
                            "0000000000000000",
14
                            "0000000000000000",
15
                            "0000000000000000",
16
                            "0000000000000000",
17
                            "0000000000000000",
18
                            "0000000000000000",
19
                            "0000000000000000",
20
                            "0000000000000000",
21
                            "0000000000000000",
22
          "0000000000000000"),
23
              
24
         ("0101010101010101",  --#1
25
                            "0110011000110011",
26
                            "0111000111000111",
27
                            "0111100000001111",
28
                            "0000000000000000",
29
                            "0000000000000000",
30
                            "0000000000000000",
31
                            "0000000000000000",
32
                            "0000000000000000",
33
                            "0000000000000000",
34
                            "0000000000000000",
35
                            "0000000000000000",
36
                            "0000000000000000",
37
                            "0000000000000000",
38
                            "0000000000000000",
39
          "1111111111111111")
40
          );
41
42
EGIN
43
 Process (CLK, Reset, Char)
44
  variable Char_x    : integer := 0;
45
  variable Char_y    : integer := 0;
46
  variable pixel    : std_logic;
47
Begin
48
   If (RESET = '1') Then
49
  Char_x := 0;
50
  Char_y := 0;
51
  pixel := '0';
52
      
53
   ElsIf (CLK'Event and CLK = '1') Then
54
55
  pixel := ascii(conv_integer(char(3 downto 0)))(char_x)(char_y);
56
57
    Char_x := Char_x + 1;
58
    If (Char_x > 15) then
59
     Char_y := Char_y + 1;
60
     If (Char_y > 15) then
61
      Char_y := 0;
62
     End If;
63
     Char_x := 0;
64
    End If;

In der Testbench gebe ich dem Wert Char <= "0001". Char_x und Char_y 
werden mittels Takt hochgezählt und mit 0 intialisiert.

Ich sehe das so, dass am Anfang die variable pixel := ascii(1)(0)(0) mit 
diesen Parametern in die Konstante schaut und den Wert 0 haben müsste.
Bei nächsten CLK würde dann pixel := ascii(1)(1)(0) sein und pixel den 
Wert 1 haben.

Oder verpeile ich hier gerade alles.
PS: Ich weiß mit Variablen zu arbeiten ist in vhdl totaler Mist. Bitte 
habt ein Nachsehn.

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


Lesenswert?

Dennis schrieb:
> PS: Ich weiß mit Variablen zu arbeiten ist in vhdl totaler Mist.
Nein, nicht unbedingt. Man muss allerdings wissen, was man da tut...
Und das hier ist schlecht:
> In der Testbench gebe ich dem Wert Char <= "0001". Char_x und Char_y
> werden mittels Takt hochgezählt und mit 0 intialisiert.
Wenn diese Variablen sowieso speichernd sind, dann kannst du auch gleich 
Signale nehmen.

>   pixel := ascii(conv_integer(char(3 downto 0)))(char_x)(char_y);
Irgendwas ist hier faul, denn es dürfen garantiert nicht alle 3 Indexe 
Werte zwischen 0 und 15 annehmen!

> conv_integer()
Ach nee.
Nicht schon wieder die alten Synopsys-Libs...

> std_logic_vector (0 to 15);
Hoffentlich bringst du dann mit to und downto was durcheinander...

>  Process (CLK, Reset, Char)
Da sind m.E. mindestens 2 Signale unnötig in dieser Sensitivliste...

> PS: Ich weiß mit Variablen zu arbeiten ist in vhdl totaler Mist.
Warum tust du es dann und zudem an gänzlich unnötiger Stelle?

von Dennis (Gast)


Lesenswert?

über char will ich später mal sagen welches array er nehmen soll, also 
ob 0, 1 etc.

ich hab mal "gelernt bekommen" das in die senstivity list alle signale 
müssen auf der prozess reagieren soll wenn diese sich ändern.

conv_integer...ich weiß müsste eigentlich to_integer(unsigned) heißen 
oder so ähnlich

wenn ich bei 0 anfangen zu zählen dann passt doch 0 to 15.

Welchen wert hat pixel denn bei dir, wenn  pixel := ascii(1)(0)(0) 
ist...0 oder 1

Bei mir wäre er im Array #1 linke obere Ecke und wäre 0.

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


Lesenswert?

Dennis schrieb:
> ich hab mal "gelernt bekommen" das in die senstivity list alle signale
> müssen auf der prozess reagieren soll wenn diese sich ändern.
Ja, und wie sieht der Prozess komplett aus?

Dennis schrieb:
> wenn ich bei 0 anfangen zu zählen dann passt doch 0 to 15.
Nehmen wir mal dieses simple Beispiel:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity Feld is
6
    Port ( clk : in  STD_LOGIC;
7
           q   : out  STD_LOGIC);
8
end Feld;
9
10
architecture Behavioral of Feld is
11
-- type FeldDim1 is array (0 to 3) of std_logic_vector(7 downto 0); -- Fall A
12
type FeldDim1 is array (0 to 3) of std_logic_vector(0 to 7);        -- Fall B
13
type FeldDim2 is array (0 to 1) of FeldDim1; 
14
constant Feld : FeldDim2 := ((x"01",x"03",x"07",x"0F"),(x"1F",x"3F",x"7F",x"FF"));
15
16
signal cnt0 : integer range 0 to 7 := 0;
17
signal cnt1 : integer range 0 to 3 := 0;
18
signal cnt2 : integer range 0 to 1 := 0;
19
20
signal cnt  : unsigned (5 downto 0) := (others=>'0');
21
22
begin
23
  cnt  <= cnt+1 when rising_egde(clk); -- Schreibt sich kompakter... ;-)
24
25
  cnt0 <= to_integer(cnt(2 downto 0));
26
  cnt1 <= to_integer(cnt(4 downto 3));
27
  cnt2 <= to_integer(cnt(5 downto 5));
28
  q    <= Feld(cnt2)(cnt1)(cnt0);
29
end Behavioral;
Was erwartest du im Fall A, was im Fall B?
Fazit: es ist überhaupt nicht egal, wie herum die Bits im Vektor 
angeordnet sind... :-o

> Bei mir wäre er im Array #1 linke obere Ecke und wäre 0.
Bei mir auch...

von Dennis (Gast)


Lesenswert?

...ahhh...totale Verwirrung. :)

Ich will ja das er den Vektor von links nach rechts abarbeitet. Also 
links oben anfängt, dann 15 mal nach rechts rückt in die nächste Zeile 
springt und von vorn beginnt.

Das es nicht egal ist ist mir klar :).

0 to 7 wäre ja 2^0, 2^1, 2^2 etc also 0,1,2...
7 downto 0 ware dann 2^7, 2^6 also 128,64,...

FallA würde den Vektor von rechts beginnend nach links hin auslesen. Bei 
B umgedreht. Würd ich jetz sagen.

Ich glaube ich ge mal ne Runde ums Haus...seh nur noch Nullen und Einsen 
LOL

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


Lesenswert?

Dennis schrieb:
> ..seh nur noch Nullen und Einsen
Aber in einer unerwarteten Reihenfolge?
Ich vermute, du hast die Indexe char_x und char_y vertauscht:
char_y läuft in deinem Zähler schneller als char_x... :-o

von Dennis (Gast)


Lesenswert?

ich habe mal aus spass an der freude aus 0 to 15, 15 downto 0 gemacht 
ohne das sich eas verändert hat in der modelsim.

Lothar Miller schrieb:
> Aber in einer unerwarteten Reihenfolge?

aber total. Ich hätte es ja verstanden, wenn er den Vektor verkehrt 
herum ausliest aber der macht totalen Murx, so als er er im Array 
sinnlos umher springt.

Lothar Miller schrieb:
> char_y läuft in deinem Zähler schneller als char_x... :-o

Char_y wird doch erst erhöht wenn Char_x 16 mal erhöht wurde. Also 
sollte er doch erst in Zeile 0, 16 mal nach rechts rücken ehe er in die 
nächste Zeile des Array springt.

nochmal zum Grundverständnis...wie das Array aufgerufen wird. Vielleicht 
bin ich auch total verpeilt gerade.

pixel := ascii(Nummer font_ROM)(x-Position im font_Type Array)(y-Postion 
im font_Type Array)

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


Angehängte Dateien:

Lesenswert?

Dennis schrieb:
> Char_y wird doch erst erhöht wenn Char_x 16 mal erhöht wurde.
Richtig...

>> Aber in einer unerwarteten Reihenfolge?
> aber total.
Würdest du sowas wie im Anhang erwarten?

von Dennis (Gast)


Lesenswert?

ja sowas soll mir mein modelsim auch zeigen!!!, nur das die char_x und 
char_y Werte sich gemaß dem Zähler ändern.

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


Angehängte Dateien:

Lesenswert?

Dennis schrieb:
> ja sowas soll mir mein modelsim auch zeigen!!!
Aber du bekommst sowas wie hier?
Dann tausche doch mal die beiden Indexe aus und schreib:
      pixel := ascii(to_integer(unsigned(char)))(char_y)(char_x);


> nur das die char_x und char_y Werte sich gemaß dem Zähler ändern.
Dass die hier 0 bleiben hat andere Gründe (ISIM kann Variablen leider 
nicht darstellen)...

von Dennis (Gast)


Lesenswert?

...ja sowas komisches kommt bei mir auch. Absolut kein zusammenhang zum 
Array zu finden.

ES GEHT. DANKE...*handkuss* und niederknie

Kannst Du mir das auch mal erklären. Ich dachte er ruft erst die array 
Nummer auf dann den x-Wert im Array und dann den zugehörigen y-Wert.

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


Lesenswert?

Dennis schrieb:
> Ich dachte er ruft erst die array
> Nummer auf dann den x-Wert im Array und dann den zugehörigen y-Wert.
Er löst das Array von links nach rechts in der Reihenfolge deiner 
Klammern auf:
1
                        1.                     2.        3.
2
pixel := ascii (to_integer(unsigned(char))) (char_y)  (char_x);
3
4
                  1. char
5
                 (("0000000000000000",  <-- 2. char_y
6
                   "0000000000000000",  <-- 2.   |
7
                   "0000000000000000",      :    v
8
                   "0000000000000000",      :
9
                   "0000000000000000",
10
                   "0000000000000000"),
11
                  1. char
12
                  ("0101010101010101",  
13
                   "0110011000110011",
14
                   "0111000111000111",
15
                   "0111100000001111",
16
                   "0000000000000000",
17
                   "1111111111111111")
18
                    ^^^^^^^^^^^^^^^^
19
                    |    3. char_x | "Bitnummer"
20
                    0123456789ABCDEF

von Dennis (Gast)


Lesenswert?

...also macht er es immer so oder liegt es an meiner Syntax?

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


Lesenswert?

Dennis schrieb:
> ...also macht er es immer so
Ja.
Es gibt noch die "andere Art, (d)ein Array zu beschreiben, aber auch da 
wird von links nach rechts und von aussen nach innen ausgewertet:
1
--                                       3.
2
subtype font_type is std_logic_vector (0 to 15);       --- Fall Y
3
--                        1.      2.        
4
type font_ROM is array (0 to 1, 0 to 15) of font_type; --- Fall Y
5
                              1. 2.   3.             2.    3.                 1. ...
6
constant ascii: font_ROM := ( (  "0000000000000000", "0000000000000000",..) , (..) );
7
:
8
:
9
      q  <= ascii(to_integer(unsigned(char)), char_y)(char_x);

> oder liegt es an meiner Syntax?
Na, du greifst eben falsch auf dein Array zu. Es ist anders 
organisiert...

von Dennis (Gast)


Lesenswert?

...ich galube in C hatte ich auch ähnliche Probleme mit dem Zugriff auf 
Array's

Noch mal Danke Lothar, jetzt kann ich mal ohne ständiges Grübeln in der 
Feierabend.

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.