Forum: FPGA, VHDL & Co. VHDL: "if" in "for.generate"


von Robert B. (rsb89)


Lesenswert?

Hallo zusammen,

gibt es in VHDL die Möglichkeit, in einer for...generate Konstruktion 
if...then zu verwenden?

Gedacht habe ich mir das so:
1
generate_fulladders : for i in 0 to 39 generate
2
  begin
3
  fulladder : fulladder_comp
4
    port map(
5
      if i = 0 then
6
        cin => cin,
7
      else
8
        cin => c(i-1),
9
      end if;
10
    
11
      if i = 39 then
12
        cout => cout,
13
      else
14
        cout => c(i),
15
      end if;
16
      
17
      a => summand1(i), 
18
      b => summand2(i),
19
      s => sum(i));
20
  end generate;

Da bekomme ich ein "Syntax error near 'if'". Bei dem ersten if. 
Vielleicht liegt es aber auch nicht am if sondern woanders und ich sehe 
es nur nicht :-S

von Student (Gast)


Lesenswert?

Das Problem ist eher, dass Port Map keine if-Abfragen kann, oder?

von user (Gast)


Lesenswert?

ja das ist das problem
das hier geht aber


generate_fulladders : for i in 0 to 39 generate
  begin
  if i = 0 generate
  fulladder : fulladder_comp
    port map(
        cin => cin,
        cout => c(i),
      a => summand1(i),
      b => summand2(i),
      s => sum(i));
  end generate
  if i /= 0 generate
  fulladder : fulladder_comp
    port map(
        cin => c(i-1),
        cout => c(i),
      a => summand1(i),
      b => summand2(i),
      s => sum(i));
  end generate
  end generate;

von Robert B. (rsb89)


Lesenswert?

Bei mir funktioniert es leider nicht.
1
generate_fulladders : for i in 0 to 39 generate
2
  begin
3
    if i = 0 generate
4
    fulladder : fulladder1_comp
5
      port map(
6
        cin => cin,
7
        cout => c(i),
8
        a => summand1(i), 
9
        b => summand2(i),
10
        s => sum(i));
11
    end generate; 
12
    
13
    if i = 39 generate
14
    fulladder : fulladder1_comp
15
      port map(
16
        cin => c(i-1),
17
        cout => cout,
18
        a => summand1(i), 
19
        b => summand2(i),
20
        s => sum(i));
21
    end generate;   
22
  
23
    if (i /= 0) & (i /= 39) generate
24
    fulladder : fulladder1_comp
25
    port map(
26
      cin => c(i-1),
27
      cout => c(i),
28
      a => summand1(i), 
29
      b => summand2(i),
30
      s => sum(i));
31
    end generate;
32
  end generate generate_fulladders;

(Hast du bei dein einzelnen "end generate" Semikolons vergessen? Es geht 
zwar weder mit noch ohne, aber das würde mich auch interessieren)

von Fpgakuechle K. (Gast)


Lesenswert?

Robert B. schrieb:
> Bei mir funktioniert es leider nicht.
>
>
1
> generate_fulladders : for i in 0 to 39 generate
2
>   begin
3
>     --... schnipp
4
>     if (i /= 0) & (i /= 39) generate
5
>     fulladder : fulladder1_comp
6
>     port map(
7
>       cin => c(i-1),
8
>       cout => c(i),
9
>       a => summand1(i),
10
>       b => summand2(i),
11
>       s => sum(i));
12
>     end generate;
13
>   end generate generate_fulladders;
14
>
>
> (Hast du bei dein einzelnen "end generate" Semikolons vergessen? Es geht
> zwar weder mit noch ohne, aber das würde mich auch interessieren)



"(i /= 0) & (i /= 39)" scheint nach Murks aus weil & kein logisches UND 
ist.
Dann hat das äußere generate ein begin nicht aber die inneren - das ist 
auch ein indicator für Murks.

Bitte die fehlermeldungen mit ins posting aufnehmen.


MfG,

von Robert B. (rsb89)


Lesenswert?

Die Fehlermeldung war nur "Syntax error near 'if'". Ganz ehrlich! ;) Mit 
dem begin hast du natürlich recht, die habe ich jetzt raus genommen. Der 
Fehler war aber, dass die inneren generates keinen Bezeichner (?) 
hatten.

Damit geht's:
1
generate_first_adder : if i = 0 generate
2
                         ...

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.