Forum: FPGA, VHDL & Co. Flankenerkennung von positiver & negativer Flanke


von Fellap (Gast)


Lesenswert?

Hallo,

ich wuerde gerne auf die positive und negative Flanke eines 
Eingangssignals reagieren...

Nun habe ich hier einen Code von Lothar Millers Seite, welchen ich nur 
etwas abgeaendert...

Habe mal 2 Varianten gepostet:

Variante 1:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity FSM_AsyncInp is
6
    Port ( clk  : in  STD_LOGIC;
7
           inp  : in  STD_LOGIC;
8
           outp : out STD_LOGIC_VECTOR (1 downto 0));
9
end FSM_AsyncInp;
10
11
architecture Behavioral of FSM_AsyncInp is
12
signal state : std_logic_vector (1 downto 0) := "00";
13
begin
14
   process begin
15
      wait until rising_edge(clk);
16
      case (state) is 
17
         when "00" => if (inp='0') then state<="01"; end if;
18
      -- when "01" => if (inp='1') then state<="10"; end if;
19
         when "01" => if ((inp'event and inp = '0') or (inp'event and inp = '1'))  then state<="10"; end if; --ist das moeglich?
20
         when "10" => state<="00";
21
      end case;      
22
   end process;
23
   outp <= state;
24
end Behavioral;

Wie auf Lothar Millres Site 
(http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren) kann 
es hier nun ja zu dem Zustand "11" gelangen drum dachte ich mir, vll ist 
Variante 2 besser???

Variante 2
1
  process (BTN0,clk)
2
  begin
3
  if clk'event and clk = '1' then
4
    case (state_button) is
5
    when "00" => if (BTN0 = '0') then state_button <= "01"; end if;
6
    when "01" => if BTN0'event and BTN0 = '1' then state_button <= "11"; else state_button <= "10";  end if;
7
    when "10" => if BTN0'event and BTN0 = '0' then state_button <= "11"; else state button <= "00"; end if;    
8
     when "11" => state_button <="00"; save_cnt <= select_cntMSECs10;
9
      when others => Null;
10
    end case;
11
  end if;
12
  end process;

Vielen Gruesse,

Fellap

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


Lesenswert?

> Nun habe ich hier einen Code von Lothar Millers Seite, welchen ich
> nur etwas abgeaendert...
Allerdings komplett ohne jeglichen Plan...   :-o

> Habe mal 2 Varianten gepostet:
Du kannst beide Varianten in die Tonne hauen. Sie werden beide nicht in 
Hardware umsetzbar sein.
Wie wird in VHDL ein Takt beschrieben? Richtig: mit 'event. Blöderweise 
ist aber in der Funktion rising_edge() schon ein 'event drin und so 
beschreibst du hier ein "Triple-Clock-Flipflop":
1
      wait until rising_edge(clk);   -- !!! DER ALLEREINZIGSTE TAKT !!!
2
      case (state) is 
3
         when "00" => if (inp='0') then state<="01"; end if;
4
      -- when "01" => if (inp='1') then state<="10"; end if;
5
         when "01" => if ((inp'event and inp = '0') or (inp'event and inp = '1')) --- !!! Hoppala: noch zwei Takte !!!
Und so ein Bauteil gibt es nicht, nirgends, niemals. Schon aus dem 
Grund, weil nie zwei Takte (clk und inp) gleichzeitig kommen können.

Also: du hast ein grundlegendes Problem. VHDL ist eine 
Hardware-Beschreibungs-Sprache, das heißt du musst dir eine Hardware 
vorstellen/aufzeichnen/skizzieren/ausdenken und die dann anschließend 
mit VHDL beschreiben. Das funktioniert bei dir offenbar noch nicht.

Leih dir das Buch VHDL-Synthese von Reichardt&Schwarz aus und sieh dir 
die Beschreibungen und die zugehörigen Syntheseergebnisse an. Vielleicht 
geht dann ein Licht auf...

> ich wuerde gerne auf die positive und negative Flanke eines
> Eingangssignals reagieren...
Sieh dir das mal an. Ganz unten ist das, was du brauchst:
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung
Und diese Flankenerkennung muss nicht in deine FSM, die kann ruhig 
nebenher laufen, das ist ja nur ein Schieberegister. Kannst du dir das 
vorstellen?

: Bearbeitet durch Moderator
von Franz (Gast)


Lesenswert?

Lothar Miller schrieb:
> Und so ein Bauteil gibt es nicht, nirgends, niemals.

Naja. Machbar ist das schon als Bauteil. Vielleicht kommt das 
irgendwann? :)

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


Lesenswert?

Franz schrieb:
>> so ein Bauteil gibt es nicht, nirgends, niemals.
> Naja. Machbar ist das schon als Bauteil.
Sag niemals nie...  ;-)

> Vielleicht kommt das irgendwann?
Es muss nur oft genug in VHDL-Beschreibungen auftauchen.
Evtl. wird das vom Synthesizer an den Hersteller gemeldet wenn einer so 
ein Bauteil braucht, und wenn dann die kritische Masse überschritten ist 
baut Xilinx mal ein paar (10 Stück oder so) von diesen Flipflops in ein 
FPGA ein...

von Fpgakuechle K. (Gast)


Lesenswert?

Franz schrieb:
> Lothar Miller schrieb:
>> Und so ein Bauteil gibt es nicht, nirgends, niemals.
>
> Naja. Machbar ist das schon als Bauteil. Vielleicht kommt das
> irgendwann? :)

Nö, 'event meint einen einzelnen Zeitpunkt kein -intervall. Und dann 
soll ein zweites Signal genau zu dem selben Zeitpunkt ein ereigniss 
aufweisen?! Das würde ja eventuell noch angehen. Allerdings sind diese 
Signale kausal verknüpft. Weil das eine Signal sich ändert, soll das 
andere Signal sich im selben Moment verändert. Am identischen Ort würde 
das noch funktionieren, aber nicht an zwei verschieden Orten. Das 
verletzt die Grundgesetze des Universums.

MfG

von Fellap (Gast)


Lesenswert?

Lothar Miller schrieb:
> Leih dir das Buch VHDL-Synthese von Reichardt&Schwarz aus und sieh dir
> die Beschreibungen und die zugehörigen Syntheseergebnisse an. Vielleicht
> geht dann ein Licht auf...

Wird das Christkind vorbeibringen :)

Lothar Miller schrieb:
>> ich wuerde gerne auf die positive und negative Flanke eines
>> Eingangssignals reagieren...
> Sieh dir das mal an. Ganz unten ist das, was du brauchst:
> http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung
> Und diese Flankenerkennung muss nicht in deine FSM, die kann ruhig
> nebenher laufen, das ist ja nur ein Schieberegister. Kannst du dir das
> vorstellen?

Klasse. So habe ich mir das vorgestellt - Vielen Dank!!!

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.