Forum: FPGA, VHDL & Co. flankenerkennung für externen takt


von rene (Gast)


Lesenswert?

hi,
ich hab da ein problem vllt kann mir da jemand helfen. Also ich hab ein 
Systemtakt von 66MHZ und ein externer takt von 3kHz ich mach eine neg 
Fankenerkennung mit folgendem prinzip
process(CLK)
 begin
   if rising_edge(CLK) then
    if RESET = '1' then
     signal_syn <= '0';
     signal_last <= '0';
    else
     signal_syn <= externtakt;
     signal_last <= signal_syn;
    signal_rising <= not signal_syn and  signal_last;
end if;
   end if;
 end process;

es funktioniert aber nicht richtig kann es sein das der externe takt zu 
schnell ist für diese prinzig???
VIELEN DANK

von Falk B. (falk)


Lesenswert?

@rene (Gast)

>es funktioniert aber nicht richtig

Ist Reset auf 0?

>kann es sein das der externe takt zu
>schnell ist für diese prinzig???

Nein. Lass das Reset weg, ist hier überflüssig.

MFG
Falk

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


Lesenswert?

> es funktioniert aber nicht richtig
Was funktioniert nicht?
Die Simulation?
Das Design im Zielsystem?
Ist das ein FPGA oder CPLD?

BTW: die Simulation ist garantiert falsch, denn die Sensitivliste ist 
unvollständig. Wenn du schon einen asynchronen Reset beschribst, dann 
muß der auch mit rein:
process(RESET,CLK) ...

> Also ich hab ein Systemtakt von 66MHZ und ein externer takt von 3kHz
> ... kann es sein das der externe takt zu schnell ist
Nein. Eher ist der 66MHz-Takt zu schnell, wenn die Flankensteilheit des 
3kHz-Signals relativ flach ist. Dann erkennst du evtl. mehrere Flanken 
schnell hintereinander wo eigentlich nur 1 Flanke ist.

> ich mach eine neg Fankenerkennung
Und nennst dein Ergebnissignal dann rising. Das ist brutal :-o

Dein Code ist kurz und trotzdem macht er mir fast einen Knoten ins Hirn:
1. Du brauchst keinen Reset.
2. Nimm ein Schieberegister.
3. Du mußt nicht jedes Signal nochmal im Namen mit signal_ ansprechen.

Das hier mal als Vorschlag
1
 flankensr : std_logic_vector(1 downto 0) := "00";
2
 falledge  : std_logic := '0';
3
 :
4
 process (CLK) begin
5
   if rising_edge(CLK) then
6
     flankensr <= flankensr(0) & externtakt;
7
--     if (flankensr = "10") then falledge <= '1';  -- Entweder so....
8
--     else                       falledge <= '0';  -- ...
9
--     end if;                                      -- ...
10
   end if;
11
 end process;
12
 :
13
 falledge <= '1' when flankensr = "10" else '0';    -- ... oder so.

von rene (Gast)


Lesenswert?

erst mal vielen dank
@lothar
zur beruhigung das ist nicht der orign. code hab das nur schnell 
hingeschrieben.
1. das ist ein fpga
2.simulation geht alles nur auf der hardware nicht
3. die flanken des esternen takt sind sehr steil

frage zu deinem code
meckert der compiler nicht bei der zuweisung
flankensr <= flankensr(0) & externtakt;
da flankensr 2bit groß ist und du ihm darauf nur ein bit einfach zuweist 
ohne zu sagen wohin?? ich kenn das so nicht?? anfänger halt

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


Lesenswert?

> da flankensr 2bit groß ist und du ihm darauf nur ein bit einfach zuweist
Da werden durchaus 2 Bit zugewiesen. Sieh dir mal die Funktion des & 
Operators (Concatenation, Verknüpfung) in VHDL an.

von Falk B. (falk)


Lesenswert?

@  rene (Gast)

>zur beruhigung das ist nicht der orign. code hab das nur schnell
>hingeschrieben.

Patsch

Für so ein Blödsinn KANN man nur Ohrfeigen verteilen!
Siehe Netiquette!!!

>2.simulation geht alles nur auf der hardware nicht

Wie so oft ;-)

>3. die flanken des esternen takt sind sehr steil

Ja und? Das ist der Sinn der Sache!

MfG
Falk

von S. (Gast)


Lesenswert?

Hallo Rene,

was heisst "funktioniert nicht richtig" in HW. Immer, oder nur manchmal, 
oder manchmal nicht?

Takte das externe Signal mal 2mal nach, bevor Du die Flanke detektierts.

Sig1 <= ExtClock;
Sig2 <= Sig1;
dann erst das Signal, dass dann auf die Flanke geprüft wird.
Sig3 <= Sig2;
EdgeDetection <= (not Sig2) and Sig3;

Ist es beabsichtigt, hier nur nen 1-Takt breiten Impuls zu erzeugen?

Mit was verarbeitest Du denn dann diesen Impuls?
Ist der externe Takt glitchfrei?

Gruss,

S.



PS:

> BTW: die Simulation ist garantiert falsch, denn die Sensitivliste ist
> unvollständig. Wenn du schon einen asynchronen Reset beschribst, dann
> muß der auch mit rein:
> process(RESET,CLK) ...

Hmmm, ist das nicht ein synchroner Reset in dem Beispiel, und damit dann 
die Sensitivity Liste richtig ?   :-)
Aber ich nehm auch lieber Async Reset ...

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.