mikrocontroller.net

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


Autor: Marten V. (marten-v)
Datum:

Bewertung
0 lesenswert
nicht 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:
...
  confregs : process (clk)
  begin  -- process confregs
    if (clk = '1' and clk'event) then

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

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
Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfach 2x hinschreiben ist keine Option?

Autor: Marten V. (marten-v)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Marten V. (marten-v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt folgendes versucht:
  dcmregs_spartan6 : if use_spartan6 = 1 generate
    dcmregs : process (clk)
    begin  -- process dcmregs
      for i in 0 to 1 loop
        if confreg_en(i) = '1' then
          dcmreg(i) <= data_in(15 downto 0);
        else
          dcmreg(i) <= dcmreg(i);
        end if;
      end loop;  -- i
    end process dcmregs;
  end generate dcmregs_spartan6;

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

Autor: Klaus Falser (kfalser)
Datum:

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

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch eine Möglichkeit: Einfach ein normales if statement:
dcmregs : process (clk)
 begin
  if use_spartan6 = 1 then
   for ... loop
   end loop;
  end if;
 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.

Autor: Marten V. (marten-v)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Marten V. (marten-v)
Datum:

Bewertung
0 lesenswert
nicht 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:
  dcmregs_spartan6 : if use_spartan6 = 1 generate
    dcmregs : process (clk)
    begin  -- process dcmregs
      if (clk = '1' and clk'event) then
        for i in 0 to 1 loop
          if confreg_en(i) = '1' then
            dcmreg(i) <= data_in(15 downto 0);
          else
            dcmreg(i) <= dcmreg(i);
          end if;
        end loop;  -- i
      end if;
    end process dcmregs;
  end generate dcmregs_spartan6;

Vielen Dank für eure Hilfe :-)

Gruß
Marten

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.