Hi,
die generate Anweisung hätt ich auch als erstes genannt, aber die
meisten Toolchains erfordern dabei, dass auch die Designfiles der
nicht-generierten Instanzen eingelesen werden. Das gibt immer wieder mal
Probleme, wenn sich ein Hersteller nicht genau an den VHDL-Standard (ok,
der ist auch wirklich komplex) hält.
Die andere Variante ist die per cpp/Makefile, wie z.B. per folgender
Regel:
1 | %.vhdl : %.chdl
|
2 | cpp -P -o $@ $<
|
Nachteil mag sein, dass man vor der grafischen Synthese mit den diversen
Klickitools immer ein "make" aufrufen muss, aber die echten Nerds packen
auch die ganze Synthese ins Makefile :-)
Dritte Variante wäre per configuration. Ziemlich hässlicher Moloch, und
ich bin mir nicht mehr sicher, ob nicht die Xilinx-Tools das alles
wieder hochwürgen...
Beispiel:
1 | configuration gna of soc_top is
|
2 | use work.Bla;
|
3 |
|
4 | for behaviour
|
5 | for maybe_foo
|
6 | for foo : Blabla
|
7 | use entity work.Bla;
|
8 | end for;
|
9 | end for;
|
10 | end for;
|
11 |
|
12 | end gna;
|
Das konfiguriert also die Instanz 'foo', um statt Design 'Blabla' 'Bla'
zu nutzen (keine Garantie für Richtigkeit..):
1 | entity soc_top is
|
2 | ...
|
3 | end entity soc_top;
|
4 |
|
5 | architecture behavour of soc_top is
|
6 | ...
|
7 | begin
|
8 | maybe_foo:
|
9 | if SIMULATION generate
|
10 |
|
11 | foo: Blabla
|
12 | generic map (
|
13 | ...
|
14 | )
|
15 | port map (
|
16 | ...
|
17 | );
|
18 |
|
19 | end generate;
|
20 | ...
|
21 |
|
22 | end behaviour;
|
23 | ...
|
Das geht allerdings nur, wenn das Design entsprechend modular ist, und
man muss die Hierarchien genau beachten.
Grüsse,
- Strubi