Forum: FPGA, VHDL & Co. LUT - Array - Erweiterung um eine Spalte und Synthese


von Andi (loopy83)


Lesenswert?

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

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


Lesenswert?

Was ich mich vorneweg frage:
> SIN_TABLE
> COS_TABLE
Warum brauchst du für den Sinus und den Cosinus 2 Tabellen?
Darin stehen doch, abgesehen von der Position (=Adressoffset), die 
selben Werte.

> Nun möchte ich gerne die LUT um eine weitere Spalte erweitern, um auch
> noch diese Werte abfragen zu können.
Was ist bei dir eine Spalte?
Soll die Länge deiner Tabelle vergrößert werden, oder soll die 
Breite des Ergebnisvektors vergrößert werden?

von Andi (loopy83)


Lesenswert?

Danke Lothar!

Du hast für beide Möglichkeiten eine Lösung genannt, manchmal konmt man 
nicht auf die einfachsten Ideen.

SIN => COS ist ja einfach ein Adressoffset, welcher 90 Grad entspricht.

Und sollte das widererwartend nicht ausreichen, verdoppel ich einfach 
die Breite des Arrays.

Oh mann, ich glaube ich brauch Urlaub :)

Vielen Dank!
Andreas

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


Lesenswert?

Andreas B. schrieb:
> Vielen Dank!
Keine Ursache... ;-)

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.