mikrocontroller.net

Forum: FPGA, VHDL & Co. datenübertragung: clk dividieren


Autor: E. P. (metallman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

ich möchte Daten via UART mit 57kbit/s übertragen. Das UART Modul habe 
ich schon.
Mein FPGA läuft mit 25 MHz. Also habe ich mir einen Clock-divider 
gebastelt.

Das Problem ist nur, dass ich damit nicht auf 57k komme, da 25 MHz sich 
nicht gerade runterteilen lassen...

Wie kann ich jetzt das anstellen?
Ich komme immerhin mit meinem heruntergeteilten Clk auf 55,6k.... Reicht 
das vielleicht aus?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ E. P. (metallman)

>Das Problem ist nur, dass ich damit nicht auf 57k komme, da 25 MHz sich
>nicht gerade runterteilen lassen...

25 MHz / 57600 = 434,02777777777777777777777777778

Wenn man den allgemeine 16fachen Takt benötigt sind das

25 MHz / (57600*16) = 27,12673611

Wenn man den nun real durch 27 teilt macht das einen Fehler von

27,12673611 / 27 - 1 = 0,47 %

Das passt problemlos für einen UART.

Und ich hoffe du nimmst nicht den geteilten Takt, sondern ein Clock 
Enable.

Taktung FPGA/CPLD

MfG
Falk

Autor: E. P. (metallman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

wie es scheint, hatte ich einen Fehler in meiner Rechnung... jetzt sieht 
die Simulation schon viel besser aus!

Was beudeutet denn "Clock Enable benutzen"?

Ich habe gedacht, mein Modul würde ausreichen, um den Takt 
einzustellen...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ E. P. (metallman)

>Was beudeutet denn "Clock Enable benutzen"?

Steht im Artikel.

>Ich habe gedacht, mein Modul würde ausreichen, um den Takt
>einzustellen...

Welches Modul? Wie wird dein geteilter Takt dann verwendet?

MFG
Falk

Autor: metallman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja... ich habe da als Eingang CLK und Reset.. am Ausgang kriege ich 
dann ein Signal, das periodisch ist und genau die Zeit von 1,08 µs pro 
Periode hat, also genau 1/16 von der Gewünschten Frequenz... Das Signal 
wollte ich dann mit dem CLK vom UART-Modul verwenden... aber wie es 
scheint, macht man das so nicht...

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
metallman wrote:
> Naja... ich habe da als Eingang CLK und Reset.. am Ausgang kriege ich
> dann ein Signal, das periodisch ist und genau die Zeit von 1,08 µs pro
> Periode hat, also genau 1/16 von der Gewünschten Frequenz...

Das 16fache, oder? Aber ansonsten ja. Allerdings nicht 50% der Zeit auf 
1 (wie ein normaler Takt), sondern immer nur fuer einen einzigen 
normalen Systemtakt, den Rest der Zeit auf 0.


> Das Signal
> wollte ich dann mit dem CLK vom UART-Modul verwenden...

CLK bleibt die System-CLK, dein neues Signal wird als Clock enable 
verwendet.

Du siehst, kein grosser Unterschied zu dem, was du machen wolltest, aber 
viel einfacher in der Anwendung.

Autor: E. P. (metallman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe jetzt diesen Artikel zu Clock enable gelesen. so wie ich es 
verstanden habe, muss das in dem modul (in meinem Fall UART) 
imlementiert werden. Die Frage ist nun, was tue ich, wenn mein System 
mehrere Module hat (ich wollte noch so ein VHDL-Modul zum Auswerten der 
Daten schreiben), denn diese müssen alle synchron arbeiten, oder? Also 
müsste an allen der gleiche Takt anliegen...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  E. P. (metallman)
Datum: 23.01.2008 22:46

>ich habe jetzt diesen Artikel zu Clock enable gelesen. so wie ich es
>verstanden habe, muss das in dem modul (in meinem Fall UART)
>imlementiert werden.

Ja.

> Die Frage ist nun, was tue ich, wenn mein System
>mehrere Module hat (ich wollte noch so ein VHDL-Modul zum Auswerten der
>Daten schreiben), denn diese müssen alle synchron arbeiten, oder? Also
>müsste an allen der gleiche Takt anliegen...

Ja.

MfG
Falk

Autor: metallman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar... dann mache ich in jedem Modul so ein Clock enable...

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst nicht in jedem Modul ein Clock Enable, nur für die Abtastung 
des UART-Eingangs. Die Daten kannst du mit voller Frequenz 
weiterverarbeiten. Du musst dem Modul das die Daten weiterverarbeitet 
nur irgendwie anzeigen wann neue Daten da sind, z.B. mit einem Flag das 
einen Takt lang aktiv ist. Oder du schiebst die Daten in ein FIFO.

Autor: metallman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das klingt interessant.... mein UART hat nähmlich einen 8 bit Ausgang 
für Daten und Signale, die anzeigen, dass die Daten jetzt angekommen 
sind, oder der UART bereit zum senden ist... würden denn die Signale 
jetzt reichen, um das Steuermodul mit voller Frequenz zu betreiben..

Autor: metallman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube, ich habe jetzt doch ein problem...

mein UART hat zwei Module, einmal Tx und einmal Rx...  und jedes hat 
noch mehrere Prozesse, die clk sensitiv sind...

muss ich jetzt quasi in jedem Prozess von Tx und Rx den clk enable 
Signal miteifügen??

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja genau.

Autor: metallman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie funktioniert es nicht in jedem Modul und in jedem Prozess Clk 
enable einzufügen... zwar tut Xilinx synthetesiern, gibt jedoch zwei 
Warnungen aus:
- Signal <clockenable> is never used or assigned.
- Signal <count> is never used or assigned.

und in der Testbench sind jetzt die seriell gesendeten daten 
verschwunden...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  metallman (Gast)

>Irgendwie funktioniert es nicht in jedem Modul und in jedem Prozess Clk
>enable einzufügen... zwar tut Xilinx synthetesiern, gibt jedoch zwei
>Warnungen aus:
>- Signal <clockenable> is never used or assigned.
>- Signal <count> is never used or assigned.

Poste mal deinen Quelltext als Anhang.

>und in der Testbench sind jetzt die seriell gesendeten daten
>verschwunden...

Du braucht natürlich einen CE Generator, deinen /27 Teiler.

MFG
Falk

Autor: E. P. (metallman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
eigentlich ist da ziemlich viel Code (vier Dateien, die dann in einem 
Modul instantiiert sind).. ich hab nähmlich so ein IrDA-Encoder/Decoder 
mit eine UART von der Seite von Xilinx geholt (deswegen IR-Dioden im 
anderen Forumsbereich)...
so wie ich jetzt verstanden habe, wird in diesen beiden Modulen von 
Xilinx 16xclock bereits entsrechend einestellt und ich muss eigendlich 
nur entsprechende Baudrate wählen bzw. mein Systemckl entsprechend 
teilen...

und irgendwie geht das nich mit clk enable...(

(im anhang erstmal nur TX-SM vom UART)

Autor: E. P. (metallman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und hier RX-Datei...

Autor: E. P. (metallman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und hier irda encoder/decoder

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@  E. P. (metallman)

>eigentlich ist da ziemlich viel Code (vier Dateien, die dann in einem
>Modul instantiiert sind).. ich hab nähmlich so ein IrDA-Encoder/Decoder
>mit eine UART von der Seite von Xilinx geholt (deswegen IR-Dioden im
>anderen Forumsbereich)...

Da hast du dir ja einiges zusammengestrickt. Hmmm.

Zum Sender
    -- *************************** PROCESS DEFINITIONS ****************************
    --  Latch data[7:0] into the transmit hold register at falling edge of write
    process (write, data)
    begin

      if not((write) = '1' ) then
        thr <= data;
      end if ;
      
    end process ;

Allein der Kommentar ist ein Warnung. Hier wird ein Latch generiert. 
Das ist unnötig und schlecht.

Die Generierung und Verwendung von txclk ist falsch. Hier muss eben das 
Clock enable rein. Allerdings mit dem Zusatz, dass nur jedes 16. clock 
enable genutzt wird, weil der Sender ja keine 16fache Überabtastung 
macht.
Das Clock enable sollte ausserdem von aussen in Sender und Empfänger 
eingespeist werden. Erstens spart das ein wenig Resourcen, zweitens ist 
man dann sicher, dass beide auf der selben Baudrate laufen.

Beim Emfänger gilt ähnliches für Rxclk.

Alles in allem ist das ziemlich schlechter Code, den auf clock enable 
umstricken wird so einfach nicht gehen. Mein Vorschlag. Wegschmeissen 
und neu machen. Im Netz gibt es wesentlich bessere Beispiele. Im Anhang 
mal ein Empänger von mir, der ist für DMX und arbeitet mit zwei 
Stopbits.

MfG
Falk

Autor: E. P. (metallman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen vielen Dank für deine Hilfe.. ich werde morgen mich auf die Suche 
nach was neuem machen und deinen Code mir nochmal genauer anschauen...


clock enable von außen an Sender und empfänger anzuschließen: das wollte 
ich auch probieren....

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.