471a9c4108f0242e68794514cf185e5075499477
[calu.git] / cpu / src / extension_uart_b.vhd
1 library IEEE;
2 use IEEE.std_logic_1164.all;
3 use IEEE.numeric_std.all;
4
5 use work.common_pkg.all;
6 use work.core_pkg.all;
7
8 use work.mem_pkg.all;
9 use work.extension_uart_pkg.all;
10
11 architecture behav of extension_uart is
12
13 signal int_rec,int_rec_nxt : extmod_rec;
14 signal w1_st_co, w1_st_co_nxt, w2_wewillsee, w2_wewillsee_nxt, w3_wewillsee, w3_wewillsee_nxt, w4_wewillsee, w4_wewillsee_nxt : gp_register_t;
15 signal new_tx_data, tx_busy : std_logic;
16
17 begin
18
19
20 rs232_tx_inst : rs232_tx
21 port map(
22         --System inputs
23         clk,
24         reset,
25
26         --Bus
27         bus_tx,
28
29         --From/to sendlogic
30         new_tx_data,
31         w3_wewillsee(byte_t'range),
32         tx_busy
33 );
34
35
36
37
38
39 syn : process (clk, reset)
40 begin
41         if (reset = RESET_VALUE) then
42                 int_rec.sel <= '0';
43                 int_rec.wr_en <= '0';
44                 int_rec.byte_en <= (others=>'0');
45                 int_rec.data <= (others=>'0');
46                 int_rec.addr <= (others=>'0');
47
48
49         elsif rising_edge(clk) then
50                 int_rec <= int_rec_nxt;              
51
52
53         end if;
54 end process syn;
55
56 -------------------------- LESEN UND SCHREIBEN ANFANG ------------------------------------------------------------
57
58 gwriten : process (ext_reg)
59
60 begin
61         if ext_reg.sel = '1' and ext_reg.wr_en = '1' then
62                 int_rec_nxt <= ext_reg;
63         end if;
64 end process gwriten;
65
66 gread : process (clk,ext_reg)
67
68 variable tmp_data  : gp_register_t;
69
70 begin
71         if ext_reg.sel = '1' and ext_reg.wr_en = '0' then
72                 case ext_reg.addr(1 downto 0) is
73                 when "00" => 
74                         tmp_data := (others =>'0');                     
75                         if ext_reg.byte_en(0) = '1' then
76                                 tmp_data(byte_t'range) := w1_st_co(byte_t'range);
77                         end if;
78                         if ext_reg.byte_en(1) = '1' then
79                                 tmp_data((2*byte_t'length-1) downto byte_t'length) := w1_st_co((2*byte_t'length-1) downto byte_t'length);
80                         end if;
81                         if ext_reg.byte_en(2) = '1' then
82                                 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := w1_st_co((3*byte_t'length-1) downto 2*byte_t'length);
83                         end if;
84                         if ext_reg.byte_en(3) = '1' then
85                                 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := w1_st_co((4*byte_t'length-1) downto 3*byte_t'length);
86                         end if;
87                         data_out <= tmp_data;
88                 when "01" =>
89                         tmp_data := (others =>'0');                     
90                         if ext_reg.byte_en(0) = '1' then
91                                 tmp_data(byte_t'range) := w2_wewillsee(byte_t'range);
92                         end if;
93                         if ext_reg.byte_en(1) = '1' then
94                                 tmp_data((2*byte_t'length-1) downto byte_t'length) := w2_wewillsee((2*byte_t'length-1) downto byte_t'length);
95                         end if;
96                         if ext_reg.byte_en(2) = '1' then
97                                 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := w2_wewillsee((3*byte_t'length-1) downto 2*byte_t'length);
98                         end if;
99                         if ext_reg.byte_en(3) = '1' then
100                                 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := w2_wewillsee((4*byte_t'length-1) downto 3*byte_t'length);
101                         end if;
102                         data_out <= tmp_data;
103                 when "10" =>
104                         tmp_data := (others =>'0');                     
105                         if ext_reg.byte_en(0) = '1' then
106                                 tmp_data(byte_t'range) := w3_wewillsee(byte_t'range);
107                         end if;
108                         if ext_reg.byte_en(1) = '1' then
109                                 tmp_data((2*byte_t'length-1) downto byte_t'length) := w3_wewillsee((2*byte_t'length-1) downto byte_t'length);
110                         end if;
111                         if ext_reg.byte_en(2) = '1' then
112                                 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := w3_wewillsee((3*byte_t'length-1) downto 2*byte_t'length);
113                         end if;
114                         if ext_reg.byte_en(3) = '1' then
115                                 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := w3_wewillsee((4*byte_t'length-1) downto 3*byte_t'length);
116                         end if;
117                         data_out <= tmp_data;
118                 when "11" =>
119                         tmp_data := (others =>'0');                     
120                         if ext_reg.byte_en(0) = '1' then
121                                 tmp_data(byte_t'range) := w4_wewillsee(byte_t'range);
122                         end if;
123                         if ext_reg.byte_en(1) = '1' then
124                                 tmp_data((2*byte_t'length-1) downto byte_t'length) := w4_wewillsee((2*byte_t'length-1) downto byte_t'length);
125                         end if;
126                         if ext_reg.byte_en(2) = '1' then
127                                 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := w4_wewillsee((3*byte_t'length-1) downto 2*byte_t'length);
128                         end if;
129                         if ext_reg.byte_en(3) = '1' then
130                                 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := w4_wewillsee((4*byte_t'length-1) downto 3*byte_t'length);
131                         end if;
132                         data_out <= tmp_data;
133                 when others => null;
134                 end case;
135         else
136                 data_out  <= (others=>'0');             
137         end if;
138 end process gread;
139
140 proc_data : process (clk,int_rec)
141
142 variable tmp_data  : gp_register_t;
143
144 begin
145                 case int_rec.addr(1 downto 0) is
146                 when "00" => 
147                         tmp_data := (others =>'0');                     
148                         if int_rec.byte_en(0) = '1' then
149                                 tmp_data(byte_t'range) :=int_rec.data(byte_t'range);
150                         end if;
151                         if int_rec.byte_en(1) = '1' then
152                                 tmp_data((2*byte_t'length-1) downto byte_t'length) := int_rec.data((2*byte_t'length-1) downto byte_t'length);
153                         end if;
154                         if int_rec.byte_en(2) = '1' then
155                                 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := int_rec.data((3*byte_t'length-1) downto 2*byte_t'length);
156                         end if;
157                         if int_rec.byte_en(3) = '1' then
158                                 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := int_rec.data((4*byte_t'length-1) downto 3*byte_t'length);
159                         end if;
160                         w1_st_co_nxt <= tmp_data;
161                 when "01" =>
162                         tmp_data := (others =>'0');                     
163                         if int_rec.byte_en(0) = '1' then
164                                 tmp_data(byte_t'range) := int_rec.data(byte_t'range);
165                         end if;
166                         if int_rec.byte_en(1) = '1' then
167                                 tmp_data((2*byte_t'length-1) downto byte_t'length) := int_rec.data((2*byte_t'length-1) downto byte_t'length);
168                         end if;
169                         if int_rec.byte_en(2) = '1' then
170                                 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := int_rec.data((3*byte_t'length-1) downto 2*byte_t'length);
171                         end if;
172                         if int_rec.byte_en(3) = '1' then
173                                 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := int_rec.data((4*byte_t'length-1) downto 3*byte_t'length);
174                         end if;
175                         w2_wewillsee_nxt <= tmp_data;
176                 when "10" =>
177                         tmp_data := (others =>'0');                     
178                         if int_rec.byte_en(0) = '1' then
179                                  tmp_data(byte_t'range) :=int_rec.data(byte_t'range);
180                         end if;
181                         if int_rec.byte_en(1) = '1' then
182                                  tmp_data((2*byte_t'length-1) downto byte_t'length) := int_rec.data((2*byte_t'length-1) downto byte_t'length);
183                         end if;
184                         if int_rec.byte_en(2) = '1' then
185                                  tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := int_rec.data((3*byte_t'length-1) downto 2*byte_t'length);
186                         end if;
187                         if int_rec.byte_en(3) = '1' then
188                                  tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := int_rec.data((4*byte_t'length-1) downto 3*byte_t'length);
189                         end if;
190                         w3_wewillsee_nxt <= tmp_data;
191                 when "11" =>
192                         tmp_data := (others =>'0');                     
193                         if int_rec.byte_en(0) = '1' then
194                                  tmp_data(byte_t'range) := w4_wewillsee(byte_t'range);
195                         end if;
196                         if int_rec.byte_en(1) = '1' then
197                                  tmp_data((2*byte_t'length-1) downto byte_t'length) := int_rec.data((2*byte_t'length-1) downto byte_t'length);
198                         end if;
199                         if int_rec.byte_en(2) = '1' then
200                                  tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := int_rec.data((3*byte_t'length-1) downto 2*byte_t'length);
201                         end if;
202                         if int_rec.byte_en(3) = '1' then
203                                  tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := int_rec.data((4*byte_t'length-1) downto 3*byte_t'length);
204                         end if;
205                         w4_wewillsee_nxt <= tmp_data;
206                 when others => null;
207                 end case;
208 end process proc_data;
209
210 -------------------------- LESEN UND SCHREIBEN ENDE ---------------------------------------------------------------
211
212 -------------------------- INTERNE VERARBEITUNG ANFANG ------------------------------------------------------------
213
214
215
216
217
218 -------------------------- INTERNE VERARBEITUNG ENDE --------------------------------------------------------------
219
220 end behav;
221