mikrocontroller.net

Forum: FPGA, VHDL & Co. Clock im Spartan-II


Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

ich benutze ein Spartan II FPGA von Xilinx und möchte Daten die ich von 
einem uC erhalte in ein RAM schreiben. Dazu generiert der uC einen 
"Clock". Dieser "Clock" hat KEIN Duty Cycle von 50:50 und hat auch KEINE 
gleichbleibende Frequenz.
Meine Frage: Kann ich diesen "Clock" dann der Sensitivity List eines 
Prozesses verwenden so wie ich es in folgendem Beispiel getan habe???
-- purpose: Buffer the data for one load_clk cycle.
-- type   : sequential
-- inputs : load_clk, rst_load_clk
-- outputs: 
  data_buf_proc : process (load_clk, rst_load_clk)
  begin  -- process data_out
    if rst_load_clk = '0' then          -- asynchronous reset (active low)
      load_clk_event <= '0';
    elsif load_clk'event and load_clk = '1' then  -- rising clock edge
      if load_n = '0' then
        load_clk_event <= not load_clk_event;
      end if;
    end if;
  end process data_buf_proc;

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Du darfst den Clock ganz normal verwenden.

ABER WIE GENERIERST DU DEN CLOCK?
Es ist ganz wichtig das der NICHT durch kombinatorischer Logik erzeugt 
wird!!!
Poste doch mal Deinen Code der den Clock generiert.

Und anstatt load_clk'event and load_clk = '1' verwende besser 
rising_edge(load_clk). Das erhöht die Übersichtlichkeit.

Gruß,
 Mathi

Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort.

Der uC erzeugt den Clock. Er geht dann auf einen Pin vom FPGA und wird 
von mir wie oben gezeigt verwendet. Wenn ich richtig liege wird der 
Clock dann ja nicht durch kombinatorische Logik erzeugt und kann von mir 
ganz normal verwendet werden, obwohl er weder konstant, noch einen 
gleichbleibenden Duty Cycle hat. Richtig?

Der Syntax
rising_edge(load_clk) 
ist mir bekannt, wird von mir aber nicht verwendet, weil Emacs beim 
erstellen eines neuen Prozesses immer den veralteten aber nicht falschen 
Code
load_clk'event and load_clk = '1'
erzeugt und ich mir nicht die Mühe machen will das jedesmal zu ändern. 
Sicherlich kann man das auch bei Emacs einstellen... aber naja... auch 
die Mühe habe ich mir nicht gemacht.... ;)

Autor: glück (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob rising_edge(load_clk) oder load_clk'event and load_clk = '1' spielt 
für die Synthese keine Rolle. Unterschiede gibt es allerdings (in 
zugegeben seltenen Fällen) bei der Simulation.

Eine andere Möglichkeit, deinen externen Clock zu verwenden:

clk_int: fpga-interner clock, sehr viel schneller als uc-clock

process(clk_int, rst)
begin
  if rising_edge(clk_int)
    if reset
      ... bla bla ...
    elsif
      load_clk_sig <= load_clk;
      load_clk_old <= load_clk_sig;
      if (load_clk_sig = '1' and load_clk_old = '0') then
         ... aktion ...
      end if;
    end if;
  end if;
end process;

Sollte so am stabilsten laufen.

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der uC erzeugt den Clock. Er geht dann auf einen Pin vom FPGA und wird
>von mir wie oben gezeigt verwendet. Wenn ich richtig liege wird der
>Clock dann ja nicht durch kombinatorische Logik erzeugt und kann von mir
>ganz normal verwendet werden, obwohl er weder konstant, noch einen
>gleichbleibenden Duty Cycle hat. Richtig?

Der Clock.

Kann man das nicht schöner ausdrücken?
Takt oder Clock-Signal vielleicht?

Und wenn Frequenz und Tastverhältnis (Duty-Cycle) stark variieren -- 
sollte man das dann überhaupt "Clock" nennen, oder lieber neutral von 
einem Signal sprechen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan Salewski (Gast)

>Der Clock.

>Kann man das nicht schöner ausdrücken?
>Takt oder Clock-Signal vielleicht?

ACK!

>Und wenn Frequenz und Tastverhältnis (Duty-Cycle) stark variieren --
>sollte man das dann überhaupt "Clock" nennen, oder lieber neutral von
>einem Signal sprechen?

Dan ist es eher ein Strobesignal.

MFG
Falk

Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
glück wrote:
> Ob rising_edge(load_clk) oder load_clk'event and load_clk = '1' spielt
> für die Synthese keine Rolle. Unterschiede gibt es allerdings (in
> zugegeben seltenen Fällen) bei der Simulation.
>
> Eine andere Möglichkeit, deinen externen Clock zu verwenden:
>
> clk_int: fpga-interner clock, sehr viel schneller als uc-clock
>
> process(clk_int, rst)
> begin
>   if rising_edge(clk_int)
>     if reset
>       ... bla bla ...
>     elsif
>       load_clk_sig <= load_clk;
>       load_clk_old <= load_clk_sig;
>       if (load_clk_sig = '1' and load_clk_old = '0') then
>          ... aktion ...
>       end if;
>     end if;
>   end if;
> end process;
>
> Sollte so am stabilsten laufen.

Die Antwort war genau das was ich gesucht habe.... Du glaubst ja gar 
nicht was Du mir für einen Gefallen getan hast...
Im FPGA hab ich mir mit Hilfe der DLL und dem Systemclock mit 27MHZ 
einen Takt mit 108MHz generiert und mit diesem den Burst oder "clock" 
vom uC abgetastet so wie Du's oben beschrieben hast...

Jetzt erstmal Bett gehen und Morgen weiterfreuen....

Gruß aus Bremen,

Hendrik

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achte aber darauf das Du das Signal load_clk erst in die Taktdomäne des 
clk_int einsynchronisieren musst. Sonst kann es zu metastabilen 
Zuständen kommen. Einfach zwei Register davorschalten.

Gruß,
 Mathi

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich seh gerade, dass ein Register schon durch load_clk_sig realisiert 
ist. Also fehlt nur noch ein Register...

Autor: Thomas Hertwig (mac4ever)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
glück wrote:
load_clk_sig <= load_clk;
load_clk_old <= load_clk_sig;

Sind bei mir zwei Register ...

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Abfrage geschieht aber auf load_clk_sig load_clk_old = '0'.
load_clk_old geht damit durch zwei Register. Aber load_clk_sig nicht.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Hendrik H. (Firma MARUM/RCOM) (hhanff)

>Im FPGA hab ich mir mit Hilfe der DLL und dem Systemclock mit 27MHZ
>einen Takt mit 108MHz generiert und mit diesem den Burst oder "clock"
>vom uC abgetastet so wie Du's oben beschrieben hast...

Naja, man kann es auch übertreiben. Solche Sachen mit Überabtastung 
machen ab einer bestimmten Frequenz nur noch wenig Sinn. und 27 MHz 
würde ich da schoin dazuzählen. Warum nicht ganz normal mit den 27 MHz 
die Daten eintakten?

MFG
Falk

Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
> Naja, man kann es auch übertreiben. Solche Sachen mit Überabtastung
> machen ab einer bestimmten Frequenz nur noch wenig Sinn. und 27 MHz
> würde ich da schoin dazuzählen. Warum nicht ganz normal mit den 27 MHz
> die Daten eintakten?
>
> MFG
> Falk

Die 108MHz brauche ich eh für eine andere Aufgabe. Daher ist es denke 
ich kein Problem diesen Takt auch zu verwenden, oder?

Gruß

h

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Hendrik H. (Firma MARUM/RCOM) (hhanff)

>Die 108MHz brauche ich eh für eine andere Aufgabe. Daher ist es denke
>ich kein Problem diesen Takt auch zu verwenden, oder?

Doch. Denn das asynchrone Eintakten eines Datenbusses ist nicht so 
trivial wie es aussieht. Und allein mit zwei FlipFlops zum Abtasten und 
Abfangen metastabiler Zustände ist es nicht getan. Wie gesagt, was 
spricht gegen ein ganz normales Eintakten der Daten direkt mit dem 
Takt/Strobe vom uC? Gar nichts.

MFG
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.