if-generate in process

#2000031
Lesenswert?

Tach auch,

wie ich mit Hilfe der SuFu herausgefunden habe, ist eine 
generate-Anweisung innerhalb eines "process" unzulässig. Die Frage ist 
nun, wie ich folgenden Code-Schnippsel umschreiben kann:
1
...
2
  confregs : process (clk)
3
  begin  -- process confregs
4
    if (clk = '1' and clk'event) then
5

6
      -- DCM Register 2x 16Bit fuer M/D bei Verwendung von Spartan6
7
      dcmregs_spartan6 : if use_spartan6 = 1 generate
8
        for i in 0 to 1 loop
9
          if confreg_en(i) = '1' then
10
            dcmreg(i) <= data_in(15 downto 0);
11
          else
12
            dcmreg(i) <= dcmreg(i);
13
          end if;
14
        end loop;  -- i
15
      end generate dcmregs_spartan6;
16
...

Zum Code:
Es handelt sich um Register, die nur dann erzeugt werden sollen, wenn 
der VHDL-Code auf einen Spartan6 abgebildet werden soll. Gesteuert wird 
dies durch das "use_spartan6"-generic (integer-Wert).

Gruß
Marten
#2000053
Lesenswert?

Ich habe jetzt folgendes versucht:
1
  dcmregs_spartan6 : if use_spartan6 = 1 generate
2
    dcmregs : process (clk)
3
    begin  -- process dcmregs
4
      for i in 0 to 1 loop
5
        if confreg_en(i) = '1' then
6
          dcmreg(i) <= data_in(15 downto 0);
7
        else
8
          dcmreg(i) <= dcmreg(i);
9
        end if;
10
      end loop;  -- i
11
    end process dcmregs;
12
  end generate dcmregs_spartan6;

Und schon meckert Modelsim nicht mehr :-)
Aber kann man das so machen ? Oder gibt es andere (bessere) 
Möglichkeiten?
Gast #2000134
Lesenswert?

Ja das generate muss außerhalb stehen, so wie dus schon gemacht hast.

Wenn ich dir noch folgenden Tip geben darf, da ich da selber mal 
hingefallen bin:

Verwende keine for-loop innerhalb einer for-generate, die Simulation ist 
dann totale Grütze. Ich gucke mal ob ich mein jüngstes Beispiel wieder 
finde, was mich einen Tag gekostet hat das Problem zu finden.
#2000145
Lesenswert?

Noch eine Möglichkeit: Einfach ein normales if statement:
1
dcmregs : process (clk)
2
 begin
3
  if use_spartan6 = 1 then
4
   for ... loop
5
   end loop;
6
  end if;
7
 end process;


Die Synthese optimiert das if dann natürlich entsprechend der 
Einstellung von use_spartan6 und entfernt die loop wenn es nicht gesetzt 
ist.
#2000148
Lesenswert?

Klaus Falser schrieb:
> wobei Du Dir angewöhnen solltest,if rising_edge(clk) then

Okay, werde ich in zukünftigen Projekten beachten, danke :-)

D. I. schrieb:
> Verwende keine for-loop innerhalb einer for-generate, die Simulation ist
> dann totale Grütze. Ich gucke mal ob ich mein jüngstes Beispiel wieder
> finde, was mich einen Tag gekostet hat das Problem zu finden.

Danke für den Tipp. Bei der verwendenten "if-generate"-Anweisung 
bereitet die for-loop aber keine Probleme, oder? Werde später mal 
schauen was die Simulation dazu sagt :-)
#2000429
Lesenswert?

So, habe das komplette Design simuliert und dabei festgestellt, dass 
alles so funktioniert wie es soll ;-)

Hier nochmal der korrigierte Code-Schnippsel aus meinem Gesamtdesign:
1
  dcmregs_spartan6 : if use_spartan6 = 1 generate
2
    dcmregs : process (clk)
3
    begin  -- process dcmregs
4
      if (clk = '1' and clk'event) then
5
        for i in 0 to 1 loop
6
          if confreg_en(i) = '1' then
7
            dcmreg(i) <= data_in(15 downto 0);
8
          else
9
            dcmreg(i) <= dcmreg(i);
10
          end if;
11
        end loop;  -- i
12
      end if;
13
    end process dcmregs;
14
  end generate dcmregs_spartan6;

Vielen Dank für eure Hilfe :-)

Gruß
Marten

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren