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

Subversion Repositories t400

[/] [t400/] [trunk/] [rtl/] [vhdl/] [t400_io_in.vhd] - Blame information for rev 179

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 45 arniml
-------------------------------------------------------------------------------
2
--
3
-- The IN port controller.
4
--
5 179 arniml
-- $Id: t400_io_in.vhd 179 2009-04-01 19:48:38Z arniml $
6 45 arniml
--
7
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
8
--
9
-- All rights reserved
10
--
11
-- Redistribution and use in source and synthezised forms, with or without
12
-- modification, are permitted provided that the following conditions are met:
13
--
14
-- Redistributions of source code must retain the above copyright notice,
15
-- this list of conditions and the following disclaimer.
16
--
17
-- Redistributions in synthesized form must reproduce the above copyright
18
-- notice, this list of conditions and the following disclaimer in the
19
-- documentation and/or other materials provided with the distribution.
20
--
21
-- Neither the name of the author nor the names of other contributors may
22
-- be used to endorse or promote products derived from this software without
23
-- specific prior written permission.
24
--
25
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
27
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
29
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
-- POSSIBILITY OF SUCH DAMAGE.
36
--
37
-- Please report bugs to the author, but before you do so, please
38
-- make sure that this is not a derivative work and that
39
-- you have the latest version of this file.
40
--
41
-- The latest version of this file can be found at:
42
--      http://www.opencores.org/cvsweb.shtml/t400/
43
--
44
-------------------------------------------------------------------------------
45
 
46
library ieee;
47
use ieee.std_logic_1164.all;
48
 
49
use work.t400_pack.all;
50
 
51
entity t400_io_in is
52
 
53
  port (
54
    -- System Interface -------------------------------------------------------
55 70 arniml
    ck_i      : in  std_logic;
56
    ck_en_i   : in  boolean;
57
    por_i     : in  boolean;
58
    icyc_en_i : in boolean;
59
    in_en_i   : in  boolean;
60 45 arniml
    -- Control Interface ------------------------------------------------------
61 70 arniml
    op_i      : in  io_in_op_t;
62
    en1_i     : in  std_logic;
63 45 arniml
    -- Port Interface ---------------------------------------------------------
64 70 arniml
    io_in_i   : in  dw_t;
65
    in_o      : out dw_t;
66
    int_o     : out boolean
67 45 arniml
  );
68
 
69
end t400_io_in;
70
 
71
 
72
architecture rtl of t400_io_in is
73
 
74
  constant idx_in3_c  : natural := 2;
75
  constant idx_in0_c  : natural := 1;
76
  constant idx_int_c  : natural := 0;
77
 
78
  type     neg_edge_t is array (natural range 1 downto 0) of
79
                           std_logic_vector(2 downto 0);
80
  signal   neg_edge_q : neg_edge_t;
81
  signal   neg_edge_s : std_logic_vector(2 downto 0);
82
 
83
  signal   il_q       : std_logic_vector(1 downto 0);
84 70 arniml
  signal   int_q,
85
           int_icyc_q : boolean;
86 45 arniml
 
87
begin
88
 
89
  -----------------------------------------------------------------------------
90
  -- Process seq
91
  --
92
  -- Purpose:
93
  --   Implements the sequential elements.
94
  --
95
  seq: process (ck_i, por_i)
96
    variable neg_edge_v : std_logic_vector(2 downto 0);
97
  begin
98
    if por_i then
99 52 arniml
      neg_edge_q <= (others => (others => '0'));
100 45 arniml
      il_q       <= (others => '0');
101 70 arniml
      int_q      <= false;
102
      int_icyc_q <= false;
103 45 arniml
 
104
    elsif ck_i'event and ck_i = '1' then
105
      -- negative edge detector filp-flops ------------------------------------
106 52 arniml
      neg_edge_v(idx_in3_c) := to_X01(io_in_i(3));
107
      neg_edge_v(idx_in0_c) := to_X01(io_in_i(0));
108
      neg_edge_v(idx_int_c) := to_X01(io_in_i(1));
109 45 arniml
 
110
      if in_en_i then
111
        neg_edge_q(0) <= neg_edge_v;
112
        neg_edge_q(1) <= neg_edge_q(0) or neg_edge_v;
113
      end if;
114
 
115
      -- IL latches -----------------------------------------------------------
116
      if in_en_i then
117
        if neg_edge_q(1)(idx_in3_c) = '1' and
118
           ((neg_edge_q(0)(idx_in3_c) or neg_edge_v(idx_in3_c)) = '0') then
119
          il_q(1) <= '1';
120
        end if;
121
        if neg_edge_q(1)(idx_in0_c) = '1' and
122
           ((neg_edge_q(0)(idx_in0_c) or neg_edge_v(idx_in0_c)) = '0') then
123
          il_q(0) <= '1';
124
        end if;
125
      end if;
126
 
127 70 arniml
      -- Interrupt trigger ----------------------------------------------------
128
      if in_en_i then
129
        if neg_edge_q(1)(idx_int_c) = '1' and
130
           ((neg_edge_q(0)(idx_int_c) or neg_edge_v(idx_int_c)) = '0') then
131
          int_q <= true;
132
        end if;
133
      end if;
134
      if icyc_en_i then
135
        -- delay interrupt request until end of current instruction
136
        -- this ensures that the interrupt is valid for a full instruction
137
        -- (i.e. the next one)
138
        int_icyc_q <= int_q;
139
      end if;
140
 
141 45 arniml
      if ck_en_i then
142
        if op_i = IOIN_INIL then
143
          il_q <= (others => '0');
144
        end if;
145 70 arniml
 
146
        if op_i = IOIN_INTACK then
147
          int_q      <= false;
148
          int_icyc_q <= false;
149
        end if;
150 45 arniml
      end if;
151
 
152
    end if;
153
  end process seq;
154
  --
155
  -----------------------------------------------------------------------------
156
 
157
 
158
  -----------------------------------------------------------------------------
159
  -- Output mapping
160
  -----------------------------------------------------------------------------
161
  in_o  <=   il_q(1) & "00" & il_q(0)
162
           when op_i = IOIN_INIL else
163
             io_in_i;
164 70 arniml
  int_o <= int_icyc_q;
165 45 arniml
 
166
end rtl;

powered by: WebSVN 2.1.0

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