Forum: FPGA, VHDL & Co. Signal per Taktflanken setten/resetten


von Thaddäus (Gast)


Lesenswert?

Moins.
Ich hab ein Signal, welches durch einen Taster auf high gesetzt werden 
soll, um direkt danach, zur steigenden Taktflanke, verwertet zu werden, 
und wieder low gesetzt zu werden. Setzen und Löschen jeweils bei 
steigender Taktflanke. Damit soll eine art Lauflicht (Details spielen 
hier keine Rolle) einen Schritt weiter laufen, aber eben nur EINEN 
Schritt pro Tastendruck, und nicht 100, nur weil der Taster 100 Takte 
lang gedrückt ist. Ich brauch quasi die Funktionalität eines 
SET/RESET-FlipFlops, welches aber nur auf Flanken reagiert. Kann mir 
jemand einen Anstoss geben?
Mfg

von Thaddäus (Gast)


Lesenswert?

Scheint sich erledigt zu haben. Hab einfach zwei beide Flanken in einem 
Prozess abgefragt. Ich dachte zwar, sowas wär nicht gut, aber da weder 
Simulation noch Synthese gemuckt haben... na mal sehen.

von Thaddäus (Gast)


Lesenswert?

OK, das ganze ist also doch ein Problem. ISE Meckert über das hier

  process(set, reset)
  begin
  if(rising_edge(reset))then
    out_int <= '0' after 5 ns;
  end if;
  if(rising_edge(set))then
    out_int <= '1' after 5 ns;
  end if;
  end process;

Wie krieg ich das in synthesefähig hin?

Mfg, T.

von Clemens M. (panko)


Lesenswert?

Nach meinem Kenntnisstand ist after nicht synthesefähig. Da müsste man 
wohl eine Art delay zu Fuß machen. Das ist aber durch fehlenden 
Sytemtakt natürlich nicht möglich irgendwie.

edit: Kannst du da nicht einen Takt anschließen? Dann könnte man ja 
einen Zähler starten wenn die Flanke kommt (die wenn ich Herrn Miller 
richtig verstanden habe ohnehin besser durch ein Schieberegister sollte 
und dann als "0001" dieses Vektors erkannt würde) und nach dessen Ablauf 
( 5 ns ) eben das Ausgangssignal erst setzen.)

Wobei ich gestehen muss, daß 5 ns natürlich auch mal ECHT fix ist für 
einen Zähler ;-)) Ich glaube das ist nciht praktikabel. Ein RC Glied 
scheint mir aber heutzutage nicht mehr Stand der Technik zu sein. Bei 
diskreter Logic hätt ich einfach ein delay Glied vor einen Buffer 
gemacht.

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


Lesenswert?

Thaddäus schrieb:
> OK, das ganze ist also doch ein Problem. ISE Meckert über das hier
1
 
2
   process(set, reset)
3
   begin
4
   if(rising_edge(reset))then
5
     out_int <= '0' after 5 ns;
6
   end if;
7
   if(rising_edge(set))then
8
     out_int <= '1' after 5 ns;
9
   end if;
10
   end process;
Nachdem deine VHDL-Beschreibung ja letzlich in reale Hardware umgesetzt 
werden soll, kannst du nur Bauelemente verwenden, die es auf FPGAs/CPLDs 
gibt. Ein solches Bauteil wie du es beschreibst (mit 2 Takteingängen) 
ist dort nicht vorhanden. Du mußt deine Denkweise mehr in Richtung 
Hardware überarbeiten...

> Damit soll eine art Lauflicht (Details spielen hier keine Rolle)
> einen Schritt weiter laufen, aber eben nur EINEN Schritt pro
> Tastendruck, und nicht 100, nur weil der Taster 100 Takte
> lang gedrückt ist. Ich brauch quasi die Funktionalität eines
> SET/RESET-FlipFlops, welches aber nur auf Flanken reagiert.
Du brauchst eine Flankenerkennung.

> Kann mir jemand einen Anstoss geben?
Flankenerkennung:
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung
Lauflicht:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
Ergibt zusammen:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity Lauflicht is
6
    Port ( clk : in  STD_LOGIC;
7
           button : in std_logic;
8
           leds : out  STD_LOGIC_VECTOR (7 downto 0));
9
end Lauflicht;
10
11
architecture Behavioral of Lauflicht is
12
  signal buttonsr : std_logic_vector (2 downto 0) := "000";
13
  signal rise : std_logic;
14
  signal sr : std_logic_vector (7 downto 0) := "10000000";
15
16
begin
17
   process begin  -- Einsynchronisieren und Flankenerkennung
18
      wait until rising_edge(clk);
19
      buttonsr <= buttonsr(1 downto 0) & button;
20
   end process;
21
   rise <= '1' when buttonsr(2)='0' and buttonsr(1)='1' else '0';
22
23
   process begin  -- das Lauflicht
24
      wait until rising_edge(clk);
25
      if (rise='1') then   -- steigende Flanke
26
         if (sr="00000001") then
27
            sr <= "10000000";
28
         else
29
            sr <= '0' & sr(7 downto 1);
30
         end if;
31
      end if;
32
   end process;
33
34
   leds <= sr;
35
  
36
end Behavioral;


Ein paar Tipps für Anfänger:
Es gibt nur 1 Takt im Design.
Es wird nur 1 Flanke dieses Takts abgefragt (rising oder falling).
Es gibt keinen (und schon gar keinen asynchronen) Reset.
Es wird jedes asynchrone Signal mit 2 FFs einsynchronisiert.
Ausnahmen von den genannten Regeln sind nur mit fundierter Begründung 
möglich.

von Steffen Hausinger (Gast)


Lesenswert?

Hallo Lothar

Lothar Miller schrieb:
> Es wird jedes asynchrone Signal mit 2 FFs einsynchronisiert.

Warum genügt denn nicht 1 FF?
1
if rising_edge(CLK) then
2
    mysig_sync <= mysig_aync;
3
end if;

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


Lesenswert?

Steffen Hausinger schrieb:
> Warum genügt denn nicht 1 FF?
Es ist eine Frage von Wahrscheinlichkeiten.
Als Stichwort für die weitere Suche: Metastabilität.

von Steffen Hausinger (Gast)


Lesenswert?

Dann ist die Wahrscheinlichkeit für Metastabilität bei

...f_signal << f_sample und
...kurzem t_rise/t_fall

also geringer und man könnte auch mit einem FF auskommen, ja? Ist das 
überhaupt wirklich ein reales Problem (= hatte das schonmal jemand?) 
oder eher akademischer Natur?

von Christian R. (supachris)


Lesenswert?

Steffen Hausinger schrieb:
> Ist das überhaupt wirklich ein reales Problem (= hatte das schonmal jemand?) 
oder eher akademischer Natur?

Leider viel öfter als man denkt. Und vor allem blöd zu finden, da das 
meistens sporadisch auftritt.

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


Lesenswert?

Ob sich Metastabilität wirklich auswirkt, hängt vorrangig von der im 
FPGA verwendeten Taktfrequenz ab. Die heutigen FFs stabilisieren sich so 
schnell auf einen definierten Pegel, dass die tsu des nachfolgenden FF 
bei Taktfrequenzen <200MHz nicht verletzt wird.

Christian R. schrieb:
> Leider viel öfter als man denkt. Und vor allem blöd zu finden, da das
> meistens sporadisch auftritt.
Ich würde sagen: weit seltener als man meint.
Oft wird ein Fehler der Metastabilität zugeschrieben, der einfach nur 
einem fehlerhaften Design zuzuschreiben ist...  :-/
http://www.lothar-miller.de/s9y/archives/62-Testaufbau-Metastabilitaet.html

von Xenu (Gast)


Lesenswert?

Das Metastabilitätsgespenst geht wieder um.

Das Problem ist nicht Metastabilität, sondern daß ein von außen 
kommendes, asynchrones Signal an mehrere Flip-Flops angeschlossen
wird - und das geht garantiert in die Hose. Weil es dann passieren kann,
daß bei einer Taktflanke, bei der sich auch gleichzeitig das Signal 
ändert, ein Flip-Flop eine 1 speichert, und ein anderes eine 0. Eine 
schizophrenes Design sozusagen.

Lösung: Externe Signale immer zuerst in ein Flip-Flop eintakten und 
mit diesem (Flip-Flop-Ausgangs)Signal weiterarbeiten.

Darüber hat auch schon Peter Alfke (bis vor kurzem Chefdesigner bei 
Xilinx) mal einen schönes Posting auf comp.arch.fpga geschrieben:

http://groups.google.com/group/comp.arch.fpga/browse_frm/thread/c6594798db796f15/98687de342676d58

von Christian R. (supachris)


Lesenswert?

Lothar Miller schrieb:

> Ich würde sagen: weit seltener als man meint.
> Oft wird ein Fehler der Metastabilität zugeschrieben, der einfach nur
> einem fehlerhaften Design zuzuschreiben ist...  :-/

Ja das stimmt. Das "öfer als einem lieb ist" bezog sich eher auf blöde 
Effekte, wenn ein asynchrones Signal nicht richtig einsynchronisiert 
wurde. Hätte ich müssen dazuschreiben....

von Thaddäus (Gast)


Lesenswert?

Perfekt, genau was ich gesucht habe. Bin einfach dem Vorschlag von 
Lothar Miller gefolgt, funktioniert prima.

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.