Forum: FPGA, VHDL & Co. Darf man std_logic_vectoren ungetaktet vergleichen?


von Dosmo (Gast)


Lesenswert?

Hallo,

mal eine grundsätzliche Verständnisfrage:

Darf ich einen std_logic_vector, der getaktet beschrieben wird, 
ungetaktet vergleichen, ohne Gefahr zu laufen, ein metastabiles 
Vergleichsergebnis zu bekommen?

Beispiel:
1
signal  counter :   std_logic_vector(15 downto 0) := x"0000";
2
3
proc_add : process (CLK)
4
begin
5
  if (rising_edge(CLK)) then
6
    counter <= counter + 1;
7
  end if;
8
end process;
9
10
proc_compare : process (counter)
11
begin
12
  if (counter = x"1234") then
13
           match <= '1';
14
  else
15
           match <= '0';
16
  end if;
17
end process;

Können da Laufzeitunterschiede der einzelnen Bits vom getakteten 
"proc_add" zum ungetakteten "proc_compare" auftreten?

PS: Es geht darum, einen bestehenden Code zu bewerten. Die Frage "warum 
ist das überhaupt so" steht leider nicht zur Debatte :/

von Christian R. (supachris)


Lesenswert?

Klar geht das. Das macht nur bei hohen Frequenzen eventuell Probleme, 
aber nicht weil die Bits verschieden schnell sind (Ist ja ein Binär 
Zähler), sondern weil eventuell der Vergleich so viele Logik-Ebenen hat, 
dass die Durchlaufzeit länger ist als die Periodendauer deines Taktes.
Wie hoch ist denn die Frequenz und welcher FPGA?

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


Lesenswert?

Christian R. schrieb:
> Das macht nur bei hohen Frequenzen eventuell Probleme
Das Signal match wird unabhängig von der Frequenz Glitches 
aufweisen.

Wenn dieses Signal daher (evtl. sogar extern) asynchron weiterverwendet 
wird, kann es Probleme geben. Wenn es synchron weiterverwendet wird, 
dann hat die Toolchain das soweit im Griff (bei angegebenem 
Takt-constraint).


Eine kleine Anmerkung:
> signal  counter :   std_logic_vector(15 downto 0) := x"0000";
> counter <= counter + 1;
Mit uneingeschränkten Vektoren rechnet man nicht. Dafür nimmt man besser 
signed und unsigned Vektoren oder gleich passende Integer:
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

von Christian R. (supachris)


Lesenswert?

Dass das Signal dann synchron weiter verwendet wird, hab ich erst mal 
angenommen. Alles andere wäre Bastelmurks.

von Dosmo (Gast)


Lesenswert?

Okay, danke.

von JBB (Gast)


Lesenswert?

Die gesamte Fragestellung ist eigentlich irrelevant, da die Synthese eh 
umsetzt, was sie will. Welche LUTs dann mit welchen verglichen werden 
ist nicht zu kontrollieren und Zufallsergebnis, weil Schaltungsteile mit 
anderen zusammengefasst werden.

Man muss einfach davon ausgehen, dass zum Zeitpunkt der synchronen 
Verwendung eines Ergebnisses, der Wert stabil ist und darauf achtet die 
Synthese ja auch.

Das bedeutet allerdings, dass sich bei der "Verrechung" von 
kombinatorischen Ausgängen statt von FFs, der Pfad verlängert und die 
mögliche Taktfrequenz sinkt, wenn dieser Pfad damit zum Längsten wird.

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


Lesenswert?

Dosmo schrieb:
> ein metastabiles Vergleichsergebnis zu bekommen?
Der Mythos Metastabilität ist innerhalb eines FPGAs sowieso nicht 
vorhanden. Denn Metastabilität bedeutet ja, dass bereits die tsu/th 
irgendeines Flipflops verletzt wurde. Wenn das in einem FPGA passiert, 
dann wurde mit falschen Zeiten gerechnet, oder das Design hinterher 
übertaktet...


Dosmo schrieb:
>>>> Darf ich einen std_logic_vector, der getaktet beschrieben wird,
>>>> ungetaktet vergleichen
JBB schrieb:
> Die gesamte Fragestellung ist eigentlich irrelevant, da die Synthese eh
> umsetzt, was sie will.
Und insbesondere deshalb, weil Vergleicher eben Kombinatorik sind, und 
daher zwingend jeder Vergleich kombinatorisch sein wird. Auch einer, 
der in einer getakteten VHDL-Beschreibung steht.
Der Vergleicher vom OP wird genau der selbe sein wie dieser hier:
1
signal  counter :   std_logic_vector(15 downto 0) := x"0000";
2
3
proc_add : process (CLK)
4
begin
5
  if (rising_edge(CLK)) then
6
    counter <= counter + 1;
7
    if (counter = x"1234") then
8
           match <= '1';
9
    else
10
           match <= '0';
11
    end if;
12
  end if;
13
end process;
Nur wird hier match hinterher erst mal auf ein Flipflop gehen, und so 
mit einem Takt Latency behaftet sein.

von Matthias (Gast)


Lesenswert?

Lothar Miller schrieb:
> Der Mythos Metastabilität ist innerhalb eines FPGAs sowieso nicht
> vorhanden. Denn Metastabilität bedeutet ja, dass bereits die tsu/th
> irgendeines Flipflops verletzt wurde. Wenn das in einem FPGA passiert,
> dann wurde mit falschen Zeiten gerechnet, oder das Design hinterher
> übertaktet...

Ich hab mehrere Clock Domains im FPGA und nicht an allen Stellen wird 
eine klassische Block RAM basierte Dual-Clock FIFO verwendet, sondern 
teilweise auch handcodiertes Übergeben von Werten mittels Handshake. Da 
muss ich dann dem Tool mitteilen, dass es sich um einen falschen Pfad 
handelt und wenn da die Constraints falsch gesetzt sind oder im Code 
irgendwas übersehen wurde, kann das Tool das ja nicht mehr abfangen.

Ein anderer Fall wo ich definitiv Metastabilität gesehen habe war der 
Übergang zwischen zwei Clock Domains wo die eine von der anderen mittels 
PLL abgeleitet war. Ich konnte das Problem bis zu einem FF verfolgen, 
das als Eingang in die FSM diente. Witzigerweise war das Problem 
behoben, als ich eine DLL statt einer PLL verwendete.

Habs eh damals hier ein wenig beschrieben.

von Dosmo (Gast)


Lesenswert?

Lothar Miller schrieb:
>> Die gesamte Fragestellung ist eigentlich irrelevant, da die Synthese eh
>> umsetzt, was sie will.
>Und insbesondere deshalb, weil Vergleicher eben Kombinatorik sind, und
>daher zwingend jeder Vergleich kombinatorisch sein wird. Auch einer,
>der in einer getakteten VHDL-Beschreibung steht.
>Der Vergleicher vom OP wird genau der selbe sein wie dieser hier:signal
1
counter :   std_logic_vector(15 downto 0) := x"0000";
2
proc_add : process (CLK)
3
begin
4
  if (rising_edge(CLK)) then
5
    counter <= counter + 1;
6
    if (counter = x"1234") then
7
           match <= '1';
8
    else
9
           match <= '0';
10
    end if;
11
  end if;
12
end process;
>Nur wird hier match hinterher erst mal auf ein Flipflop gehen, und so
>mit einem Takt Latency behaftet sein.

Aber wenn ich Dich richtig verstehe, würde dieser Code keine Glichtes 
auf "match" aufweisen, richtig?

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


Lesenswert?

Dosmo schrieb:
> würde dieser Code keine Glichtes auf "match" aufweisen, richtig?
Nein. Er würde es nicht nur, sondern er kann es gar nicht, denn 
match ist ein Flipflop-Ausgang.

von Dosmo (Gast)


Lesenswert?

JBB:
>Man muss einfach davon ausgehen, dass zum Zeitpunkt der synchronen
>Verwendung eines Ergebnisses, der Wert stabil ist und darauf achtet die
>Synthese ja auch.

Ich glaub, jetzt versteh ich es:
Kombinatorische Logik hat gar keinen Takt, sondern der Ausgang folgt 
einfach den Eingängen (mit einer gewissen Laufzeit).
Das ist aber unkritisch, solange die Eingänge getaktet sind und der 
Ausgang auch wieder getaktet gelesen wird, weil die Synthese dann 
sicherstellen kann, daß der Ausgang der Kombinatorik korrekt und stabil 
ist, wenn der nächste Takt kommt.

von Klaus (Gast)


Lesenswert?

Dosmo schrieb:
> Ich glaub, jetzt versteh ich es:
> Kombinatorische Logik hat gar keinen Takt, sondern der Ausgang folgt
> einfach den Eingängen (mit einer gewissen Laufzeit).
> Das ist aber unkritisch, solange die Eingänge getaktet sind und der
> Ausgang auch wieder getaktet gelesen wird, weil die Synthese dann
> sicherstellen kann, daß der Ausgang der Kombinatorik korrekt und stabil
> ist, wenn der nächste Takt kommt.

Absolut korrekt :)

von Sven P. (Gast)


Lesenswert?

Dosmo schrieb:
> JBB:
>>Man muss einfach davon ausgehen, dass zum Zeitpunkt der synchronen
>>Verwendung eines Ergebnisses, der Wert stabil ist und darauf achtet die
>>Synthese ja auch.
>
> Ich glaub, jetzt versteh ich es:
> Kombinatorische Logik hat gar keinen Takt, sondern der Ausgang folgt
> einfach den Eingängen (mit einer gewissen Laufzeit).
> Das ist aber unkritisch, solange die Eingänge getaktet sind und der
> Ausgang auch wieder getaktet gelesen wird, weil die Synthese dann
> sicherstellen kann, daß der Ausgang der Kombinatorik korrekt und stabil
> ist, wenn der nächste Takt kommt.
So läufts. Du synthetisierst echte Hardware, also denk doch einfach 
daran, wie du ein paar UND-Gatter an die Flipflops klemmst. Da hast du 
dann deinen kombinatorischen Term.

Und da hast du auch gleich deine Glitches: Die treten da nämlich exakt 
genauso auf, wie sie anno dunnemal auftraten, wenn man im KV-Diagramm zu 
viel optimierte und versehentlich Struktur- und/oder Funktionshazards 
einbaute.

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.