Forum: FPGA, VHDL & Co. Edgedetector für 4 Eingänge


von Daniel C. (danny1)


Lesenswert?

Hallo liebe mikrocontroller - Community,

Ich bin grad dabei einen Edgedetector in VHDL zu Bauen. Die Entity hat 4 
Eingänge und einen Ausgang. Das Ziel wäre jetzt bei jeder steigenden 
oder fallenden Flanke von jedem der 4 Eingänge den Ausgang einen 
Taktzyklus auf '1' zu setzen.
Mein Ansatz wäre das aktuell anstehende Signal mit dem vorhergehenden 
Signal von einem Registerausgang zu vergleichen.
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
          reset      :  in   STD_ULOGIC;
10
          
11
          -- Output ports
12
               output       :  out STD_ULOGIC
13
          );
14
          
15
end EdgeDetector;
16
17
18
architecture Behavioral of EdgeDetector is
19
     signal signal_a:STD_ULOGIC;
20
    signal signal_b:STD_ULOGIC;
21
    signal signal_c:STD_ULOGIC;
22
    signal signal_d:STD_ULOGIC;
23
    
24
    signal detectedEdge_a:STD_ULOGIC;
25
    signal detectedEdge_b:STD_ULOGIC;
26
    signal detectedEdge_c:STD_ULOGIC;
27
    signal detectedEdge_d:STD_ULOGIC;
28
    
29
    signal output1:STD_ULOGIC;
30
    signal output2:STD_ULOGIC;
31
    
32
begin
33
    process(clk, reset)
34
    begin
35
         if clk= '1' and clk'event then
36
               signal_a<=signal_in(0);
37
          signal_b<=signal_in(1);
38
          signal_c<=signal_in(2);
39
          signal_d<=signal_in(3);
40
          
41
         end if;
42
      
43
    end process;
44
   
45
   detectedEdge_a <= ((not signal_a) and signal_in(0)) or (signal_a and (not signal_in(0)));
46
   detectedEdge_b <= ((not signal_b) and signal_in(1)) or (signal_b and (not signal_in(1)));
47
   detectedEdge_c <= ((not signal_c) and signal_in(2)) or (signal_c and (not signal_in(2)));
48
   detectedEdge_d <= ((not signal_d) and signal_in(3)) or (signal_d and (not signal_in(3)));
49
   
50
   output1 <= detectedEdge_a or detectedEdge_b;
51
   output2 <= detectedEdge_c or detectedEdge_d;
52
   
53
   output <= output1 or output2;
54
     
55
end Behavioral;

Der Edgedetector spricht auf die fallende und steigende Flanke von 
Eingang 2 und 3 an also auf "signal_in(2) und signal_in(3)". Eingang 0 
und 1 also "signal_in(0) und signal_in(1)" ignoriert mein Detector 
leider.
Hat jemand eine Idee woran das liegen könnte?

PS: Der clk kommt von der PLL und hat einen Takt von 200MHz


LG,
Daniel

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


Lesenswert?

Daniel C. schrieb:
> Der Edgedetector spricht auf die fallende und steigende Flanke von
> Eingang 2 und 3 an also auf "signal_in(2) und signal_in(3)". Eingang 0
> und 1 also "signal_in(0) und signal_in(1)" ignoriert mein Detector
> leider.
Wie stellst du das fest? Funktioniert das Ganze in der Testbench?

> Mein Ansatz wäre das aktuell anstehende Signal mit dem vorhergehenden
> Signal von einem Registerausgang zu vergleichen.
 Woher kommen diese Flanken? Sind das asynchrone externe Signale?

BTW: kennst du die "xor" Funktion?
1
   detectedEdge_a <= signal_a xor signal_in(0);
2
   detectedEdge_b <= signal_b xor signal_in(1);
3
   :
4
   :

BTW2: Nimm wie der Rest der Welt std_logic statt der std_ulogic.

BTW3: warum nimmst du für die lokalen Signale nicht auch Vektoren? Dann 
wird deine Beschreibung wesentlich kompakter:
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
          reset      :  in   STD_ULOGIC;
10
          
11
          -- Output ports
12
          output       :  out STD_ULOGIC
13
          );
14
end EdgeDetector;
15
16
architecture Behavioral of EdgeDetector is
17
    signal signal_buf:STD_ULOGIC_VECTOR(3 downto 0);
18
    signal detectedEdge:STD_ULOGIC_VECTOR(3 downto 0);
19
begin
20
    signal_buf <= signal_in when rising_edge(clk); -- 4 Bits parallel eintakten 
21
    detectedEdge <= signal_buf xor signal_in;      -- 4 Bits parallel verrechnen
22
    output <= detectedEdge(0) or detectedEdge(1) or detectedEdge(2) or detectedEdge(3);   
23
end Behavioral;

: Bearbeitet durch Moderator
von Klaus (Gast)


Lesenswert?

So gehts noch einfacher:
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
          reset      :  in   STD_ULOGIC;
10
          
11
          -- Output ports
12
          output       :  out STD_ULOGIC
13
          );
14
end EdgeDetector;
15
16
architecture Behavioral of EdgeDetector is
17
    signal signal_buf:STD_ULOGIC_VECTOR(3 downto 0);
18
begin
19
    signal_buf <= signal_in when rising_edge(clk); -- 4 Bits parallel eintakten 
20
    output <= '1' when signal_in /= signal_buf else '0';
21
end Behavioral;

Immer noch vorausgesetzt, dass 'signal_in' synchron zu 'clk' ist 
(Wichtig!!!).

von Duke Scarring (Gast)


Lesenswert?

Lothar M. schrieb:
> BTW2: Nimm wie der Rest der Welt std_logic statt der std_ulogic.
Ich verwende std_logic nur für Signale die an den FPGA-Pins liegen 
(in/out).
Im FPGA verhindert std_ulogic schon beim Compilieren das ein Signal 
mehrfach getrieben werden kann.

Duke

von Felix F. (wiesel8)


Lesenswert?

Klaus schrieb:
> signal_buf <= signal_in when rising_edge(clk); -- 4 Bits parallel
> eintakten
>     output <= '1' when signal_in /= signal_buf else '0';

Kann das bitte jemand erklären?
Wie soll (sin \= sbuf) jemals wahr sein, wenn sin immer in sbuf 
geschrieben wird?

mfg

von Andreas (Gast)


Lesenswert?

Felix F. schrieb:
> Kann das bitte jemand erklären?
> Wie soll (sin \= sbuf) jemals wahr sein, wenn sin immer in sbuf
> geschrieben wird?

Die erste Zeile macht den unterschied:

Felix F. schrieb:
>> signal_buf <= signal_in when rising_edge(clk);

Das wird ein FF und damit ein Takt Verzögerung. Du vergleichst also 
sin(T=n) mit sin(T=n+1) und das kann wahr werden.

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


Lesenswert?

Felix F. schrieb:
> Wie soll (sin \= sbuf) jemals wahr sein, wenn sin immer in sbuf
> geschrieben wird?
Dazwischen sitzt ein Flipflop (oder eher 4 Fliflops nebeneinander) ...

: Bearbeitet durch Moderator
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.