Forum: FPGA, VHDL & Co. for i in 1,3,6,8 generate


von Marfel (Gast)


Lesenswert?

Hallo zusammen,

ich möchte gerne eine for generate Loop bauen, in der ich bestimmte 
Componenten zusammenknote.
Ich möchte jedoch nicht einen Index I von 0 bis ... verwenden, sondern 
nur bestimmte Werte, z.B. 1,3,6,8.

Ist dies in VHDL irgendwie möglich? Bisher war meine meine Websuche 
diesbezüglich leider erfolglos.

Viele Grüße

Marfel

von Christian R. (supachris)


Lesenswert?

Klingt nach LTC2175 oder LTM9011. Hab ich damals aber auch nicht 
gefunden als ich die Receiver für die ADCs geschrieben habe. Das scheint 
es nicht so direkt zu geben.

von Fpgakuechle K. (Gast)


Lesenswert?

Marfel schrieb:

> ich möchte gerne eine for generate Loop bauen, in der ich bestimmte
> Componenten zusammenknote.
> Ich möchte jedoch nicht einen Index I von 0 bis ... verwenden, sondern
> nur bestimmte Werte, z.B. 1,3,6,8.
>
> Ist dies in VHDL irgendwie möglich?

Schleife über einen Aufzählungstyp resp array über range ist möglich, 
also
1
label_gen: for i in index_enum generate
2
//..
3
end generate;

Ist jetz nur die Frage wie man den Index bspw als enumeration definiert.
http://vhdl.renerta.com/mobile/source/vhd00026.htm

Der klassische Fall sind die Zustände einer FSM
1
type enum_state is (OANS,ZWOA,DREIER);
Denen kannst du jetzt eine Zahl im Enumeration encoding zuweisen:
Example 2: http://fpgacenter.com/vhdl_dic/enumar.php

Damit sollte es gehen. Ob man integer in ein Aufzählungstyp packen kann, 
also:
1
type enum_by_numbers is (1,3,6,8);
musst du selbst ausprobieren. Was geht ist auch ein range als index, 
alse
1
subtype index_range is integer range 8 downto 0;
aber da stecken dann auch Zahlen drin du du nicht dabei wolltest.

MfG,

von Alejandro P. (alejandro_p79)


Lesenswert?

Kannst du nicht die Werte in einem Vector spechern und die nutzen ?
(Ich kenne nur Verilog) Oder eine Funktion nutzen die die Werte 
berechnet ? or ein python Skript das dir generierte code raus spuckt ?

Edit: Ops, ich sehe daß Fpgaküchle hat schon Änliche Lösungen...

: Bearbeitet durch User
von Matthias M. (Gast)


Lesenswert?

Im Loop kannst du if generate verwenden.

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


Lesenswert?

Marfel schrieb:
> Ist dies in VHDL irgendwie möglich?
Solange das nur ein paar einzelne Werte sind, würde ich es pragmatisch 
mit geschachtelten generate-Anweisungen angehen:
1
   GENERATE_LOOP: for I in 0 to 8 generate
2
      GENERATE_CONDITION: if (i=1 or i=3 or i=6 or i=8) generate
3
        REGX : REG port map (...)
4
      end generate GENERATE_CONDITION;
5
   end generate GENERATE_LOOP;

EDIT: Pech, Zweiter...  ;-)

: Bearbeitet durch Moderator
von user (Gast)


Lesenswert?

wie wäre es damit

type int_array is array(integer range <>) of integer;

constant arr : int_array(0 to 3) := (1,3,6,8);

gen_loop: for i in arr'range generate
   report arr(i);
end generate;

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


Lesenswert?

user schrieb:
> wie wäre es damit
Das hatte ich auch im Sinn, der signifikante Nachteil dabei ist, dass 
die Werte, für die der Generate durchgeführt wird, abseits des 
eigentlichen Generate stehen und so m.E. die Übersicht leidet.

von Marfel (Gast)


Lesenswert?

Hallo zusammen,

vielen Dank für die Antworten!
Im aktuellen Projekt haben wir eine zentrale Konfigurationsstelle, 
sodass die Lösung von user konzeptionell ganz gut reinpassen würde.

Ein Nachteil der geschachtelten generate loop ist, dass ich beim 
Simulieren eine zusätzliche Ebene in den Signalnamen erhalte. Dies würde 
ich zumindest erwarten, ohne es bisher getestet zu haben.

Marfel

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.