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

Subversion Repositories System68

[/] [System68/] [trunk/] [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 6 dilbert57
-- Purpose        : Implements 2 x 8 bit parallel I/O ports
11 4 dilbert57
--                  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 6 dilbert57
--      9th Jan 2004   0.2                                John Kent
30
-- Turned into two port device.
31 4 dilbert57
--===========================================================================----
32
--
33
-- Memory Map
34
--
35
-- IO + $00 - Port A Data register
36
-- IO + $01 - Port B Data register
37 6 dilbert57
-- IO + $02 - Port A Data Direction Register
38
-- IO + $03 - Port B Data Direction Register
39 4 dilbert57
--
40
 
41
library ieee;
42
use ieee.std_logic_1164.all;
43
use ieee.std_logic_unsigned.all;
44
 
45
entity ioport is
46
        port (
47
         clk       : in  std_logic;
48
    rst       : in  std_logic;
49
    cs        : in  std_logic;
50
    rw        : in  std_logic;
51 6 dilbert57
    addr      : in  std_logic_vector(1 downto 0);
52 4 dilbert57
    data_in   : in  std_logic_vector(7 downto 0);
53
         data_out  : out std_logic_vector(7 downto 0);
54
         porta_io  : inout std_logic_vector(7 downto 0);
55 6 dilbert57
         portb_io  : inout std_logic_vector(7 downto 0) );
56 4 dilbert57
end;
57
 
58
architecture ioport_arch of ioport is
59
signal porta_ddr : std_logic_vector(7 downto 0);
60
signal portb_ddr : std_logic_vector(7 downto 0);
61
signal porta_data : std_logic_vector(7 downto 0);
62
signal portb_data : std_logic_vector(7 downto 0);
63
 
64
begin
65
 
66
 
67
--------------------------------
68
--
69
-- read I/O port
70
--
71
--------------------------------
72
 
73
ioport_read : process( addr,
74 6 dilbert57
                     porta_ddr, portb_ddr,
75
                                                        porta_data, portb_data,
76
                                                   porta_io, portb_io )
77 4 dilbert57
variable count : integer;
78
begin
79
      case addr is
80 6 dilbert57
             when "00" =>
81 4 dilbert57
                    for count in 0 to 7 loop
82
            if porta_ddr(count) = '1' then
83
              data_out(count) <= porta_data(count);
84
            else
85
              data_out(count) <= porta_io(count);
86
            end if;
87
                         end loop;
88
 
89 6 dilbert57
                  when "01" =>
90 4 dilbert57
                    for count in 0 to 7 loop
91
            if portb_ddr(count) = '1' then
92
              data_out(count) <= portb_data(count);
93
            else
94
              data_out(count) <= portb_io(count);
95
            end if;
96
                         end loop;
97
 
98 6 dilbert57
             when "10" =>
99 4 dilbert57
                    data_out <= porta_ddr;
100 6 dilbert57
                  when "11" =>
101 4 dilbert57
                    data_out <= portb_ddr;
102
                  when others =>
103
                    data_out <= "00000000";
104
                end case;
105
end process;
106
 
107
---------------------------------
108
--
109
-- Write I/O ports
110
--
111
---------------------------------
112
 
113
ioport_write : process( clk, rst, addr, cs, rw, data_in,
114 6 dilbert57
                        porta_data, portb_data,
115
                                                                porta_ddr, portb_ddr )
116 4 dilbert57
begin
117
  if clk'event and clk = '1' then
118
    if rst = '1' then
119
      porta_data <= "00000000";
120
      portb_data <= "00000000";
121
      porta_ddr <= "00000000";
122
      portb_ddr <= "00000000";
123
    elsif cs = '1' and rw = '0' then
124
      case addr is
125 6 dilbert57
             when "00" =>
126 4 dilbert57
                    porta_data <= data_in;
127
                    portb_data <= portb_data;
128
                    porta_ddr  <= porta_ddr;
129
                    portb_ddr  <= portb_ddr;
130 6 dilbert57
                  when "01" =>
131 4 dilbert57
                    porta_data <= porta_data;
132
                    portb_data <= data_in;
133
                    porta_ddr  <= porta_ddr;
134
                    portb_ddr  <= portb_ddr;
135 6 dilbert57
             when "10" =>
136 4 dilbert57
                    porta_data <= porta_data;
137
                    portb_data <= portb_data;
138
                    porta_ddr  <= data_in;
139
                    portb_ddr  <= portb_ddr;
140 6 dilbert57
                  when "11" =>
141 4 dilbert57
                    porta_data <= porta_data;
142
                    portb_data <= portb_data;
143
                    porta_ddr  <= porta_ddr;
144
                    portb_ddr  <= data_in;
145
                  when others =>
146
                    porta_data <= porta_data;
147
                    portb_data <= portb_data;
148
                    porta_ddr  <= porta_ddr;
149
                    portb_ddr  <= portb_ddr;
150
                end case;
151
         else
152
                    porta_data <= porta_data;
153
                    portb_data <= portb_data;
154
                    porta_ddr  <= porta_ddr;
155
                    portb_ddr  <= portb_ddr;
156
         end if;
157
  end if;
158
end process;
159
 
160
---------------------------------
161
--
162
-- direction control port a
163
--
164
---------------------------------
165
porta_direction : process ( porta_data, porta_ddr )
166
variable count : integer;
167
begin
168
  for count in 0 to 7 loop
169
    if porta_ddr(count) = '1' then
170
      porta_io(count) <= porta_data(count);
171
    else
172
      porta_io(count) <= 'Z';
173
    end if;
174
  end loop;
175
end process;
176
---------------------------------
177
--
178
-- direction control port b
179
--
180
---------------------------------
181
portb_direction : process ( portb_data, portb_ddr )
182
variable count : integer;
183
begin
184
  for count in 0 to 7 loop
185
    if portb_ddr(count) = '1' then
186
      portb_io(count) <= portb_data(count);
187
    else
188
      portb_io(count) <= 'Z';
189
    end if;
190
  end loop;
191
end process;
192
 
193
end ioport_arch;
194
 

powered by: WebSVN 2.1.0

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