+---------------------------------------------------------------------------------\r
+-- Filename : rs232_rx_arc.vhd\r
+-- ========== \r
+-- \r
+-- Beschreibung : Empfang 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_rx is\r
+ -- definierern der intern verwendeten Signale\r
+ type STATE_TYPE is (IDLE, READ_START, READ_BIT, READ_STOP, POST_STOP);\r
+ signal state, state_next : STATE_TYPE;\r
+ signal bus_rx_last, bus_rx_int, new_rx_data_nxt : std_logic := '0';\r
+ signal cnt, cnt_next : integer := 0;\r
+ signal baud_cnt, baud_cnt_next : integer := 0;\r
+ signal rx_data_int, rx_data_nxt, rx_data_res_int, rx_data_res_nxt : uart_data;\r
+ \r
+begin\r
+ -- syncronisierungs Prozess\r
+ rs232_rx_syn : process(sys_clk, sys_res_n)\r
+ begin\r
+ if (sys_res_n = RESET_VALUE) then\r
+ -- reset Zustand\r
+ state <= IDLE;\r
+ cnt <= 0;\r
+ rx_data_res_int <= x"00";\r
+\r
+ elsif rising_edge(sys_clk) then\r
+ -- sync Zustand, uebernehmen der next-Signale\r
+ state <= state_next;\r
+ cnt <= cnt_next;\r
+ baud_cnt <= baud_cnt_next;\r
+ bus_rx_int <= bus_rx_last;\r
+ rx_data_int <= rx_data_nxt;\r
+ rx_data_res_int <= rx_data_res_nxt;\r
+ new_rx_data <= new_rx_data_nxt;\r
+\r
+ end if;\r
+ end process;\r
+\r
+ -- setzen des Ausgangsignals, Rxt-Daten\r
+ rx_data <= rx_data_res_int;\r
+\r
+ -- Zustandsmaschienen Prozess\r
+ rs232_states : process(sys_clk,state,cnt, bus_rx, bus_rx_last, baud_cnt,bus_rx_int)\r
+ begin\r
+ state_next <= state; -- mal schauen ob des so geht\r
+ bus_rx_last <= bus_rx; -- mal schauen ob des so geht\r
+ case state is\r
+ when IDLE =>\r
+ -- nach einem Wechsel der rxt-Leitung von 1 auf 0 wird der einlese Vorgang\r
+ -- getriggert mithilfe eines Zustandsuebergangs von IDLE auf READ_START\r
+ if (bus_rx_last = '0' and bus_rx_int = '1') then\r
+ state_next <= READ_START;\r
+ end if;\r
+ when READ_START =>\r
+ -- im READ_START Zustand wird eine halbe Bitzeit gewartet. Liegt auf der rxt-Leitung\r
+ -- immer noch die 0 an so wird mit deim Lesebvorgang mit einem Zustandswechsel von\r
+ -- READ_START nach READ_BIT vorgefahren, wenn eine 1 anliegt wird abgebrochen und\r
+ -- wieder nach IDLE gewechselt\r
+ if (bus_rx = '0' and baud_cnt = CLK_PER_BAUD/2) then\r
+ state_next <= READ_BIT;\r
+ elsif (bus_rx = '1' and baud_cnt = CLK_PER_BAUD/2) then\r
+ state_next <= IDLE;\r
+ end if;\r
+ when READ_BIT =>\r
+ -- hier werden mit Hilfe eines Countersignals 8 Datenbits im Abstand der eingestellten\r
+ -- Bitzeit eingelesen und gespeichert.\r
+ -- Nach beendigung wird in den Zustand READ_STOP gewechselt.\r
+ if (cnt = 7 and baud_cnt = CLK_PER_BAUD) then\r
+ state_next <= READ_STOP;\r
+ else\r
+ state_next <= READ_BIT;\r
+ end if;\r
+ when READ_STOP =>\r
+ -- hier wird nur noch auf das Stopbit abgewartet und gelesen um den\r
+ -- Lesevorgang koerrekt zu beenden\r
+ if baud_cnt = CLK_PER_BAUD and bus_rx = '1' then\r
+ state_next <= POST_STOP;\r
+ elsif baud_cnt = CLK_PER_BAUD and bus_rx = '0' then\r
+ state_next <= IDLE;\r
+ end if;\r
+ when POST_STOP =>\r
+ -- hier wird nur noch eine halbe Bitzeit gewartet\r
+ if baud_cnt = CLK_PER_BAUD/2 then\r
+ state_next <= IDLE;\r
+ end if;\r
+ end case;\r
+ end process;\r
+\r
+ -- Ausgabe Logik\r
+ rs232_tx_baud : process(state, cnt, bus_rx, baud_cnt, rx_data_int, rx_data_res_int)\r
+ begin\r
+ -- Signale halten um Latches zu vermeiden\r
+ cnt_next <= cnt;\r
+ new_rx_data_nxt <= '0';\r
+ baud_cnt_next <= baud_cnt;\r
+ rx_data_nxt <= rx_data_int;\r
+ rx_data_res_nxt <= rx_data_res_int;\r
+ -- Statewechesel wie obenbeschrieben\r
+ case state is\r
+ when IDLE =>\r
+ baud_cnt_next <= 0;\r
+ when READ_START =>\r
+ -- baut_cnt zyklenweise erhoehen bis es einer halben Bitzeit entspricht\r
+ -- anschliessend zuruecksetzten\r
+ baud_cnt_next <= baud_cnt + 1;\r
+ if baud_cnt = CLK_PER_BAUD/2 then \r
+ baud_cnt_next <= 0;\r
+ rx_data_nxt <= x"00";\r
+ end if;\r
+ when READ_BIT =>\r
+ -- baut_cnt zyklenweise erhoehen bis es einer Bitzeit entspricht\r
+ -- anschliessend zuruecksetzen\r
+ -- Zustand der rxt-Leitung im rx_data_nxt abspeichern\r
+ baud_cnt_next <= baud_cnt + 1;\r
+ if baud_cnt = CLK_PER_BAUD then \r
+ baud_cnt_next <= 0;\r
+ cnt_next <= cnt+1;\r
+ rx_data_nxt(cnt) <= bus_rx;\r
+ end if;\r
+ when READ_STOP =>\r
+ -- baut_cnt zyklenweise erhoehen bis es einer Bitzeit entspricht\r
+ -- anschliessend zuruecksetzen\r
+ -- Counter reseten\r
+ -- Signal fuer neue rx-Daten setzen um die send_logic zu aktivieren\r
+ cnt_next <= 0;\r
+ baud_cnt_next <= baud_cnt + 1;\r
+ if baud_cnt = CLK_PER_BAUD then \r
+ baud_cnt_next <= 0;\r
+ end if;\r
+ when POST_STOP =>\r
+ --halbe bitzeit wartenr auf counter warten\r
+ baud_cnt_next <= baud_cnt + 1;\r
+ if baud_cnt = CLK_PER_BAUD/2 then \r
+ new_rx_data_nxt <= '1'; \r
+ rx_data_res_nxt <= rx_data_int;\r
+ baud_cnt_next <= 0;\r
+ end if;\r
+ end case;\r
+ end process;\r
+\r
+end architecture beh;\r
+\r