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
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
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
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
>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.
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.