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