Clock im Spartan-II

OP (Firma: Ich.AG) #743312
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???
1
-- purpose: Buffer the data for one load_clk cycle.
2
-- type   : sequential
3
-- inputs : load_clk, rst_load_clk
4
-- outputs: 
5
  data_buf_proc : process (load_clk, rst_load_clk)
6
  begin  -- process data_out
7
    if rst_load_clk = '0' then          -- asynchronous reset (active low)
8
      load_clk_event <= '0';
9
    elsif load_clk'event and load_clk = '1' then  -- rising clock edge
10
      if load_n = '0' then
11
        load_clk_event <= not load_clk_event;
12
      end if;
13
    end if;
14
  end process data_buf_proc;
Gast #743344
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
OP (Firma: Ich.AG) #743377
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
1
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
1
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.... ;)
Gast #743434
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.
Gast #743443
>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?
#743478
@ 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
OP (Firma: Ich.AG) #743556
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
Gast #743560
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
#743769
@ 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
OP (Firma: Ich.AG) #743840
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
#743963
@ 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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.