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


von E. P. (metallman)


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?

von Falk B. (falk)


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

von E. P. (metallman)


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...

von Falk B. (falk)


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

von metallman (Gast)


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...

von Jan M. (mueschel)


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.

von E. P. (metallman)


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...

von Falk B. (falk)


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

von metallman (Gast)


Lesenswert?

Alles klar... dann mache ich in jedem Modul so ein Clock enable...

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von metallman (Gast)


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..

von metallman (Gast)


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??

von Jan M. (mueschel)


Lesenswert?

Ja genau.

von metallman (Gast)


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...

von Falk B. (falk)


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

von E. P. (metallman)


Angehängte Dateien:

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)

von E. P. (metallman)


Angehängte Dateien:

Lesenswert?

und hier RX-Datei...

von E. P. (metallman)


Angehängte Dateien:

Lesenswert?

und hier irda encoder/decoder

von Falk B. (falk)


Angehängte Dateien:

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
1
    -- *************************** PROCESS DEFINITIONS ****************************
2
    --  Latch data[7:0] into the transmit hold register at falling edge of write
3
    process (write, data)
4
    begin
5
6
      if not((write) = '1' ) then
7
        thr <= data;
8
      end if ;
9
      
10
    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

von E. P. (metallman)


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....

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.