9b5a582f3f9d84235ee4e797fc6b214020df38bc
[calu.git] / cpu / src / rs232_tx_arc.vhd
1 ---------------------------------------------------------------------------------
2 -- Filename : rs232_tx_arc.vhd
3 -- ========== 
4 -- 
5 -- Beschreibung : Versand von Daten ueber die RS232 Schnittstelle
6 -- ==============
7 --
8 -- Autoren : Martin Perner, Schwarz Manfred
9 -- =========
10 ----------------------------------------------------------------------------------
11
12 library IEEE;
13 use IEEE.std_logic_1164.all;
14 use IEEE.numeric_std.all;
15
16 use work.common_pkg.all;
17 use work.core_pkg.all;
18 use work.extension_uart_pkg.all;
19
20 architecture beh of rs232_tx is
21         -- definierern der intern verwendeten Signale
22         type STATE_TYPE is (IDLE,SEND);
23         signal state, state_next : STATE_TYPE;
24         signal bus_tx_int, bus_tx_nxt : std_logic := '1';
25         signal baud_cnt,baud_cnt_next : integer := CLK_PER_BAUD;
26         signal cnt, cnt_next : natural range 0 to 11 := 0;
27         signal idle_sig, idle_sig_next : std_logic := '0';
28         
29 begin
30         -- syncronisierungs Prozess
31         rs232_tx_syn : process(sys_clk, sys_res_n)
32         begin
33                 if (sys_res_n = RESET_VALUE) then
34                         -- reset
35                         cnt <= 0;
36                         baud_cnt <= 0;
37                         state <= IDLE;
38                         idle_sig <= '0';
39                         bus_tx_int <= '1';
40                         baud_cnt <= 0;
41                 elsif rising_edge(sys_clk) then
42                         -- sync Zustand, uebernehmen der next-Signale
43                         baud_cnt <= baud_cnt_next;
44                         cnt <= cnt_next;
45                         state <= state_next;
46                         idle_sig <= idle_sig_next;
47                         bus_tx_int <= bus_tx_nxt;
48                 end if;
49         end process;
50
51         bus_tx <= bus_tx_int;
52
53         -- Zustandsmaschienen Prozess
54         rs232_tx_state : process(state, new_tx_data, idle_sig)
55         begin
56                 state_next <= state;
57                 case state is
58                         when IDLE =>
59                                 -- wenn neue Sendedaten anliegen wird in den Zustand SEND gewechselt
60                                 if new_tx_data = '1' then
61                                         state_next <= SEND;
62                                 end if;
63                         when SEND =>
64                                 -- wenn das Byte inklusive Start- und Stopbit versendet wurde, geht 
65                                 -- der Prozess wieder in den IDLE Zustand.
66                                 if idle_sig = '1' then
67                                         state_next <= IDLE;
68                                 end if;
69                         end case;
70         end process;
71
72         -- Ausgabe Logik
73         rs232_tx_baud : process(sys_clk, sys_res_n, state, baud_cnt, cnt, tx_data, bus_tx_int,stop_bit, bd_rate)
74         begin 
75                 -- Solang idle_sig auf 0 ist wird im SEND Zustand verblieben
76                 idle_sig_next <= '0';
77                 bus_tx_nxt <= bus_tx_int;
78                 cnt_next <= cnt;
79                 baud_cnt_next <= baud_cnt;
80
81                 case state is
82                         when IDLE =>
83                                 -- tx-Signale im idle Zustand halten
84                                 tx_rdy <= '1';
85                                 baud_cnt_next <= CLK_PER_BAUD;
86                         when SEND =>
87                                 -- Signalisiert dass gerade ein Byte versendet wird 
88                                 tx_rdy <= '0';
89                                 -- Counter erhoehen um die Zeit einer Bitdauer abzuwarten
90                                 baud_cnt_next <= baud_cnt + 1;
91                                 if baud_cnt = bd_rate then 
92                                         -- wenn die Bitdauer erreicht ist, Counter reseten
93                                         baud_cnt_next <= 0;
94                                         -- Counter um die einzelen Bits zu versenden
95                                         cnt_next <= cnt + 1;
96                                         case cnt is
97                                                 when 0 =>
98                                                         -- counter = 0 => Startbit versenden
99                                                         bus_tx_nxt <= '0';
100                                                 when 9 =>
101                                                         -- counter = 9 => Stopbit versenden
102                                                         bus_tx_nxt <= '1';
103                                                         -- stop_bit 0 heit 1 stop bit
104                                                         if stop_bit = '0' then 
105                                                                 cnt_next <= 0;
106                                                                 idle_sig_next <= '1';
107                                                         end if;         
108                                                 when 10 =>
109                                                         bus_tx_nxt <= '1';
110                                                         -- stop_bit 1 heit 2 stop bits
111                                                         if stop_bit = '1' then 
112                                                                 cnt_next <= 0;
113                                                                 -- Signalisieren dass der Sendevorgang beendet ist
114                                                                 idle_sig_next <= '1';
115                                                         end if;
116                                                 when others =>
117                                                         -- counter von 1 bis 8 => Datenbits versenden
118                                                         bus_tx_nxt <= tx_data(cnt-1);
119                                         end case;
120                                 end if;
121                 end case;
122         end process;
123
124 end architecture beh;