Lothar M. schrieb:
> Daniel C. schrieb:
>> elsif falling_edge(trigger) then
> Das gibt mir sehr, sehr zu denken. Wie viele unterschiedliche
> rising_edge und falling_edge mit wie vielen unterschiedlichen Signalen
> hat dein Design?
> Wenn die Antwort größer 1 ist, dann wirst du in der Praxis überraschende
> Probleme mit sporadischen (eher schlecht, weil schwer zu finden) oder
> häufigen (Glück gehabt) Fehlfunktionen bekommen....
>
> Die Stichworte dazu sind: Synchronisieren von Taktdomänenübergängen
Hallo Lothar M.,
Ich hab in meinem Gesamtdesign eine eigene Entity zur Edgedetection.
Diese soll von 4 Eingangssignalen eine steigende oder fallende Flanke
erkennen und dann einen Ausgang triggern.
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 |
|
4 | entity EdgeDetector is
|
5 | Port (
|
6 | -- Input ports
|
7 | clk : in STD_ULOGIC;
|
8 | signal_in : in STD_ULOGIC_VECTOR(3 downto 0);
|
9 |
|
10 | -- Output ports
|
11 | output : out STD_ULOGIC
|
12 | );
|
13 |
|
14 | end EdgeDetector;
|
15 |
|
16 |
|
17 | architecture Behavioral of EdgeDetector is
|
18 |
|
19 | signal signal_buf:STD_ULOGIC_VECTOR(3 downto 0);
|
20 | signal detectedEdge:STD_ULOGIC_VECTOR(3 downto 0);
|
21 | begin
|
22 |
|
23 | signal_buf <= signal_in when rising_edge(clk);
|
24 | detectedEdge <= signal_buf xor signal_in;
|
25 | output <= detectedEdge(0) or detectedEdge(1) or detectedEdge(2) or detectedEdge(3);
|
26 |
|
27 | end Behavioral;
|
Die Edgedetection nutze ich dann, als "trigger" für meine FSM.
In der Entity wo meine FSM arbeitet habe ich 2 Verzeigungen mit einer
Edge-Auswertung, die die du oben genannt hast und noch eine in einer
zweiten Process, welche das Schalten der LEDs übernimmt.
1 | process (currentState, clk)
|
2 | begin
|
3 | if rising_edge(clk) then
|
4 | case currentState is
|
5 | when idle=>
|
6 |
|
7 | LED <= "00000001";
|
8 |
|
9 | when q1=>
|
10 |
|
11 | LED <= "00000010";
|
12 |
|
13 | when q2=>
|
14 |
|
15 | LED <= "00000100";
|
16 |
|
17 | when q3=>
|
18 |
|
19 | LED <= "00001000";
|
20 |
|
21 | when q4=>
|
22 |
|
23 | LED <= "00010000";
|
24 |
|
25 | when q5=>
|
26 |
|
27 | LED <= "00100000";
|
28 |
|
29 | when error=>
|
30 |
|
31 | LED <= "11111111";
|
32 |
|
33 |
|
34 | end case;
|
35 | end if;
|
36 | end process;
|
In der Simulation mit ModelSim funktioniert es soweit erst einmal, aber
für jede Kritik wäre ich sehr Dankbar.
LG,
Daniel