mikrocontroller.net

Forum: FPGA, VHDL & Co. Spikes, Glitches


Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wolfram (joergwolfram)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.