1 ---------------------------------------------------------------------------------
\r
2 -- Filename : rs232_tx_arc.vhd
\r
5 -- Beschreibung : Versand von Daten ueber die RS232 Schnittstelle
\r
8 -- Autoren : Martin Perner, Schwarz Manfred
\r
10 ----------------------------------------------------------------------------------
\r
13 use IEEE.std_logic_1164.all;
\r
14 use IEEE.numeric_std.all;
\r
16 use work.common_pkg.all;
\r
17 use work.core_pkg.all;
\r
18 use work.extension_uart_pkg.all;
\r
20 architecture beh of rs232_tx is
\r
21 -- definierern der intern verwendeten Signale
\r
22 type STATE_TYPE is (IDLE,SEND);
\r
23 signal state, state_next : STATE_TYPE;
\r
24 signal bus_tx_int, bus_tx_nxt : std_logic := '1';
\r
25 signal baud_cnt,baud_cnt_next : integer := CLK_PER_BAUD;
\r
26 signal cnt, cnt_next : natural range 0 to 11 := 0;
\r
27 signal idle_sig, idle_sig_next : std_logic := '0';
\r
30 -- syncronisierungs Prozess
\r
31 rs232_tx_syn : process(sys_clk, sys_res_n)
\r
33 if (sys_res_n = RESET_VALUE) then
\r
40 elsif rising_edge(sys_clk) then
\r
41 -- sync Zustand, uebernehmen der next-Signale
\r
42 baud_cnt <= baud_cnt_next;
\r
44 state <= state_next;
\r
45 idle_sig <= idle_sig_next;
\r
46 bus_tx_int <= bus_tx_nxt;
\r
50 bus_tx <= bus_tx_int;
\r
52 -- Zustandsmaschienen Prozess
\r
53 rs232_tx_state : process(state, new_tx_data, idle_sig)
\r
55 state_next <= state;
\r
58 -- wenn neue Sendedaten anliegen wird in den Zustand SEND gewechselt
\r
59 if new_tx_data = '1' then
\r
63 -- wenn das Byte inklusive Start- und Stopbit versendet wurde, geht
\r
64 -- der Prozess wieder in den IDLE Zustand.
\r
65 if idle_sig = '1' then
\r
72 rs232_tx_baud : process(sys_clk, sys_res_n, state, baud_cnt, cnt, tx_data, bus_tx_int)
\r
74 -- Solang idle_sig auf 0 ist wird im SEND Zustand verblieben
\r
75 idle_sig_next <= '0';
\r
76 bus_tx_nxt <= bus_tx_int;
\r
78 baud_cnt_next <= baud_cnt;
\r
82 -- tx-Signale im idle Zustand halten
\r
84 baud_cnt_next <= CLK_PER_BAUD;
\r
86 -- Signalisiert dass gerade ein Byte versendet wird
\r
88 -- Counter erhoehen um die Zeit einer Bitdauer abzuwarten
\r
89 baud_cnt_next <= baud_cnt + 1;
\r
90 if baud_cnt = CLK_PER_BAUD then
\r
91 -- wenn die Bitdauer erreicht ist, Counter reseten
\r
93 -- Counter um die einzelen Bits zu versenden
\r
94 cnt_next <= cnt + 1;
\r
97 -- counter = 0 => Startbit versenden
\r
100 -- counter = 9 => Stopbit versenden
\r
102 -- stop_bit 0 heißt 1 stop bit
\r
103 if stop_bit = '0' then
\r
105 idle_sig_next <= '1';
\r
109 -- stop_bit 1 heißt 2 stop bits
\r
110 if stop_bit = '1' then
\r
112 -- Signalisieren dass der Sendevorgang beendet ist
\r
113 idle_sig_next <= '1';
\r
116 -- counter von 1 bis 8 => Datenbits versenden
\r
117 bus_tx_nxt <= tx_data(cnt-1);
\r
123 end architecture beh;
\r