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