Forum: FPGA, VHDL & Co. Spikes, Glitches


von Volker (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei mich in VHDL einzuarbeiten. Habe hier im Forum 
schon viel gelesen, vor allem, wie wichtig es ist, ein Design synchron 
aufzubauen.
Nun aber hierzu eine spezielle Frage.

Ich habe mir einen getakteten Zähler realisiert, den ich kombinatorisch, 
also außerhalb des Prozesses auf einen Wert abfrage.

ENTITY pulse_state IS
  PORT(
    reset, clk, start : IN  std_logic;
    q                 : OUT std_logic ;

    q1                : OUT std_logic);


END pulse_state;

ARCHITECTURE Behavioral OF pulse_state IS

  Signal counter: std_logic_vector(3 downto 0);

BEGIN
  PROCESS(reset, clk)

  BEGIN
    IF (reset = '1') THEN
       counter<="0000";


    ELSIF (rising_edge(clk)) THEN

          counter<=counter+1;
    END IF;
  END PROCESS;

q <= '1' when counter = "0011" else '0';


END Behavioral;

Die Abfrage und damit auch der Ausgang q wird ja zu jeder Zeit, also 
taktunabhängig gesetzt, nun zu meiner Frage:
Ist es möglich, dass die 4 FFs des Counters unterschiedlich schnell 
schalten und somit kurze fehlerhafte Zustände am Vergleicher mit 3 
auftauchen, die dann kurze Spikes am Ausgang zur Folge hätten.

Natürlich kann ich die Abfrage auch innerhalb des Prozesses machen, aber 
dann habe ich immer eine Verzögerung um einen Takt.

Vielen Dank im voraus

Volker

von Gast (Gast)


Lesenswert?

Zur Frage:
Ja das wird sicher so sein. Synchrones Design garantiert dir nur, dass 
alle Signale bis zur nächsten Clk-Flanke stabil sind (wenn du die 
maximale Taktfrequenz nicht überschreitest)

Und zu dem Problem mit einem Takt Verzögerung:

Verwende statt signal eine variable im Prozess. Die wird sofort 
aktualisiert:

process(clk,reset)
  variable counter : std_logic_vector(3 downto 0);
begin
BEGIN
    IF (reset = '1') THEN
       counter:=(others=>'0');
    ELSIF (rising_edge(clk)) THEN
        counter:=counter+1;
        if counter="0011" then
             q<='1';
        else
             q<='0';
        end if;
    END IF;
END PROCESS;

Eine weitere Verbesserung wäre unsigned statt std_logic_vector zu 
verwenden. Unsigned besteht auch nur aus std_logic, aber arithmetische 
Operationen sind einfacher damit.

Mfg
Gast

von Joerg W. (joergwolfram)


Lesenswert?

Um die Verzögerung um einen Takt kommst Du nicht herum, wenn Du ein 
synchrones Design erzeugen willst, was auch synthetisierbar ist. Das hat 
weniger mit VHDL als mit Physik zu tun. Aber Du kannst ja mit n-1 statt 
mit n vergleichen, damit lässt sich das Problem zumindest in manchen 
Fällen lösen.

Gruß Jörg

von Volker (Gast)


Lesenswert?

Danke,

ich hab die Version von Gast gerade mal durch die Synthese gejagt, es 
geht.
Hab dann mal bei "View RTL Schematic" nachgesehen, wie das aussieht:

Es wurde hinter den Teiler eine "Kombi" gesetzt, die am Ausgang immer 
den Inhalt des (Counters+1) anliegen hat.
Somit entfällt wirklich die Verzögerung um einen Takt.

So wie Jörg es vorgeschlagen hat geht das natürlich auch.

Allerdings frage ich mich immer wieder, wie frühere Schaltungen aus 
74XX-
Gräbern funktioniert haben, da wurde auch oftmals direkt hinter Zählern 
nur kombinatorisch abgefragt.

Gruß Volker

von Xenu (Gast)


Lesenswert?

>Allerdings frage ich mich immer wieder, wie frühere Schaltungen aus
>74XX- Gräbern funktioniert haben, da wurde auch oftmals direkt hinter Zählern nur 
kombinatorisch abgefragt.

Die funktionieren genauso. Da entstehen ganz genauso Glitches.

von Falk (Gast)


Lesenswert?

@ Xenu

>>Allerdings frage ich mich immer wieder, wie frühere Schaltungen aus
>>74XX- Gräbern funktioniert haben, da wurde auch oftmals direkt hinter >Zählern 
nur kombinatorisch abgefragt.

>Die funktionieren genauso. Da entstehen ganz genauso Glitches.

Glitchfrei vergleichen geht kombinatorisch nur mit Gray-Codes.

MFG
Falk


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.