Forum: FPGA, VHDL & Co. Verhalten von "if" in Prozessen in VHDL


von Nils K. (nilsonneo4)


Lesenswert?

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.

: Bearbeitet durch User
von cfgardiner (Gast)


Lesenswert?

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'

von lupi (Gast)


Lesenswert?

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;

von lupi (Gast)


Lesenswert?

Ergänzung:

Wie weist man Signale zu?

so:

OutputSingal := NOT(OutputSingal);

oder so:

OutputSingal <= NOT(OutputSingal);

von Nils K. (nilsonneo4)


Lesenswert?

@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 ;)

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.