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?
@ 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
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...
@ 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
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...
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.
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...
@ 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
Alles klar... dann mache ich in jedem Modul so ein Clock enable...
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.
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..
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??
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...
@ 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
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)
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.