Doofe Frage: Signal vor dem Löschen abfragen?

Gast #3114740
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?
#3114752
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)
Moderator (Firma: Titel) Persönliche Seite #3114808
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....
Gast #3114834
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.
#3114882
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
Gast #3114890
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,
Gast #3114917
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;
Moderator (Firma: Titel) Persönliche Seite #3114995
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
Gast #3115019
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;
#3115021
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
Gast #3116039
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 ...)
Moderator (Firma: Titel) Persönliche Seite #3116132
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren