Du willst also asynchron ein FF sofort mit der steigenden Flanke eines
externen Signals setzen, und nach 2 Takten wieder zurücksetzen?
Analog zur Impulsgewinnung von
http://www.lothar-miller.de/s9y/archives/19-Kurzer-Spike-in-Puls-umgewandelt.html
schlage ich das mal vor:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 |
|
4 | entity Monoflop is
|
5 | Port ( clk : in STD_LOGIC;
|
6 | input : in STD_LOGIC;
|
7 | output : out STD_LOGIC);
|
8 | end Monoflop;
|
9 |
|
10 | architecture Behavioral of Monoflop is
|
11 | signal sr0 : std_logic := '0';
|
12 | signal sr1 : std_logic := '0';
|
13 | signal sr2 : std_logic := '0';
|
14 | signal merkin : std_logic := '0';
|
15 | begin
|
16 | -- Merker-FF -- so funktioniert das bombensicher,
|
17 | -- allerdings ist der Eingang für 1 Takt blind: solange sr2='1' ist
|
18 | process (sr2, input) begin
|
19 | if (sr2 = '1') then
|
20 | merkin <= '0';
|
21 | elsif rising_edge(input) then
|
22 | merkin <= '1';
|
23 | end if;
|
24 | end process;
|
25 |
|
26 | -- Asynchrones Merker-FF eintakten
|
27 | process begin
|
28 | wait until falling_edge(clk);
|
29 | if(sr2='1') then
|
30 | sr0 <= '0';
|
31 | sr1 <= '0';
|
32 | sr2 <= '0';
|
33 | else
|
34 | sr0 <= merkin;
|
35 | sr1 <= sr0;
|
36 | sr2 <= sr1;
|
37 | end if;
|
38 | end process;
|
39 |
|
40 | -- Monoflop-Impuls ausgeben
|
41 | output <= merkin;
|
42 | end Behavioral;
|
Was noch nicht ganz klar ist:
Soll das Monoflop retriggerbar sein? Aus deinem Timing-Diagramm geht
hervor, dass das offenbar nicht gewünscht ist...
Aber was soll passieren, wenn (ziemlich) genau gleichzeitig das
Eingangssignal weggeht und der Ausgang zurückgesetzt werden soll?
Fragen zum Bild: Warum wird bei der Markierung 1 das Monoflop nicht
wieder gestartet? Was wäre, wenn der Puls bei Markierung 2 einen Hauch
später käme? Warum müsste dann ein 2. Impuls ausgegeben werden?
Insgesamt: Es erschliesst sich (zumindest mir) der Sinn des Ganzen
nicht.
Was willst du genau erreichen? Woher kommt das Signal und was soll
daraus werden?