OpenCores
URL https://opencores.org/ocsvn/system05/system05/trunk

Subversion Repositories system05

[/] [system05/] [trunk/] [rtl/] [vhdl/] [ioport.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dilbert57
--===========================================================================--
2
--
3
--  S Y N T H E Z I A B L E    ioport  Quad 8 Bit I/O port
4
--
5
--  This core adheres to the GNU public license  
6
--
7
-- File name      : ioport.vhd
8
--
9
-- Purpose        : Implements 4 x 8 bit bi-directional I/O ports
10
--                  
11
-- Dependencies   : ieee.Std_Logic_1164
12
--                  ieee.std_logic_unsigned
13
--
14
-- Uses           : None
15
--
16
-- Author         : John E. Kent      
17
--
18
--===========================================================================----
19
--
20
-- Revision History:
21
--===========================================================================--
22
--
23
-- Initial version John Kent - 6 Sept 2002
24
--      Cleaned up 30th May 2004
25
--
26
 
27
library ieee;
28
use ieee.std_logic_1164.all;
29
use ieee.std_logic_unsigned.all;
30
 
31
entity ioport is
32
        port (
33
         clk       : in  std_logic;
34
    rst       : in  std_logic;
35
    cs        : in  std_logic;
36
    rw        : in  std_logic;
37
    addr      : in  std_logic_vector(2 downto 0);
38
    data_in   : in  std_logic_vector(7 downto 0);
39
         data_out  : out std_logic_vector(7 downto 0);
40
         porta_io  : inout std_logic_vector(7 downto 0);
41
         portb_io  : inout std_logic_vector(7 downto 0);
42
         portc_io  : inout std_logic_vector(7 downto 0);
43
    portd_io  : inout std_logic_vector(7 downto 0) );
44
end;
45
 
46
architecture ioport_arch of ioport is
47
signal porta_ddr : std_logic_vector(7 downto 0);
48
signal portb_ddr : std_logic_vector(7 downto 0);
49
signal portc_ddr : std_logic_vector(7 downto 0);
50
signal portd_ddr : std_logic_vector(7 downto 0);
51
signal porta_data : std_logic_vector(7 downto 0);
52
signal portb_data : std_logic_vector(7 downto 0);
53
signal portc_data : std_logic_vector(7 downto 0);
54
signal portd_data : std_logic_vector(7 downto 0);
55
 
56
begin
57
 
58
 
59
--------------------------------
60
--
61
-- read I/O port
62
--
63
--------------------------------
64
 
65
ioport_read : process( addr,
66
                     porta_ddr, portb_ddr, portc_ddr, portd_ddr,
67
                                                        porta_data, portb_data, portc_data, portd_data,
68
                                                   porta_io, portb_io, portc_io, portd_io )
69
variable count : integer;
70
begin
71
      case addr is
72
 
73
             when "000" =>
74
                    for count in 0 to 7 loop
75
            if porta_ddr(count) = '1' then
76
              data_out(count) <= porta_data(count);
77
            else
78
              data_out(count) <= porta_io(count);
79
            end if;
80
                         end loop;
81
 
82
                  when "001" =>
83
                    for count in 0 to 7 loop
84
            if portb_ddr(count) = '1' then
85
              data_out(count) <= portb_data(count);
86
            else
87
              data_out(count) <= portb_io(count);
88
            end if;
89
                         end loop;
90
 
91
                  when "010" =>
92
                    for count in 0 to 7 loop
93
            if portc_ddr(count) = '1' then
94
              data_out(count) <= portc_data(count);
95
            else
96
              data_out(count) <= portc_io(count);
97
            end if;
98
                         end loop;
99
 
100
                  when "011" =>
101
                    for count in 0 to 7 loop
102
            if portd_ddr(count) = '1' then
103
              data_out(count) <= portd_data(count);
104
            else
105
              data_out(count) <= portd_io(count);
106
            end if;
107
                         end loop;
108
 
109
             when "100" =>
110
                    data_out <= porta_ddr;
111
 
112
                  when "101" =>
113
                    data_out <= portb_ddr;
114
 
115
                  when "110" =>
116
                    data_out <= portc_ddr;
117
 
118
                  when "111" =>
119
                    data_out <= portd_ddr;
120
 
121
                  when others =>
122
                    data_out <= "00000000";
123
                end case;
124
end process;
125
 
126
---------------------------------
127
--
128
-- Write I/O ports
129
--
130
---------------------------------
131
 
132
ioport_write : process( clk, rst, addr, cs, rw, data_in,
133
                        porta_data, portb_data, portc_data, portd_data,
134
                                                                porta_ddr, portb_ddr, portc_ddr, portd_ddr )
135
begin
136
  if clk'event and clk = '0' then
137
    if rst = '1' then
138
      porta_data <= "00000000";
139
      portb_data <= "00000000";
140
      portc_data <= "00000000";
141
      portd_data <= "00000000";
142
      porta_ddr <= "00000000";
143
      portb_ddr <= "00000000";
144
      portc_ddr <= "00000000";
145
      portd_ddr <= "00000000";
146
    elsif cs = '1' and rw = '0' then
147
      case addr is
148
             when "000" =>
149
                    porta_data <= data_in;
150
                    portb_data <= portb_data;
151
                    portc_data <= portc_data;
152
                    portd_data <= portd_data;
153
                    porta_ddr  <= porta_ddr;
154
                    portb_ddr  <= portb_ddr;
155
                    portc_ddr  <= portc_ddr;
156
                    portd_ddr  <= portd_ddr;
157
                  when "001" =>
158
                    porta_data <= porta_data;
159
                    portb_data <= data_in;
160
                    portc_data <= portc_data;
161
                    portd_data <= portd_data;
162
                    porta_ddr  <= porta_ddr;
163
                    portb_ddr  <= portb_ddr;
164
                    portc_ddr  <= portc_ddr;
165
                    portd_ddr  <= portd_ddr;
166
                  when "010" =>
167
                    porta_data <= porta_data;
168
                    portb_data <= portb_data;
169
                    portc_data <= data_in;
170
                    portd_data <= portd_data;
171
                    porta_ddr  <= porta_ddr;
172
                    portb_ddr  <= portb_ddr;
173
                    portc_ddr  <= portc_ddr;
174
                    portd_ddr  <= portd_ddr;
175
                  when "011" =>
176
                    porta_data <= porta_data;
177
                    portb_data <= portb_data;
178
                    portc_data <= portc_data;
179
                    portd_data <= data_in;
180
                    porta_ddr  <= porta_ddr;
181
                    portb_ddr  <= portb_ddr;
182
                    portc_ddr  <= portc_ddr;
183
                    portd_ddr  <= portd_ddr;
184
             when "100" =>
185
                    porta_data <= porta_data;
186
                    portb_data <= portb_data;
187
                    portc_data <= portc_data;
188
                    portd_data <= portd_data;
189
                    porta_ddr  <= data_in;
190
                    portb_ddr  <= portb_ddr;
191
                    portc_ddr  <= portc_ddr;
192
                    portd_ddr  <= portd_ddr;
193
                  when "101" =>
194
                    porta_data <= porta_data;
195
                    portb_data <= portb_data;
196
                    portc_data <= portc_data;
197
                    portd_data <= portd_data;
198
                    porta_ddr  <= porta_ddr;
199
                    portb_ddr  <= data_in;
200
                    portc_ddr  <= portc_ddr;
201
                    portd_ddr  <= portd_ddr;
202
                  when "110" =>
203
                    porta_data <= porta_data;
204
                    portb_data <= portb_data;
205
                    portc_data <= portc_data;
206
                    portd_data <= portd_data;
207
                    porta_ddr  <= porta_ddr;
208
                    portb_ddr  <= portb_ddr;
209
                    portc_ddr  <= data_in;
210
                    portd_ddr  <= portd_ddr;
211
                  when "111" =>
212
                    porta_data <= porta_data;
213
                    portb_data <= portb_data;
214
                    portc_data <= portc_data;
215
                    portd_data <= portd_data;
216
                    porta_ddr  <= porta_ddr;
217
                    portb_ddr  <= portb_ddr;
218
                    portc_ddr  <= portc_ddr;
219
                    portd_ddr  <= data_in;
220
                  when others =>
221
                    porta_data <= porta_data;
222
                    portb_data <= portb_data;
223
                    portc_data <= portc_data;
224
                    portd_data <= portd_data;
225
                    porta_ddr  <= porta_ddr;
226
                    portb_ddr  <= portb_ddr;
227
                    portc_ddr  <= portc_ddr;
228
                    portd_ddr  <= portd_ddr;
229
                end case;
230
         else
231
                    porta_data <= porta_data;
232
                    portb_data <= portb_data;
233
                    portc_data <= portc_data;
234
                    portd_data <= portd_data;
235
                    porta_ddr  <= porta_ddr;
236
                    portb_ddr  <= portb_ddr;
237
                    portc_ddr  <= portc_ddr;
238
                    portd_ddr  <= portd_ddr;
239
         end if;
240
  end if;
241
end process;
242
 
243
---------------------------------
244
--
245
-- direction control port a
246
--
247
---------------------------------
248
porta_direction : process ( porta_data, porta_ddr )
249
variable count : integer;
250
begin
251
  for count in 0 to 7 loop
252
    if porta_ddr(count) = '1' then
253
      porta_io(count) <= porta_data(count);
254
    else
255
      porta_io(count) <= 'Z';
256
    end if;
257
  end loop;
258
end process;
259
 
260
---------------------------------
261
--
262
-- direction control port b
263
--
264
---------------------------------
265
portb_direction : process ( portb_data, portb_ddr )
266
variable count : integer;
267
begin
268
  for count in 0 to 7 loop
269
    if portb_ddr(count) = '1' then
270
      portb_io(count) <= portb_data(count);
271
    else
272
      portb_io(count) <= 'Z';
273
    end if;
274
  end loop;
275
end process;
276
 
277
---------------------------------
278
--
279
-- direction control port c
280
--
281
---------------------------------
282
portc_direction : process ( portc_data, portc_ddr )
283
variable count : integer;
284
begin
285
  for count in 0 to 7 loop
286
    if portc_ddr(count) = '1' then
287
      portc_io(count) <= portc_data(count);
288
    else
289
      portc_io(count) <= 'Z';
290
    end if;
291
  end loop;
292
end process;
293
 
294
---------------------------------
295
--
296
-- direction control port d
297
--
298
---------------------------------
299
portd_direction : process ( portd_data, portd_ddr )
300
variable count : integer;
301
begin
302
  for count in 0 to 7 loop
303
    if portd_ddr(count) = '1' then
304
      portd_io(count) <= portd_data(count);
305
    else
306
      portd_io(count) <= 'Z';
307
    end if;
308
  end loop;
309
end process;
310
 
311
end ioport_arch;
312
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.