Marc P. schrieb:
> Naja also sollte ich mir in einer Variable merken ob das letzte bit
> schon gesendet wurde, und erst wieder die data einlesen bzw. die
> variable rücksetzen wenn tx_start low geworden ist, zb. so:
So ein Handshake wäre auch meine bevorzugte Methode, aber die
Implementierung ist viel einfacher:
1 | uart: process(clk, clr)
|
2 | begin
|
3 |
|
4 | if clr = '1' then
|
5 | (...)
|
6 | elsif (clk'event and clk = '1') then
|
7 | case UART_Status is
|
8 | when idle => -- Es wird gewartet bis tx_start high wird
|
9 | if (tx_start = '1') then
|
10 | tx_data <= data;
|
11 | UART_Status <= start; --<<<< das brauchst du nicht wenn sich UART_Status sowieso nicht ändert....
|
12 | else
|
13 | UART_Status <= idle;
|
14 | end if;
|
15 |
|
16 | when start => -- Startbit senden
|
17 | (...)
|
18 | when hold => -- Hält das Datenbit für eine bestimmte Zeit
|
19 | (...)
|
20 | when next => -- nächstes Datenbit
|
21 | (...)
|
22 | when parity => -- Parity bit senden
|
23 | (...)
|
24 | when stop => -- Stop Bit senden
|
25 | (...)
|
26 | when check_start =>
|
27 | if (tx_start = '0') then --<<<< warten, bis tx_start wieder inaktiv
|
28 | UART_Status <= idle;
|
29 | end if;
|
30 | end case;
|
31 | end if;
|
32 | end process uart;
|
BTW:
Du hast eine recht aufwendige Implementierung über eine FSM. Lade doch
einfach den kompletten Frame incl. Start,Daten und Stopbit in ein
Schieberegister und takte das Bit für Bit raus. So etwa:
http://www.lothar-miller.de/s9y/categories/42-RS232
Das mit dem (vermutlich) asynchronen clr ist unschön und
wahrscheinlich unnötig...