Obsługa portu RS-232

Zadanie: Należy zaprojektować moduły nadajnika i odbiornika danych w standardzie RS-232 dla następujących parametrów transmisji: 8 bitów danych, bez bitu parzystości, jeden bit stopu, szybkość transmisji 9600bps bez sprzętowej kontroli przepływu (no flow control).
Moduły należy połączyć tak, aby odbiornik RS232 po otrzymaniu każdego znaku, podawał go do sumatora i po dodaniu wartości 20h, moduł nadajnika wysyłał go.

Porty układu:
clk_i - zegar 100MHz,
rst_i - reset asynchroniczny,
RXD_i - wejście danych,
TXD_o - wyjście danych RS232.

Należy wykonać symulację funkcjonalną oraz zweryfikować układ praktycznie poprzez zaprogramowanie płytki testowej. Weryfikacja praktyczna polega na podłączeniu wyprowadzeń zaprojektowanych modułów do portu COM komputera PC i uruchomieniu programu terminala, np. putty.
W terminalu należy ustawić identyczne parametry transmisji jak parametry w zadaniu! Naciśnięcie klawisza na klawiaturze powinno spowodować wyświetlenie znaku o zwiększonym kodzie. Dla powyższego przypadku, dodanie 20h spowoduje zamianę liter wielkich ma małe.
Płytka Nexys A7 emuluje port szeregowy poprzez połączenie USB. Więcej szczegółów dot. tego projektu znajdziesz w instrukcji obsługi płytki Nexys A7, na stronach 13 i 14.

Nadawanie i odbiór sygnałów w standardzie RS232 Nadawanie i odbiór sygnałów w standardzie RS232 odbywa się w sposób szeregowy, oddzielnie na dwóch liniach w kierunkach do i od urządzenia. W czasie braku transmisji sygnał na danej linii jest w stanie wysokim. Rozpoczęcie transmisji inicjowane jest przez tzw. bit startu będący "0" logicznym, który powinien trwać przez okres równy odwrotności prędkości transmisji, w naszym przypadku wynoszący 1/9600 [sekund]. Wszystkie następne informacje są przesyłane z identycznym okresem trwania. Następnie nadawane są szeregowo dane począwszy od najmniej znaczącego bitu aż do bitu najbardziej znaczącego (D0-D7). Później występuje bit parzystości, będący operacją logiczną XOR na danych D0-D7. Bit parzystości jest opcjonalny i w przypadku niniejszego zadania nie występuje. Zakończenie transmisji sygnalizowane jest bitami stopu, w ilości zazwyczaj od 1 do 2. Przykład sygnału, zgodnego z wymaganiami zadania, przenoszącego kod 01010011 przedstawiony jest na poniższym rysunku.

 

Transmisja RS-232
Rys.1 Przykładowa transmisja kodu 01010011 przez RS-232


Informacje dodatkowe o standardzie RS232:
http://www.fizyka.umk.pl/~ptarg/labview/folie/RS232.pdf
http://pl.wikipedia.org/wiki/RS-232

Plik "constraints" w formacie XDC do zadania, płytka Digilent Nexys A7, układ Artix-7 XC7A100T-1CSG324C (obudowa: CSG324, speed grade:-1):

#########################################################################################
# CLOCK:
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports {clk_i} ];
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_i}];
#########################################################################################
# RESET:
set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports {rst_i} ];
#########################################################################################
# RS232:
set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports {RXD_i} ];
set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports {TXD_o} ];
#########################################################################################
# DEBUG SIGNALS:
 #set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { tx_dbg_o[0] }];
#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { tx_dbg_o[1] }];
#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { tx_dbg_o[2] }];
#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { tx_dbg_o[3] }];
#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { tx_dbg_o[4] }];
#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { tx_dbg_o[5] }];
#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { tx_dbg_o[6] }];
#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { tx_dbg_o[7] }];
#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { rx_dbg_o[0] }];
#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { rx_dbg_o[1] }];
#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { rx_dbg_o[2] }];
#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { rx_dbg_o[3] }];
#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { rx_dbg_o[4] }];
#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { rx_dbg_o[5] }];
#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { rx_dbg_o[6] }];
#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { rx_dbg_o[7] }];
#########################################################################################