--- /dev/null
+---------------------------------------------------------------------------------\r
+-- Filename : rs232_tx_arc.vhd\r
+-- ========== \r
+-- \r
+-- Beschreibung : Versand von Daten ueber die RS232 Schnittstelle\r
+-- ==============\r
+--\r
+-- Autoren : Martin Perner, Schwarz Manfred\r
+-- =========\r
+----------------------------------------------------------------------------------\r
+\r
+library IEEE;\r
+use IEEE.std_logic_1164.all;\r
+use IEEE.numeric_std.all;\r
+\r
+use work.common_pkg.all;\r
+use work.core_pkg.all;\r
+use work.extension_uart_pkg.all;\r
+\r
+architecture beh of rs232_tx is\r
+ -- definierern der intern verwendeten Signale\r
+ type STATE_TYPE is (IDLE,SEND);\r
+ signal state, state_next : STATE_TYPE;\r
+ signal bus_tx_int, bus_tx_nxt : std_logic := '1';\r
+ signal baud_cnt,baud_cnt_next : integer := CLK_PER_BAUD;\r
+ signal cnt, cnt_next : natural range 0 to 11 := 0;\r
+ signal idle_sig, idle_sig_next : std_logic := '0';\r
+ \r
+begin\r
+ -- syncronisierungs Prozess\r
+ rs232_tx_syn : process(sys_clk, sys_res_n)\r
+ begin\r
+ if (sys_res_n = RESET_VALUE) then\r
+ -- reset\r
+ cnt <= 0;\r
+ baud_cnt <= 0;\r
+ state <= IDLE;\r
+ idle_sig <= '0';\r
+ bus_tx_int <= '1';\r
+ elsif rising_edge(sys_clk) then\r
+ -- sync Zustand, uebernehmen der next-Signale\r
+ baud_cnt <= baud_cnt_next;\r
+ cnt <= cnt_next;\r
+ state <= state_next;\r
+ idle_sig <= idle_sig_next;\r
+ bus_tx_int <= bus_tx_nxt;\r
+ end if;\r
+ end process;\r
+\r
+ bus_tx <= bus_tx_int;\r
+\r
+ -- Zustandsmaschienen Prozess\r
+ rs232_tx_state : process(state, new_tx_data, idle_sig)\r
+ begin\r
+ state_next <= state;\r
+ case state is\r
+ when IDLE =>\r
+ -- wenn neue Sendedaten anliegen wird in den Zustand SEND gewechselt\r
+ if new_tx_data = '1' then\r
+ state_next <= SEND;\r
+ end if;\r
+ when SEND =>\r
+ -- wenn das Byte inklusive Start- und Stopbit versendet wurde, geht \r
+ -- der Prozess wieder in den IDLE Zustand.\r
+ if idle_sig = '1' then\r
+ state_next <= IDLE;\r
+ end if;\r
+ end case;\r
+ end process;\r
+\r
+ -- Ausgabe Logik\r
+ rs232_tx_baud : process(sys_clk, sys_res_n, state, baud_cnt, cnt, tx_data, bus_tx_int)\r
+ begin \r
+ -- Solang idle_sig auf 0 ist wird im SEND Zustand verblieben\r
+ idle_sig_next <= '0';\r
+ bus_tx_nxt <= bus_tx_int;\r
+ cnt_next <= cnt;\r
+ baud_cnt_next <= baud_cnt;\r
+\r
+ case state is\r
+ when IDLE =>\r
+ -- tx-Signale im idle Zustand halten\r
+ tx_rdy <= '1';\r
+ baud_cnt_next <= CLK_PER_BAUD;\r
+ when SEND =>\r
+ -- Signalisiert dass gerade ein Byte versendet wird \r
+ tx_rdy <= '0';\r
+ -- Counter erhoehen um die Zeit einer Bitdauer abzuwarten\r
+ baud_cnt_next <= baud_cnt + 1;\r
+ if baud_cnt = CLK_PER_BAUD then \r
+ -- wenn die Bitdauer erreicht ist, Counter reseten\r
+ baud_cnt_next <= 0;\r
+ -- Counter um die einzelen Bits zu versenden\r
+ cnt_next <= cnt + 1;\r
+ case cnt is\r
+ when 0 =>\r
+ -- counter = 0 => Startbit versenden\r
+ bus_tx_nxt <= '0';\r
+ when 9 =>\r
+ -- counter = 9 => Stopbit versenden\r
+ bus_tx_nxt <= '1';\r
+ when 10 =>\r
+ bus_tx_nxt <= '1';\r
+ cnt_next <= 0;\r
+ -- Signalisieren dass der Sendevorgang beendet ist\r
+ idle_sig_next <= '1';\r
+ when others =>\r
+ -- counter von 1 bis 8 => Datenbits versenden\r
+ bus_tx_nxt <= tx_data(cnt-1);\r
+ end case;\r
+ end if;\r
+ end case;\r
+ end process;\r
+\r
+end architecture beh;\r