Forum: FPGA, VHDL & Co. Hilfe wie triggere ich auf steigende und lallende flanke


von Dominik (Gast)


Lesenswert?

Hallo liebes Forum,
ich muss mich seit kurzem mit einer FPGA Firmware auseinandersetzen, 
habe aber eigentlich noch nichts auf diesem Gebiet gemach, komme 
eigentlich mehr aus de µC ecke. Nun zu meinem Problem ich habe einen 
FPGA (Xilinx Virtex), dieser wird in VHDl programmiert. Nun möchte ich 
wenn ein Signal(pa_on) eingeschaltet wird ein Timer auf einen wert x 
setzen, diese nennt sich timer1, wird das Signal pa_on nun wieder 
ausgeschaltet so soll auf die fallende Flanke getriggert werden und ein 
andere Timer(timer2) gestartet werden. Wie stelle ich das an? wäre für 
jeden hinweis dankbar.

von lüsterklemme (Gast)


Lesenswert?

"...und lallende flanke" :-)

von lüsterklemme (Gast)


Lesenswert?

Aber vielleicht hilft das?

Beitrag "CLK'event oder rising_edge(clk)"

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


Lesenswert?

Dominik schrieb:
> Wie stelle ich das an?
Du baust dir erst mal 2 Timer und dann nimmst du eine Flankeerkennung 
und triggerst die Timer damit...
> wäre für jeden hinweis dankbar.
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung

> Nun möchte ich wenn ein Signal(pa_on) eingeschaltet wird ein Timer
> auf einen wert x setzen, diese nennt sich timer1,
Das kannst du gleich am Anfang machen, denn sonst passiert in deiner 
Beschreibung ja nichts mit dem Timer1...  :-o
> wird das Signal pa_on nun wieder ausgeschaltet so soll auf die fallende
> Flanke getriggert werden und ein andere Timer(timer2) gestartet werden.
Wie schnell und woher kommen die Flanken?

Noch was zur Terminologie:
> komme eigentlich mehr aus de µC ecke. Nun zu meinem Problem ich habe
> einen FPGA (Xilinx Virtex), dieser wird in VHDl programmiert.
Ein Feldprogrammierbares Gate Array wird nicht programmiert. Sondern 
es wird mit VHDL (das ist eine Hardware-Beschreibungssprache) eine 
Schaltung beschrieben, die dann von der Toolchain auf ein FPGA 
umgesetzt wird.

lüsterklemme schrieb:
> Aber vielleicht hilft das?
> Beitrag "CLK'event oder rising_edge(clk)"
Nein, das ist hier mit 99,999% Sicherheit der falsche Weg...

von Bronco (Gast)


Lesenswert?

Dominik schrieb:
> Wie stelle ich das an? wäre für
> jeden hinweis dankbar.

Zum Bleistift:
1
signal pa_on_synced     : std_logic := '0';
2
signal pa_on_synced_old : std_logic := '0';
3
4
process(CLK)
5
begin
6
  if (rising_edge(CLK)) then
7
    -- Signal "pa_on" zum Takt synchronisieren
8
    pa_on_synced <= pa_on;         
9
    if    ((pa_on_synced = '1') and (pa_on_synced_old = '0')) then
10
      -- Steigende Flanke
11
    elsif ((pa_on_synced = '0') and (pa_on_synced_old = '1')) then
12
      -- Fallende Flanke
13
    end if;
14
     -- Aktuellen Zustand für den nächsten Takt merken
15
     pa_on_synced_old <= pa_on_synced;  
16
  end if;
17
end process;

Noch ein paar Tips:
- Wenn irgend möglich nur einen einzigen Takt (CLK) benutzen
- Der Takt muß natürlich schnell genug sein, um Dein Signal abzutasten
- Falls "pa_on" prellt, mußt Du noch eine Entprellung vorsehen

Lösung wie
1
if (rising_edge(pa_on)) then
sind nicht zielführend!
Im FPGA sollte alles mit einem einzigen Takt laufen, damit sämtliche 
Vorgänge synchron zu einander sind.
Im µC passiert das explizit durch die CPU (ein Befehl nach dem anderen), 
aber im FPGA muß darauf wirklich genau achten!

von Dominik (Gast)


Lesenswert?

Hallo und vielen Dank schon mal für eure schnelle Hilfe.
Noch als Zusatzinformation ich habe einen Systemtakt von 140Mhz, und das 
pa_on Signal ist kein hardwaresignal sondern es wird aus einem SPI 
Register gebildet. @Bronco deinen Lösungsweg kann ich nachvollziehen, 
ich werde es mal so versuchen in mein Projekt einzubinden. @Lothar auch 
danke für deine Berichtigung ;)


Gruß

Dominik

von Bronco (Gast)


Lesenswert?

Eines noch:
Nimm Dir die Problematik des Einsynchronisierens zu Herzen:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

Ich bin anfangs granatenmäßig auf die Schnauze gefallen, weil 
FPGA-externe Signale (wie z.B. auch Deine SPI-Signale) nicht korrekt zu 
FPGA-Takt synchronisiert waren.

von Meister E. (edson)


Lesenswert?

Bronco schrieb:
> Im FPGA sollte alles mit einem einzigen Takt laufen, damit sämtliche
> Vorgänge synchron zu einander sind.
> Im µC passiert das explizit durch die CPU (ein Befehl nach dem anderen),
> aber im FPGA muß darauf wirklich genau achten!

Bronco, diesen Vergleich kann man nicht vergleichen...

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
> Ein Feldprogrammierbares Gate Array wird nicht programmiert.

Genau. Daher auch der Name :)

von Bronco (Gast)


Lesenswert?

Immer diese Erbsenzählerei!
Irgendwann kommt noch mal einer auf die Idee und erfindet phosphorfreies 
Phosgen...

von Meister E. (edson)


Lesenswert?

Bronco schrieb:
> Immer diese Erbsenzählerei!

Ach, wenn wir schon dabei sind. :)

Marcus Harnisch schrieb:
> Lothar Miller schrieb:
>> Ein Feldprogrammierbares Gate Array wird nicht programmiert.
>
> Genau. Daher auch der Name :)

Sehen wir es halt so, dass man in den Sprachen VHDL, Verilog, etc. keine 
Programme schreibt sondern Schemata. Der Programmiervorgang überträgt 
diese auf das FPGA, das im Betrieb diesen Vorgaben folgt.

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.