Forum: FPGA, VHDL & Co. Byte-Array in VHDL ist das möglich?


von Olli R. (downunderthunder42)


Lesenswert?

Hallo,

bin gerade dabei ein LCD mit FPGA anzusteuern. Dabei werden die Zeichen 
in Form von Bytes seriell in das LCD "geschoben". Das LCD kann 32 
Zeichen darstellen.

Nun wollte ich eine entity schreiben, der man nur eine Art Byte-Vektor 
übergibt.

Ich frage mich also, ob es möglich ist einen Type zu deklarieren, dessen 
Elemente 1Byte groß sind also nach folgenden Schema:

type Byte_array is (1stesByte 2tesByte .... ntesByte)   ?

letztlich wollte ich ja später mit einer "Laufvariablen" jedes Byte 
ansteuern können?


Viele Grüße

Olli

von John-eric K. (mockup)


Lesenswert?

entity

....

architecture Behavioral of bla is
  type Data_array is array(0 to 19) of STD_LOGIC_VECTOR(7 downto 0);
  Signal Data               : Data_array;
begin

...

Ich hab es so genutzt.

zugriff über

8BitVektor <= Data(1);

Gruß
John-Eric

Zusatz
=====================
Wenn die Daten Konstant sind, wäre auch das denkbar:

  type table is array(0 to 63) of std_logic_vector(15 downto 0);
  constant coeff  :table  := (x"fd93",x"0089",x"009f",x"00c3",x"00ef",
                              x"0118",x"0137",x"0142",x"0133",x"0105",
                              x"00b9",x"004f",x"ffce",x"ff3f",x"feaf",
                              x"fe2e",x"fdca",x"fd94",x"fd9a",x"fde7",
                              x"fe82",x"ff6b",x"009e",x"0211",x"03b2",
                              x"056f",x"072e",x"08d6",x"0a4e",x"0b7f",
                              x"0c55",x"0cc4",x"0cc4",x"0c55",x"0b7f",
                              x"0a4e",x"08d6",x"072e",x"056f",x"03b2",
                              x"0211",x"009e",x"ff6b",x"fe82",x"fde7",
                              x"fd9a",x"fd94",x"fdca",x"fe2e",x"feaf",
                              x"ff3f",x"ffce",x"004f",x"00b9",x"0105",
                              x"0133",x"0142",x"0137",x"0118",x"00ef",
                              x"00c3",x"009f",x"0089",x"fd93");

eigentlich gleich.
Signalen kannst du ja auch einen Startwert zuweisen.

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


Lesenswert?

Olli R. schrieb:
> Nun wollte ich eine entity schreiben, der man nur eine Art Byte-Vektor
> übergibt.
Du mußt dir deinen Typ in einem Package definieren, dann kannst du ihn 
im Port einer Entity verwenden...

Such mal hier im Forum nach FPGA und LCD...
Beitrag "Re: Xilinx und LCD"

von Olli R. (downunderthunder42)


Lesenswert?

John-eric K. schrieb:
> entity
>
> ....
>
> architecture Behavioral of bla is
>   type Data_array is array(0 to 19) of STD_LOGIC_VECTOR(7 downto 0);
>   Signal Data               : Data_array;
> begin
>
> ...
>
> Ich hab es so genutzt.
>
> zugriff über
>
> 8BitVektor <= Data(1);

Ok so wie hier oben kann ich also die Daten des zweiten Bytes von "Data" 
lesen!

kann ich dann auch ganz einfach das n-te Byte von "Data" schreiben bzw. 
einen Wert zuweisen?

also  z.B.

Data(0) <= mein8BitVektor (7 downto 0);    ?

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


Lesenswert?

Olli R. schrieb:
> kann ich dann auch ganz einfach das n-te Byte von "Data" schreiben bzw.
> einen Wert zuweisen?
Ja. Aber das müsste dann so heißen:
  Data(n) <= mein8BitVektor (7 downto 0);
Denn sonst weist du immmer dem 0. Element des Vektors was zu...  ;-)

BTW:
Wenn du ebenfalls einen 8 Bit Vektor hast:
  Data(0) <= mein8BitVektor (7 downto 0);
Dann kannst du sogar so schreiben:
  Data(0) <= mein8BitVektor;

von Olli R. (downunderthunder42)


Lesenswert?

Lothar Miller schrieb:
> Olli R. schrieb:
>> kann ich dann auch ganz einfach das n-te Byte von "Data" schreiben bzw.
>> einen Wert zuweisen?
> Ja. Aber das müsste dann so heißen:
>   Data(n) <= mein8BitVektor (7 downto 0);
> Denn sonst weist du immmer dem 0. Element des Vektors was zu...  ;-)
>
> BTW:
> Wenn du ebenfalls einen 8 Bit Vektor hast:
>   Data(0) <= mein8BitVektor (7 downto 0);
> Dann kannst du sogar so schreiben:
>   Data(0) <= mein8BitVektor;

Vielen Dank.. werde ich morgen früh mal ausprobieren und am nachmittag 
und am abend.....;)

von Olli R. (Gast)


Lesenswert?

so nun ist der nächste Tag und ich frage mich nun, ob ich meinen eigenen 
Datentyp nun auch in eine andere Entity einbetten kann.

Zurzeit sieht das ja so aus:

type BYTE_ARRAY is array(31 downto 0) of std_logic_vector (7 downto 0);

signal DATAIN : BYTE_ARRAY;


kann ich diesen Datentyp auch als Port verwenden?

von Duke Scarring (Gast)


Lesenswert?

Olli R. schrieb:
> kann ich diesen Datentyp auch als Port verwenden?
Ja, sowas mache ich ständig.
Dafür liegen die types in einem eigenen Package, welches überall 
eingebunden wird.

Duke

von Olli R. (Gast)


Lesenswert?

Ok über diese Packages werden also z.B. persönliche Datentypen 
eingebunden!

geht das auch indem ich einfach im Port jeweils den Datentyp deklariere?

oder wie geht das mit den Packages einbinden (nutze Xilinx ISE 13.1) 
etc.?

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


Lesenswert?

Olli R. schrieb:
> oder wie geht das mit den Packages einbinden (nutze Xilinx ISE 13.1)
> etc.?
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
4
package MeineDatentypen is
5
   type BYTE_ARRAY is array(31 downto 0) of std_logic_vector(7 downto 0);
6
end MeineDatentypen ;
7
8
9
10
11
library IEEE;
12
use IEEE.std_logic_1164.all;
13
use IEEE.NUMERIC_STD.ALL;
14
library work;
15
use work.MeineDatentypen.all;
16
17
entity MachWas is
18
 PORT( clk           : IN std_logic;
19
       input         : in  BYTE_ARRAY;
20
       output        : out BYTE_ARRAY);
21
end MachWas ;
22
23
architecture Behavioral of MachWas is
24
begin
25
   output <= input;
26
end MachWas;

von Olli R. (Gast)


Lesenswert?

Vielen Dank
das hat mir sehr weitergeholfen.

Alles läuft!!

von Steffen H. (avrsteffen)


Lesenswert?

Auch ich danke Lothar. Wieder was dazu gelernt!

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


Lesenswert?

Olli R. schrieb:
> Vielen Dank
Steffen H. schrieb:
> Auch ich danke
De nada... ;-)

Da fällt mir noch was auf: die Entity MachWas braucht in diesem 
Beispiel nicht wirklich einen Takt... ;-)

von Johann (Gast)


Lesenswert?

Eigentlich verwendet man für diesen Zweck immer einen internen BLOCK RAM

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


Lesenswert?

Johann schrieb:
> Eigentlich verwendet man für diesen Zweck immer einen internen BLOCK RAM
Das kommt eigentlich immer drauf an, ob man die Daten evtl. komplett 
parallel braucht...

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.