Hallo, ich möchte von folgender UART-Ausgabe ein Signal vom heruntergeteilten UART-Takt ausgeben, mit dem gesendet wird. Der heruntergeteilte Takt muss ein symmetrisches Rechteck sein, das ich weiterverarbeiten möchte. Was wäre der richtige Ansatz? Gruß
Hans Hirsch schrieb: > Der heruntergeteilte Takt muss ein symmetrisches Rechteck sein, das ich > weiterverarbeiten möchte. Ein Rechteck ist immer symetrisch ;) Meinst du ein Tastverhältnis von 1:1? Wieso bauchst du das den wenn du das Sognal danach weiterverarbeitest?
> Meinst du ein Tastverhältnis von 1:1? Ja! > Wieso bauchst du das den wenn du das Sognal danach weiterverarbeitest? Ich brauche den Takt von der UART-Ausgabe um mit ihm einen weiteren Process ansteuern zu können.
>> Der heruntergeteilte Takt muss ein symmetrisches Rechteck sein, das ich >> weiterverarbeiten möchte. Was wäre der richtige Ansatz? > Ich brauche den Takt von der UART-Ausgabe um mit ihm einen weiteren > Process ansteuern zu können. Der richtige Ansatz wäre, es nicht so zu machen... Der richtige Ansatz ist, nur 1 Takt im ganzen Design zu haben. Alles Andere wird über Clock-Enable-Signale gesteuert, die jeweils nur 1 Taktzyklus lang aktiv sind. Aber trotzdem:
1 | Port ( |
2 | txclk : out std_logic; |
3 | taste_start : in STD_LOGIC; -- Start �bertragung |
4 | :
|
5 | :
|
6 | if(txcnt < Quarz_Taktfrequenz/Baudrate) then |
7 | :
|
8 | end if; |
9 | if(txcnt < Quarz_Taktfrequenz/(2*Baudrate)) then |
10 | txclk <= '1'; |
11 | else
|
12 | txclk <= '0'; |
13 | end if; |
Aber Achtung: der Takt ist nur während der Übertragung aktiv...
Wäre so eine Teilung des Taktes sinnvoller? .. clk_1x <= clk_div(3); -- Herunterteilen des Boardtaktes process (CLK, clk_div) begin --if rst = '1' then --clk_div = '0000'; if (CLK'event and CLK = '1') then clk_div <= clk_div + "0001"; end if; end process;
> Wäre so eine Teilung des Taktes sinnvoller?
Für Anfänger muss gelten: Es gibt nur 1 Takt im ganzen Design.
Es gibt also nur
1 | if (CLK'event and CLK = '1') then |
und nicht auch noch
1 | if rising_edge(CLK_tx) then... |
2 | if rising_edge(CLK_rx) then... |
3 | if rising_edge(CLK_1x) then... |
Wenn du etwas mit 1/16 der Taktfrequenz machen willst, dann sieht das so aus:
1 | signal cnt16 : integer range 0 to 15 := 0; |
2 | signal clk_16tel : std_logic; -- Enablesignal |
3 | |
4 | -- Herunterteilen des Boardtaktes
|
5 | process (CLK) |
6 | begin
|
7 | if (CLK'event and CLK = '1') then -- es gibt nur diesen Takt |
8 | if cnt16 < 15 then |
9 | cnt16 <= cnt16+1; |
10 | clk_16tel <= '0'; |
11 | else
|
12 | cnt16 <= 0; |
13 | clk_16tel <= '1'; -- Enablesignal setzen |
14 | end if; |
15 | end if; |
16 | end process; |
17 | |
18 | process (CLK) |
19 | begin
|
20 | if (CLK'event and CLK = '1') then -- es gibt nur diesen Takt |
21 | if clk_16tel ='1' then -- Enablesignal verwenden |
22 | :
|
23 | end if; |
24 | end if; |
25 | end process; |
Diese Version ist wesentlich überschaubarer. Nur weiß ich jetzt nicht genau, wie es diese Teilung auf mein Problem("Test.vhd") anwende. Wie mache ich die Ausgabe der UART über diesen Taktungsprozess?
> Wie mache ich die Ausgabe der UART über diesen Taktungsprozess?
Ja nun, dazu brauchst du einen anderen Sender, denn in dem oben
geposteten wird dieses Enable-Signal über den Zähler txcnt erzeugt.
Gut, ich habe jetzt ein enable-Signal. Aber wenn ich aus dem enablesignal einen Rechteck erzeugen will???
@Hans Hirsch:
> ...wenn ich aus dem enablesignal einen Rechteck erzeugen will???
Dann togglest Du damit ein Bit-Register und gibst den Wert aus...
Duke
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.