Hallo zusammen,
ich nutze bisher folgendes array (LUT) und greife folgendermaßen darauf
zu:
1 | -- ports
|
2 | ADDR : IN STD_LOGIC_VECTOR(11 downto 0);
|
3 | DO_SIN : OUT STD_LOGIC_VECTOR(11 DOWNTO 0);
|
4 |
|
5 | -- LUT anlegen
|
6 | SUBTYPE SIN_VEC IS STD_LOGIC_VECTOR(11 DOWNTO 0);
|
7 | TYPE SIN_ARY IS ARRAY ( 0 TO 3) OF SIN_VEC;
|
8 |
|
9 | -- LUT füllen
|
10 | CONSTANT SIN_TABLE : SIN_ARY :=
|
11 | (
|
12 | 0 => x"7FF",
|
13 | 1 => x"802",
|
14 | 2 => x"805",
|
15 | 3 => x"808"
|
16 | );
|
17 |
|
18 | -- LUT auslesen
|
19 | DO_SIN(11 DOWNTO 0) <= SIN_TABLE(to_integer(unsigned(ADDR)))(11 DOWNTO 0);
|
Ich kann also mit dem vector ADDR auf die Inhalte der LUT zugreifen.
So weit so gut…
Nun möchte ich gerne die LUT um eine weitere Spalte erweitern, um auch
noch diese Werte abfragen zu können.
Dazu habe ich bisher immer einfach ein weiteres array angelegt, auf das
ich dann getrennt zugegriffen habe.
1 | DO_COS(11 DOWNTO 0) <= COS_TABLE(to_integer(unsigned(ADDR)))(11 DOWNTO 0);
|
Nun stellt sich mir die Frage nach dem „Platzverbrauch“.
Ich habe zwei getrennte Arrays mit je einer Adress-Spalte und einer
Daten-Spalte.
Nun möchte ich die eine Adresspalte „wegrationalisieren“.
1. Frage:
Spart es wirklich Ressourcen, wenn ich ein Array mit zwei Datenspalten
erstelle, als zwei Arrays mit je einer Datenspalte, wenn die
Adressspalte identisch ist?
Oder ergibt das nach der Synthese eh wieder das gleiche?
2. Frage:
Wie genau lege ich ein Array mit drei Spalten an und greife dann darauf
zu?
1 | SUBTYPE SIN_VEC IS STD_LOGIC_VECTOR(11 DOWNTO 0);
|
2 | SUBTYPE SIN_ARY IS ARRAY ( 0 TO 3) OF SIN_VEC;
|
3 | TYPE SIN_2D_ARY IS ARRAY (0 to 1) OF SIN_ARY;
|
4 |
|
5 | -- oder
|
6 | SUBTYPE SIN_VEC IS STD_LOGIC_VECTOR(11 DOWNTO 0);
|
7 | SUBTYPE SIN_ARY IS ARRAY ( 0 to 1, 0 TO 3) OF SIN_VEC;
|
Nur wie fülle ich dieses Array dann mit Daten, wenn es so ähnlich wie
oben gezeigt aussehen soll/kann?
Und wie greife ich dann auf die Spalten getrennt zu, wenn die Adresse
beider Spalten identisch ist?
1 | -- in etwa so?
|
2 | DO_SIN(11 DOWNTO 0) <= SIN_TABLE(to_integer(unsigned(ADDR)))(0)(11 DOWNTO 0);
|
3 | DO_COS(11 DOWNTO 0) <= COS_TABLE(to_integer(unsigned(ADDR)))(1)(11 DOWNTO 0);
|
Vielen Dank!
Andreas