Martin R. schrieb:
> Mein Compiler meckert nun wenn ich obenstehenden Code compilieren
> möchte
Ja, was meckert der denn?
Die Xilinx Synthese sagt:
1 | Constraint expression for 'Top' is not valid in this context as it
|
2 | contains reference(s) to other interface objects
|
3 | (VHDL IEEE 1076-2000 LRM 4.3.2.1)
|
Also das Kapitel 4.3.2.1 im
http://www.scribd.com/doc/7206001/Ieee-2004-Vhdl-Ref-Manual aufgemacht.
Und dort steht:
1 | A name that denotes an interface object must not appear in any interface
|
2 | declaration within the interface list containing the denoted interface
|
3 | object except to declare this object.
|
4 |
|
5 | NOTE
|
6 | The restriction mentioned in the previous sentence makes the
|
7 | following three interface lists illegal:
|
8 | entity E is
|
9 | generic (G1: INTEGER; G2: INTEGER := G1); -- Illegal
|
10 | port (P1: STRING; P2: STRING(P1'RANGE)); -- Illegal
|
11 | procedure X (Y1, Y2: INTEGER; Y3: INTEGER range Y1 to Y2); -- Illegal
|
12 | end E;
|
13 |
|
14 | However, the following interface lists are legal:
|
15 | entity E is
|
16 | generic (G1, G2, G3, G4: INTEGER);
|
17 | port (P1, P2: STRING (G1 to G2));
|
18 | procedure X (Y3: INTEGER range G3 to G4);
|
19 | end E
|
Martin R. schrieb:
> Ist es überhaupt möglich das so zu machen wie in dem Generic oder kann
> ich mein Vorhaben nur über Konstanten erreichen?
Du könntest es so machen:
1 | generic(
|
2 | gSPI_Breite : integer :=8; -- Variable zur Anpassung der Laenge der empfangenen Daten
|
3 | gAnzahl_I : integer :=25; -- Variable zur Anpassung der I
|
4 | gAnzahl_O : integer :=20; -- Variable zur Anpassung der O
|
5 | gAusgang_Resetzustand : std_logic_vector := X"00000"; -- Variable zur Anpassung des Resetzustandes
|
6 | :
|
Aber dabei mußt du auf die Bitreihenfolge aufpassen, denn ein
unconstrained std_logic_vector zählt die Bits von links nach rechts.
Da könnte eine Indizierung wie z.B. gAusgang_Resetzustand(3) in die Hose
gehen... :-/
Du könntest es aber auch so machen (du willst ja sowieso eine
Konstante):
1 | generic(
|
2 | gSPI_Breite : integer :=8; -- Variable zur Anpassung der Laenge der empfangenen Daten
|
3 | gAnzahl_I : integer :=25; -- Variable zur Anpassung der I
|
4 | gAnzahl_O : integer :=20; -- Variable zur Anpassung der O
|
5 | :
|
6 | :
|
7 | );
|
8 | :
|
9 |
|
10 | constant gAusgang_Resetzustand : std_logic_vector (gAnzahl_O - 1 downto 0) := (others=>'0');
|
BTW:
> -- Variable zur Anpassung der Laenge der empfangenen Daten
> :
> -- Variable zur Anpassung des Resetzustandes
Diese Kommentare sind ja wohl MAXIMAL missglückt.
An diesen Werten soll ja gerade nichts variabel sein!
Die werden einmal definiert und fertig.
BTW2:
> Ich habe mehrere Generics
Wozu brauchst du so viele gleiche/ähnliche/unnötige Generics?
Ich glaube nicht, dass du deine Beschreibung tatsächlich sooooo
generisch gestalten wirst, dass du an jeder dieser Schrauben beliebig
drehen kannst...