Verhalten von "if" in Prozessen in VHDL

OP #4022915
Hallo,

ich muss mich aktuell in VHDL einarbeiten und da ich eher aus der C/C# 
Ecke komme, sind mir ein paar Dinge nicht ganz klar. Vorallem was nun 
parallel läuft, und was nicht
Genauer geht es hier aktuell um das Verhalten von zwei "if" in einem 
Prozess.

Kleines Codebeispiel:
1
process(clk)
2
variable VTest : std_logic := '0';
3
begin
4
        if(rising_edge(clk)) then 
5
          if (VTest = '1') then --if eins
6
             OutputSingal := NOT(OutputSingal);
7
          end if;
8
 
9
          if(InputSignal = '1') then --if zwei
10
             VTest := NOT(VTest);
11
          end if;
12
        end if;
13
end process;
ergibt jetzt erstmal kein Sinn, soll ja nur ein Bsp. sein.

Nun zur Frage: Kann ich davon ausgehen, dass das erste if (also das nach 
der Flankenabfrage) immer vor dem zweiten ausgeführt wird? Heißt, dass, 
sollte VTest in der zweiten if geändert werden, die Auswirkung sicherst 
beim nächsten Takt auswirkt? Oder wird beim synthetisieren das irgendwie 
doch parallel verpackt?

Falls von Bedeutung: Vivado 2014.4, Ziel ist das ZedBoard.
Gast
Nils Kurt schrieb:
> Nun zur Frage: Kann ich davon ausgehen, dass das erste if (also das nach
> der Flankenabfrage) immer vor dem zweiten ausgeführt wird? Heißt, dass,
> sollte VTest in der zweiten if geändert werden, die Auswirkung sicherst
> beim nächsten Takt auswirkt? Oder wird beim synthetisieren das irgendwie
> doch parallel verpackt?

Ja, in Deinem Beispiel trifft das zu. Die Synthese muss eigentlich das 
verhalten des Models natürlich nachbilden.

In einem process ist es so, dass der Block einmal durchlaufen wird für 
jede Änderung eines Signals aus der Sensitivitätsliste. Nach dem 
Durchlauf wartet der Prozess bis eine solche Änderung noch mal 
eintrifft.

Wenn Du von einem C#/C/C++ Hintergrund kommst ist m.E. wichtig den 
Unterschied zwischen Signale und Variabeln zu merken. Variabeln sind 
typischerweise Hilfszustände innerhalb eines Processes und werden sofort 
und in der angegebenen Reihenfolge ausgeführt.

Bei Signale dagegen wird der neue Zustand zuerst gemerkt und hier ist 
meistens die Reihenfolge innerhalb des Prozesses unerheblich. Signale 
dienen vor allem der Kommunikation zwischen processes bzw. zwischen 
processes und ports.

Als Beispiel für ein Shiftregister (oder so was ähnliches)
signal A0, A1, A2, B, C : std_logic;
 .....
process (clk)
begin
   if (rising_edge(clk)) then
          -- Reihenfolge der Zuweisungen wichtig
          -- weil dasselbe Zielsignal
       A0 <= B;
       A0 <= C;
          -- Reihenfolge der Zuweisungen unerheblich
          -- weil unterschiedliche Zielsignale
       A1 <= A0;
       A2 <= A1;
   end if;
end;

Hier ist nach dem Prozessdurchlauf
      A0 : den alten Wert von 'C'
      A1 : den alten Wert von 'A0'
      A2 : den alten Wert von 'A1'
Gast
Fangfrage:

Führen die Beschreibungen A und B zum gleichen Ergebnis?


Beschreibung A
1
process(clk)
2
variable VTest : std_logic := '0';
3
begin
4
        if(rising_edge(clk)) then 
5
          if (VTest = '1') then --if eins
6
             OutputSingal := NOT(OutputSingal);
7
          end if;
8
 
9
          if(InputSignal = '1') then --if zwei
10
             VTest := NOT(VTest);
11
          end if;
12
        end if;
13
end process;


Beschreibung B
1
process(clk)
2
variable VTest : std_logic := '0';
3
begin
4
        if(rising_edge(clk)) then 
5

6
          if(InputSignal = '1') then --if zwei
7
             VTest := NOT(VTest);
8
          end if;
9

10
          if (VTest = '1') then --if eins
11
             OutputSingal := NOT(OutputSingal);
12
          end if;
13
 
14
        end if;
15
end process;
OP
@cfgardiner

Danke

@lupi

Nein, angenommen VTEst = '0' und InputSignal = '1' (und war vorher '0')

Fall "oben"

Takt 1:
erste if -> false -> OutputSignal wird nicht beeinflusst.
zweites if -> true -> VTest wird zu '1'
Takt 2:
erstes if -> true -> erst jetzt wird das OutputSignal beinflusst

Fall "unten"

Takt 1:
erstes if -> true -> VTEst wird zu '1'
zweites if -> true -> OutputSignal wird jetzt schon beinflusst

Ich mein ja <= für Signale ;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.