>Eigentlich beginnt die Flanke bei ersten wechsel von 0 nach 1 oder von 1
>nach 0. Zu diesem Zeitpunkt muss ich auslösen, dabei dürfen aber die
>darauffolgenden Wechsel für eine gewisse dauer nicht erkannt werden.
Das macht dich aber recht empfindlich auf irgendwelche Spikes oder
Störungen...
Also, dass ich das richtig sehe:
ideales Signal: ooo11111111111111111ooooooooooooooo
reales Signal: ooo1o11o111111111111oo11o1ooooooooo
Flanke: ooo1oooooooooooooooo1oooooooooooooo
Eine Frage, die sich mir stellt, ist dann: wieviele Takte zwischen zwei
Flankenwechseln ist das Signal dann auch mindestens definiert 0 oder 1?
Mit deinem exemplarischen Signal sind das
ooo1o11o111111111111oo11o1ooooooooo
123111211234567890ab121211123456789
9 Takte o bzw.
11 Takte 1
> if (edge_counter = "1111") then
sind 16 Takte und würde dann schon mal schiefgehen.
Also, nehmen wir mal 8 Takte, und schalten sofort beim 1.
Flankenwechsel.
(Nur 1 FF lasse ich noch drin, zur Synchronisation ;-), besser is das)
1 | :
|
2 | signal sr : std_logic_vector(7 downto 0);
|
3 | signal flanke : std_logic;
|
4 | signal pegel : std_logic;
|
5 | :
|
6 | process (clk)
|
7 | begin
|
8 | if rising_edge(clk) then
|
9 | -- Schieberegister
|
10 | sr <= sr(6 downto 0) & eingang;
|
11 | -- Flankenerkennung
|
12 | flanke <= '0';
|
13 | if (sr="11111110") then flanke <= '1' end if; -- fallend
|
14 | if (sr="00000001") then flanke <= '1' end if; -- steigend
|
15 | -- Entprellen
|
16 | if (sr="11111111") then pegel <= '1' end if; -- high
|
17 | if (sr="00000000") then pegel <= '0' end if; -- low
|
18 | end if;
|
19 | end process;
|
20 | :
|
Und für Extremisten, die unvorhergesehene Ergebnisee lieben (oder
bereits synchronisierte Signale haben), dieser Code:
1 | :
|
2 | signal sr : std_logic_vector(7 downto 0);
|
3 | signal flanke : std_logic;
|
4 | signal pegel : std_logic;
|
5 | :
|
6 | process (clk)
|
7 | begin
|
8 | if rising_edge(clk) then
|
9 | -- Schieberegister
|
10 | sr <= sr(6 downto 0) & eingang;
|
11 | -- Flankenerkennung
|
12 | flanke <= '0';
|
13 | if (sr="11111111" and eingang='0') then flanke <= '1' end if; -- fallend
|
14 | if (sr="00000000" and eingang='1') then flanke <= '1' end if; -- steigend
|
15 | -- Entprellen
|
16 | if (sr="11111111") then pegel <= '1' end if; -- high
|
17 | if (sr="00000000") then pegel <= '0' end if; -- low
|
18 | end if;
|
19 | end process;
|
20 | :
|
Man sieht: fast derselbe Code wie beim ersten Posting, nur die
Auswertung ist ein wenig anders. Und ja: ich liebe Schieberegister :-)