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

Subversion Repositories System68

[/] [System68/] [tags/] [arelease/] [vhdl/] [ioport.vhd] - Blame information for rev 8

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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