1 ---------------------------------------------------------------------------------
2 -- Filename : rs232_tx_arc.vhd
5 -- Beschreibung : Versand von Daten ueber die RS232 Schnittstelle
8 -- Autoren : Martin Perner, Schwarz Manfred
10 ----------------------------------------------------------------------------------
13 use IEEE.std_logic_1164.all;
14 use IEEE.numeric_std.all;
16 use work.extension_uart_pkg.all;
18 use work.common_pkg.all;
19 use work.core_pkg.all;
21 architecture beh of rs232_tx is
22 -- definierern der intern verwendeten Signale
23 type STATE_TYPE is (IDLE,SEND);
24 signal state, state_next : STATE_TYPE;
25 signal bus_tx_int, bus_tx_nxt : std_logic := '1';
26 signal baud_cnt,baud_cnt_next : integer := 0;
27 signal cnt, cnt_next : natural range 0 to 11 := 0;
28 signal idle_sig, idle_sig_next : std_logic := '0';
31 -- syncronisierungs Prozess
32 rs232_tx_syn : process(sys_clk, sys_res_n)
34 if (sys_res_n = RESET_VALUE) then
42 elsif rising_edge(sys_clk) then
43 -- sync Zustand, uebernehmen der next-Signale
44 baud_cnt <= baud_cnt_next;
47 idle_sig <= idle_sig_next;
48 bus_tx_int <= bus_tx_nxt;
54 -- Zustandsmaschienen Prozess
55 rs232_tx_state : process(state, new_tx_data, idle_sig)
60 -- wenn neue Sendedaten anliegen wird in den Zustand SEND gewechselt
61 if new_tx_data = '1' then
65 -- wenn das Byte inklusive Start- und Stopbit versendet wurde, geht
66 -- der Prozess wieder in den IDLE Zustand.
67 if idle_sig = '1' then
74 rs232_tx_baud : process(sys_clk, sys_res_n, state, baud_cnt, cnt, tx_data, bus_tx_int,stop_bit, bd_rate)
76 -- Solang idle_sig auf 0 ist wird im SEND Zustand verblieben
78 bus_tx_nxt <= bus_tx_int;
80 -- Counter erhoehen um die Zeit einer Bitdauer abzuwarten
81 baud_cnt_next <= baud_cnt + 1;
85 -- tx-Signale im idle Zustand halten
88 -- TODO: wtf, typproblem
89 baud_cnt_next <= to_integer(IEEE.numeric_std.unsigned(bd_rate));
90 --baud_cnt_next <= CLK_PER_BAUD;
92 -- Signalisiert dass gerade ein Byte versendet wird
94 if baud_cnt = bd_rate then
95 -- wenn die Bitdauer erreicht ist, Counter reseten
97 -- Counter um die einzelen Bits zu versenden
101 -- counter = 0 => Startbit versenden
104 -- counter = 9 => Stopbit versenden
108 -- stop_bit 1 heit 2 stop bits
109 if stop_bit = '0' then
111 -- Signalisieren dass der Sendevorgang beendet ist
112 idle_sig_next <= '1';
117 -- Signalisieren dass der Sendevorgang beendet ist
118 idle_sig_next <= '1';
120 -- counter von 1 bis 8 => Datenbits versenden
121 bus_tx_nxt <= tx_data(cnt-1);
127 end architecture beh;