Forum: FPGA, VHDL & Co. Konstanten global definieren


von martin (Gast)


Lesenswert?

Hallo,

in meinem FPGA PRojekt arbeite ich mit verschiedenen Adresszugriffen und 
vergleichen und möchte hierfür bei Zuweisungen und Vergleichen (z.B. if) 
nicht immer die BIT Kombination angeben, sondern lieber mit konstanten 
Werten arbeiten. Damit ich diese in den verschiedenen Komponenten meines 
Projektes nicht jedesmal neu definieren muß, würd ich gern eine Art 
Header Datei einbinden. Bei der suche bin ich über die Möglichkeit 
gestolpert, ein PAckage zu erstellen. Hier hab ich mal ein Package 
eingestellt, wie ich es mir vorstelle:
1
library ieee;
2
3
use ieee.std_logic_1164.all;
4
use ieee.std_logic_arith.all;
5
6
package Memory_Map is
7
8
   constant address0  : std_logic := "000000000";
9
   constant address1  : std_logic := "000000001";
10
   constant address2  : std_logic := "000010000";
11
12
13
end Memory_Map;
14
15
package body Memory_Mapis
16
17
end package body Memory_Map;

in den einzelnen Komponenten binde ich dieses Package dann mit
1
library work;
2
use work.glob_pkg.all;

nun meine Fragen dazu:
Ist das ein üblicher weg, sich Konstanten zu definieren?
wie speicher ich die Packagedatei ab, bzw welche Dateiendung bekommt 
sie? Ich hab einfach mal versucht, sie als .vhd zu speichern, was auch 
funktioniert hat. Oder gibt es für Packages 'ne eigene Endung?
Gibt es irgendwelche Probleme, auf die ich mit dieser Vorgehensweise 
stoßen kann?

Viele Grüße,
Martin

von Mathi (Gast)


Lesenswert?

> Ist das ein üblicher weg, sich Konstanten zu definieren?

Wenn die Konstanten von mehreren Modulen verwendet werden soll, dann ja.

> wie speicher ich die Packagedatei ab, bzw welche Dateiendung bekommt
>sie? Ich hab einfach mal versucht, sie als .vhd zu speichern, was auch
>funktioniert hat. Oder gibt es für Packages 'ne eigene Endung?

Ein Package ist eine ganz normale VHDL-Datei und wird mit .vhd 
gespeichert.


Ansonsten: benutze nicht die std_logic_arith. Diese ist kein Standard 
und sollte nicht für neue Designs verwendet werden.

von martin (Gast)


Lesenswert?

Hallo,

vielen Dank für die schnelle Antwort! Da bin ich ja nicht ganz auf dem 
falschen Weg gewesen.

Die std_logic_arith nutz ich eigentlich auch nicht, das ist nur ein copy 
Paste fehler aus dem Beitrag, indem ich infos zu Packages gefunden habe 
(ist wohl schon etwas älter)

Eingebunden sind bei mir standardmäßig ieee.std_logic_1164.all und 
ieee.std_logic_unsigned.all

von Eman (Gast)


Lesenswert?

>Ansonsten: benutze nicht die std_logic_arith. Diese ist kein Standard
>und sollte nicht für neue Designs verwendet werden.

Hm, die ist bei mir immer standardmäßig drin, wie ich gerade sehe, und 
es lief immer alles.

Warum sollte sie nicht verwendet werden?
Welche sollte stattdessen verwendet werden?
Für welche Operationen/Befehle ist arith denn zuständig?

von Mathi (Gast)


Lesenswert?

std_logic_arith und std_logic_(un)signed sind proprietär und gehören 
nicht zum IEEE Standard 1164. Statt dessen sollte man das Package 
numeric_std verwenden.
Doch leider findet man die std_logic_arith und die std_logic_(un)signed 
noch viel zu häufig.

Vergleiche auch den Artikel Rechnen in VHDL.

von Eman (Gast)


Lesenswert?

Im Artikel steht leider nichts zu arith. Wo "tut es weh", wenn man arith 
verwendet? Standard oder nicht ist ja dem FPGA scheinbar egal?! ;)

von gast (Gast)


Lesenswert?

Dem FPGA ja, dem Synthesetool aber nicht immer. Generell sollte man bei 
neueren Designs nur noch die IEEE Standard Packages verwenden. Die 
SynopsysLibs waren nur dazu da, die Zeit bis zum erscheinen der IEEELibs 
zu überbrücken.

von Eman (Gast)


Lesenswert?

Warum setzt die Xilinx ISE sie dann _standard_mäßig ein? ;)

von einanderergast (Gast)


Lesenswert?

Weil Änderungen im EDA Bereich noch nie sonderlich schnell Einzug 
gehalten haben. In der Mentor Toolchain ist es glaube ich sogar schon 
abgeändert. Xilinx wird es irgendwann auch einführen. In der neueren 
Literatur werden die Synopsis Pakete auch schon nichtmehr verwendet

von Rick Dangerus (Gast)


Lesenswert?

@martin:

Um Dein Beispiel  nochmal aufzugreifen, ich würde es so machen:
1
library ieee;
2
3
use ieee.std_logic_1164.all;
4
use ieee.numeric_std.all;
5
6
package Memory_Map is
7
8
   constant width : positive := 9;
9
   
10
   type address_t is std_logic_vector(width-1 downto 0);
11
12
   constant address0 : address_t := std_logic_vector(to_unsigned(0, width));
13
   constant address1 : address_t := std_logic_vector(to_unsigned(1, width));
14
   constant address2 : address_t := std_logic_vector(to_unsigned(16, width));
15
16
17
end Memory_Map;
18
19
package body Memory_Mapis
20
21
end package body Memory_Map;

Da lässt sich dann schnell Mal die Breite erweitern. Ich gebe allerdings 
zu, daß man ein unansehnliches Monster hinschreiben muss.

Rick

von Morin (Gast)


Lesenswert?

> Dem FPGA ja, dem Synthesetool aber nicht immer.

Hast du ein konkretes Beispiel? Ich höre immer wieder dass sich das 
Synthesetool daran aufhängen kann, aber noch nie hat einer mal ein 
Beispiel gebracht. Gibt es speziell beim XST irgendwelche bekannten 
Probleme?

von Start-ING (Gast)


Lesenswert?

Hallo Rick Dangerus,

Vielen Dank für Deinen hinweis, aber in meinem Falle ist die Anzahl der 
Adressleitungen definitiv als Konstant anzunehmen, bedingt durch die 
Verdratung zur CPU.
Aber trotzdem ein schöner Impuls, den ich als relativer VHDL Laie gern 
für andere Verwendungen aufgenommen habe.

Viele Grüße,
MArtin

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.