38
5.7. Transmisia pe UART
Figure 47: Componentele UART TX și UART RX
Așa cum se poate vedea și în Figure 47: Componentele UART TX și UART RX , o componentă UART
de transmisie va avea următoarele semnale de intrare: data_TX pe 8 biți ce va trebui serializată, un semnal
de start pentru transmisie și clock-ul prin care se va calcula timpul la care trebuie schimbat bitul de
transmisie în funcție de baud rate-ul utilizat.
Semnalele de ieșire sunt următoarele: TX – pe un bit ce reprezintă data_TX[7:0] serializată, și un pin ce
semnalizează terminarea transmisiei. Bineînțeles că această componentă poate fi generalizată utilizând ca
parametri generici baud rate-ul și frecvența clock-ului, așa cum se întâmplă în exemplul dat din anexă la
componenta UART_TX.vhd.
Pentru a realiza o componentă de comunicație UART, avem nevoie de două numărătoare; primul va
realiza Baud Rate, iar al doilea va fi utilizat pentru reținerea stării în care se află transmisia. Astfel, starea 0
este bitul de START, starea 1 este bitul 0 de date, starea 2 este bitul 1 de date, și așa mai departe până la
starea 8, care reține bitul 7 de date. Urmează starea 9 ce reține bitul de paritate (dacă se dorește
implementarea sa, altfel aceasta se ignoră), starea a 10-a este cea de stop, iar la final este starea a 11-a, ce
reține starea IDLE. Această ultimă stare, starea IDLE, va putea lipsi atunci când se cunoaște următorul
caracter ce va fi transmis și dorim ca transmisia să se realizeze cât mai repede, fără pauze suplimentare.
Practic, starea aceasta va fi utilizată doar când nu se știe următorul caracter transmis pe UART și, ca urmare,
această stare este o stare de așteptare până se dorește transmiterea următorului caracter.
Cu alte cuvinte, stările 0 - 10 reprezintă stări cu transmisie de date, iar starea a 11-a va fi o stare de
așteptare a unei noi comenzi de transmisie.
O metodă simplă de implementare a stărilor, mai intuitivă decât utilizarea unui numărător, este
utilizarea unei mașini de stări, așa cum a fost procedat și în componenta UART_TX.vhd din anexă, utilizând
codul VHDL următor:
type state_type is (S_wait, S_start, S_b0, S_b1, S_b2, S_b3, S_b4, S_b5, S_b6, S_b7, S_stop);
signal st: state_type := S_wait;
După cum se vede, avem următoarele stări:
- “S_wait” – echivalentă stării IDLE. Se așteaptă până se detectează comanda de start
- “S_start” – se intră în această stare când se detectează bitul de start
- “S_b0” – .... – “S_b7” – stările în care se transmit biții 0 – 7
- “S_stop” – starea în care se transmite bitul de stop.
Pentru optimizare, în cod se poate renunța la starea S_wait și practic starea S_stop va implementa atât
starea STOP, cât și starea IDLE. Acest lucru poate fi realizat deoarece starea IDLE este ca o prelungire a stării
STOP, iar data de pe pinul TX va avea exact aceeași valoare, și anume ‘1’. Această implementare este
realizată deja în componenta UART_TX.vhd din anexă.
Notă: în componenta dată ca exemplu nu este implementat bitul de paritate, iar starea de STOP este pe
un singur bit.