Forum: FPGA, VHDL & Co. Abarbeitungsreihenfolge For-Schleife (generate) Codebeispiel


von Spice (Gast)


Lesenswert?

Morgen zusammen,

ich wäre sehr dankbar, wenn mir jemand die Abbarbeitung dieses 
Codeschnipsels erläutern könnte. Mir fehlt momentan noch das Feingefühl 
bei der Abbarbeitungsreihenfolge von Schleifenkonstrukten und bei 
befehlen mit dem Schlüsselwort "generate". Wenn der Hauptprozess 
durchlaufen wird werden ja parallel die Signalzuweisungen durchgeführt, 
der Prozess(oa) durchführt und parallel dazu auch die 
Schleifenkonstrukte. Nun wäre meine frage, wie das mit den Schleifen und 
dem generate-BEfehl funktioniert. wird beim durchlaufen des 
Hauptprozesses die Schleife in ia_dec und dec_do komplett ausgeführt 
oder passiert das mit jedem Durchlaufen des Hauptprozesses. Wird bei 
jedem Hauptprozessdurchlauf die for-Schleife nur einmal ausgeführt oder 
N-1 (bzw M-1) mal???
Über eine kurze Erklärung würde ich mich sehr freuen.
Vielen Dank im Voraus

Gruß Spice

1
...
2
entity ....
3
4
component ....
5
6
7
begin
8
9
10
--hier ein paar parallele signalzuweisungen
11
-- ----------------------------------------
12
13
oa_dec:
14
process(oa)
15
begin 
16
 oa_sel <= (others => '0');
17
 oa_sel(conv_integer(oa)) <= '1';
18
end process oa_dec;
19
20
ia_dec: 
21
for k in M-1 downto 0 generate
22
 ia_sel(k) <= ia(k) 
23
end generate ia_dec;
24
25
dec_do: 
26
for j in N-1 downto 0 generate 
27
 out_dec : decoder    
28
   generic map (N,M)
29
   port map(............
30
            );
31
end generate dec_do;
32
33
end behavioral

von Fpgakuechle K. (Gast)


Lesenswert?

Spice schrieb:
> Morgen zusammen,
>
> ich wäre sehr dankbar, wenn mir jemand die Abbarbeitung dieses
> Codeschnipsels erläutern könnte. Mir fehlt momentan noch das Feingefühl
> bei der Abbarbeitungsreihenfolge von Schleifenkonstrukten und bei
> befehlen mit dem Schlüsselwort "generate".


Falscher Denkansatz, for-generate hat wenig mit Abarbeitungsreihenfolge 
zu tun sondern mit der Beschreibung von physisch 
regelmäßiger/wiederholender Hardware.

Mit C verglichen ist generate vergleichbar mit Präprozessor-anweisungen 
um Codeschnipsel zu aktivieren oder zu deaktivieren.

Also bsp.w um einen 4 bit adder aus 1 bit addern zu beschreiben, kann 
man den code für 1 bit 4 Mal hintereinader schreiben oder eben im 
passenden Generate quasi automatisch vervielfachen lassen.


Siehe:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.55.6397&rep=rep1&type=pdf


S.6-7

Eine "for - loop" ist in VHDL was anderes als "for - generate"



MfG,

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


Lesenswert?

Spice schrieb:
> Mir fehlt momentan noch das Feingefühl bei der Abbarbeitungsreihenfolge
Du hast die falsche Denkweise. In VHDL wird nichts irgendwie 
"abgearbeitet", sondern es wird Hardware beschrieben.
Für jede Art von Schleife bedeutet das: es wird pro "Durchlauf" ein 
neues Stück Hardware parallel zur Hardware aus allen anderen 
"Durchläufen" erzeugt.
Es wird sozusagen jede Schleife in Hardware "aufgerollt"...

Bei der generate Schleife ist das sogar explizit im Schlüsselwort: es 
soll für jeden Schleifendurchlauf etwas generiert werden.

: Bearbeitet durch Moderator
von berndl (Gast)


Lesenswert?

Fpga Kuechle schrieb:
> Eine "for - loop" ist in VHDL was anderes als "for - generate"

Denke ich eigentlich nicht. Die 'for-loop' ist im process-, die 
'for-generate' im concurrent-Teil. OK, in der TB sieht das anderst aus, 
aber im Design sind die beiden doch eigentlich gleichwertig, oder? 
(zumindest benutze ich sie so...)

von berndl (Gast)


Lesenswert?

PS: Ich finde das uebrigens ganz gut, dass in VHDL fuer 'concurrent' und 
'sequential' eigene Statements definiert sind. Man macht sich beim 
hinschreiben doch deutlich mehr Gedanken, wie das denn jetzt in HW 
abgebildet werden kann. Ich persoenlich finde dieses 'vermatschen' in 
VHDL2008 nicht wirklich gut und denke, das haben sie hauptsaechlich fuer 
'Code-Generatoren' eingefuehrt. Ich kann da ganz gut drauf verzichten...
(auch auf sowas wie '*' in der Sensitivitaetsliste...)

von berndl (Gast)


Lesenswert?

berndl schrieb:
> OK, in der TB sieht das anderst aus

Autsch, Mist hingeschrieben... Eine TB laeuft ja eh' in einem 'process', 
also geht da 'generate' gar nicht... Also bitte den Teil des Posts 
ignorieren :o(

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


Lesenswert?

berndl schrieb:
> Eine TB laeuft ja eh' in einem 'process', also geht da 'generate' gar
> nicht...
Sicher kann man auch in einer Testbench mehrere Instanzen von irgendwas 
mit einem generate Konstrukt erzeugen. Denn prinzipiell ist eine TB nur 
ein irgendein VHDL Modul ohne Ports...

von Fpgakuechle K. (Gast)


Lesenswert?

berndl schrieb:
> Fpga Kuechle schrieb:
>> Eine "for - loop" ist in VHDL was anderes als "for - generate"
>
> Denke ich eigentlich nicht. Die 'for-loop' ist im process-, die
> 'for-generate' im concurrent-Teil. OK, in der TB sieht das anderst aus,
> aber im Design sind die beiden doch eigentlich gleichwertig, oder?
> (zumindest benutze ich sie so...)

Hm, eigentlich ging es mir darum das da wo "for" drinsteht nicht eine 
FOR-schleife im Sinne von C etc. drin ist. Eigentlich ist das 
wesentliche
keyword in VHDL nicht das "for" sondern das zweite:

for ... generate
for ... loop
for ... use

Persönlich nutze ich das for generate für "Hardware-VHDL" (was 
synthetisiert wird)  das foor loop für "Software" (was nicht 
synthetisiert wird -testbench, konvertierungsfunktionen). Aber das ist 
wohl meiner persönlichen Abneigung gegen for-loop geschuldet.

MfG,

von Sigi (Gast)


Lesenswert?

berndl schrieb:
> Denke ich eigentlich nicht. Die 'for-loop' ist im process-, die
> 'for-generate' im concurrent-Teil. OK, in der TB sieht das anderst aus,
> aber im Design sind die beiden doch eigentlich gleichwertig, oder?
> (zumindest benutze ich sie so...)

NEIN! und zwar bedingt durch die unterschiedliche Semantik in
sequentiellen und concurrent-Anweisungen.

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.