Forum: FPGA, VHDL & Co. if-generate in process


von Marten V. (marten-v)


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

: Verschoben durch User
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

einfach 2x hinschreiben ist keine Option?

von Marten V. (marten-v)


Lesenswert?

Du meinst 2 Prozesse, wobei der eine Process nur abhängig vom 
if-generate erzeugt wird ? Geht das, bin noch VHDL-Frischling musst du 
wissen :-)

von Marten V. (marten-v)


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?

von Klaus F. (kfalser)


Lesenswert?

Du hast aber das
1
if (clk = '1' and clk'event) then
vergessen, wobei Du Dir angewöhnen solltest,
1
if rising_edge(clk) then
zu verwenden.

von D. I. (Gast)


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.

von Jan M. (mueschel)


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.

von Marten V. (marten-v)


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 :-)

von Marten V. (marten-v)


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

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.