Konstanten global definieren

Gast #922274
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
Gast #922278
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.
Gast #922288
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
Gast #922390
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?
Gast #922402
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.
Gast #922428
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.
Gast #922444
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
Gast #924075
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
Gast #924214
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?
Gast #928350
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren