Forum: FPGA, VHDL & Co. Doofe Frage: Signal vor dem Löschen abfragen?


von Jens Langecker (Gast)


Lesenswert?

Guten Morgen,

mir liegt ein VHDL-Code vor, in welchem viele dieser Konstrukte sind:
1
if (meinSignal = '1') then
2
  meinSignal <= '0';
3
end if;

Die Abfrage macht für mich gar keinen Sinn.
1
  meinSignal <= '0';
sollte doch genau das gleiche tun, oder täusche ich mich da?

von Falk B. (falk)


Lesenswert?

@Jens Langecker (Gast)

>mir liegt ein VHDL-Code vor, in welchem viele dieser Konstrukte sind:

>if (meinSignal = '1') then
>  meinSignal <= '0';
>end if;

Das ist nur eine Zuweiseung. Es kann an anderes Stellen im Prozess noch 
mehr Zuweisungen an die Variable geben, wo diese gesetzt wird.

>Die Abfrage macht für mich gar keinen Sinn.

>  meinSignal <= '0';

>sollte doch genau das gleiche tun, oder täusche ich mich da?

Du täuschst dich. Denn hier wird die Variable immer gelöscht. Im obigen 
Beispiel ist das nicht so, sondern nur, wenn sie vorher gesetzt war. 
Sowas nutzt man zur Speicherung von Informationen (Flags). Ein Prozess 
setzt das Signal auf 1, wenn er Daten bereitgestellt hat. Ein zweiter 
Prozess erkennt das und liest die Daten, gleichzeitig löscht er das 
Flag.

(Jaja, Signale kann man nur innerhalb eines Prozesses schreiben, aber 
das ist ein anderes Thema)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Falk Brunner schrieb:
> Zuweisungen an die Variable
Hmmm, da ist weit&breit keine zu sehen. Zum Glück...  ;-)
Denn sonst wäre der Sachverhalt ein ganz Anderer.

Jens Langecker schrieb:
> mir liegt ein VHDL-Code vor, in welchem viele dieser Konstrukte sind:
> if (meinSignal = '1') then
>   meinSignal <= '0';
> end if;
> Die Abfrage macht für mich gar keinen Sinn.
> meinSignal <= '0';
> sollte doch genau das gleiche tun, oder täusche ich mich da?
Du hast Recht.

Es kann aber noch ein andere Gedankengang dahinterstecken. Wenn es z.B. 
so aussieht
1
 if (meinSignal = '1') then
2
   meinSignal <= '0';
3
   meinAnderesSignal <= irgendwas;
4
 end if;
dann ist das einfach nur zum Verdeutlichen des Sachverhalts, dass 
meinSignal erst dann 0 wird, wenn meinAnderesSignal den Wert von 
irgendwas übernommen hat.
Natürlich wird der Synthesizer dabei die if-Abfrage für meinSignal 
herausoptimieren....

von Jens Langecker (Gast)


Lesenswert?

Danke.

Falk Brunner schrieb:
> > Du täuschst dich. Denn hier wird die Variable immer gelöscht. Im obigen
> Beispiel ist das nicht so, sondern nur, wenn sie vorher gesetzt war.
Es handelt sich um Signale und nicht um Variablen.
Es macht doch keinen Unterschied, ob ich ein Signal auf 0 setze, welches 
schon auf 0 steht.

Lothar Miller schrieb:
> Es kann aber noch ein andere Gedankengang dahinterstecken.
Definitiv nicht.
Es sind wirklich immer diese 3-Zeiler,
1
if (meinSignal = '1') then
2
  meinSignal <= '0';
3
end if;
ohne sonst etwas dabei.

von Schlumpf (Gast)


Lesenswert?

Jens Langecker schrieb:
> Es sind wirklich immer diese 3-Zeiler [...] ohne sonst etwas dabei.

... Dann ist es auch wirklich sinnlos und du hast Recht mit deiner 
Annahme, dass es durch ein einfaches

meinSignal <= '0';

ersetzbar wäre.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jens Langecker schrieb:
> Es sind wirklich immer diese 3-Zeiler, ohne sonst etwas dabei.
Ab hier würde ich mir Sorgen um das restliche Design machen...

von Cihan K. (lazoboy61)


Lesenswert?

Jens Langecker schrieb:
> Lothar Miller schrieb:
>> Es kann aber noch ein andere Gedankengang dahinterstecken.
> Definitiv nicht.
> Es sind wirklich immer diese 3-Zeiler,if (meinSignal = '1') then
>   meinSignal <= '0';
> end if;
> ohne sonst etwas dabei.

Kann es vielleicht sein, dass meinSignal wo anders nochmal abgefragt 
wird oder solange er auf High ist irgendein Modul aktiviert ist? 
Vielleicht reagiert sogar irgendein Modul auf die pos. oder neg. Flanke 
vom meinSignal.

Poste mal zur Not mehr Quell-Code, denn so kann man schwer eine Aussage 
treffen.

Cihan

von Karl Könner (Gast)


Lesenswert?

Jens Langecker schrieb:
> mir liegt ein VHDL-Code vor, in welchem viele dieser Konstrukte sind:if 
(meinSignal = '1') then
>   meinSignal <= '0';
> end if;
>
> Die Abfrage macht für mich gar keinen Sinn.  meinSignal <= '0';
> sollte doch genau das gleiche tun, oder täusche ich mich da?

Du täuscht Dich, es mag vielleicht das selbe tun, ist es aber nicht.
Abhängig von dem drumherum (ich nehme an getakteter process)
beschreibt der Dreizeiler den invertierten RESET Eingang eines FF; der 
Einzeiler dagegen einen auf '0' geklemmten D eingang eines D-FF.

Die unterschiedliche Beschreibung kann zu unterschiedliche großen 
Designs führen. siehe 
http://www.xilinx.com/support/documentation/white_papers/wp275.pdf Bild 
6 und 8.

Ein FF kann auf verschiedene Weisen gelöscht werden, selbes funktionales 
Ergebnis (Verhalten) unterschiedliche Resourcennutzung (LUT, Routing).
VHDL ist eben eine Hardwarebschreibungssprache und kein 
Programmiersprache.

MfG,

von Jens Langecker (Gast)


Lesenswert?

Hier mal ein vereinfachter Ausschnitt aus dem Programm:
1
process (CLK )
2
begin
3
  if (rising_edge(CLK))then
4
    if (Active = '0') then
5
      if (Go = '1' and Enable = '1') then
6
        Active <= '1';
7
        -- Aktion beginnen
8
        (...)
9
      end if;
10
    else
11
      -- Go kann gelöscht werden, da jetzt Active gesetzt ist
12
      if (Go = '1') then
13
        Go <= '0';  
14
      end if;
15
    end if;
16
    (...)
17
    if (...) then
18
        -- Aktion ist jetzt abgeschlossen
19
        Active <= '0';
20
    end if; 
21
    (...) 
22
  end if;
23
end process;

Es geht um das Signal "Go" und die Zeilen
1
      -- Go kann gelöscht werden, da jetzt Active gesetzt ist
2
      if (Go = '1') then
3
        Go <= '0';  
4
      end if;
5
end process;

von Lattice User (Gast)


Lesenswert?

Jens Langecker schrieb:
> Hier mal ein vereinfachter Ausschnitt aus dem Programm:

Zu stark vereinfacht, GO wird in den geposteten Zeilen nirgends gesetzt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Karl Könner schrieb:
> Die unterschiedliche Beschreibung kann zu unterschiedliche großen
> Designs führen.
Es kann sogar die exakt gleiche Beschreibung und nur die Reihenfolge
der Zuweisung zu einem anderen Ergebnis führen:
http://www.lothar-miller.de/s9y/archives/52-Kompakte-Flankenerkennung.html

von Lattice User (Gast)


Lesenswert?

Smuliere einfach mal:
1
  process (clk)
2
  begin
3
    if(clk = '1') and clk'event then
4
      GO <= '1';
5
      if( GO = '1' ) then
6
        GO <= '0';
7
      end if;      
8
    end if;
9
  end process;

versus die Variante ohne das "überflüssige" if
1
  process (clk)
2
  begin
3
    if(clk = '1') and clk'event then
4
      GO <= '1';
5
      GO <= '0';
6
    end if;
7
  end process;

von Cihan K. (lazoboy61)


Lesenswert?

Lattice User schrieb:
> Smuliere einfach mal:
>
>
1
>   process (clk)
2
>   begin
3
>     if(clk = '1') and clk'event then
4
>       GO <= '1';
5
>       if( GO = '1' ) then
6
>         GO <= '0';
7
>       end if;
8
>     end if;
9
>   end process;
10
>
>
> versus die Variante ohne das "überflüssige" if
>
>
1
>   process (clk)
2
>   begin
3
>     if(clk = '1') and clk'event then
4
>       GO <= '1';
5
>       GO <= '0';
6
>     end if;
7
>   end process;
8
>

In dem ersten Fall wird Go auf HIGH gesetzt und erst wieder LOW gesetzt, 
wenn es im nächsten Takt auf HIGH ist.

Im zweitem Fall bleibt GO immer auf LOW, da GO <= '0'; als letzte 
Zuweisung in einem Process zugewiesen wird.

Cihan

von Jens Langecker (Gast)


Lesenswert?

Lattice User schrieb:
> Zu stark vereinfacht, GO wird in den geposteten Zeilen nirgends gesetzt.

Ups! Doof.
Egal, meine Frage ist beantwortet.
Danke euch allen!

von Georg A. (georga)


Lesenswert?

Evtl. hat das auch was mit der Simulation zu tun. Da gibts ja neben 0 
und 1 noch mehr Werte...

von Karl (Gast)


Lesenswert?

Lothar Miller schrieb:
> Es kann aber noch ein andere Gedankengang dahinterstecken. Wenn es z.B.
> so aussieht if (meinSignal = '1') then
>    meinSignal <= '0';
>    meinAnderesSignal <= irgendwas;
>  end if;
> dann ist das einfach nur zum Verdeutlichen des Sachverhalts, dass
> meinSignal erst dann 0 wird, wenn meinAnderesSignal den Wert von
> irgendwas übernommen hat.
> Natürlich wird der Synthesizer dabei die if-Abfrage für meinSignal
> herausoptimieren....

Hm nicht ganz ... eher umgekehrt, meinAndresSignal wird erst dann 
aktualisiert, wenn (irgendwo mal) meinSignal auf 1 gesetzt wurde ... und 
dann wird das if auch nicht wegoptimiert, das gilt dann für 
meinAnderesSignal (und meinSignal ist ne Art Semaphore dazu ...)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Karl schrieb:
> dann wird das if auch nicht wegoptimiert, das gilt dann für
> meinAnderesSignal
Ich meinte das selbe:
>> Natürlich wird der Synthesizer dabei die if-Abfrage für meinSignal
>> herausoptimieren...
Klar darf die Abhängigkeit zwischen meinSignal und meinAnderesSignal 
nicht wegoptimiert werden. Nur der Selbstbezug von meinSignal kann 
evtl. herausoptimiert werden.

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.