Support for different IO types in VHDL code.
[c4m-jtag.git] / c4m / vhdl / jtag / c4m_jtag_iocell.vhdl
1 -- An JTAG boundary scan for bidirectional I/O
2
3 library ieee;
4 use ieee.std_logic_1164.ALL;
5
6 use work.c4m_jtag.ALL;
7
8 entity c4m_jtag_iocell is
9 generic (
10 IOTYPE: IOTYPE_TYPE
11 );
12 port (
13 -- core connections
14 CORE_IN: out std_logic;
15 CORE_OUT: in std_logic;
16 CORE_EN: in std_logic;
17
18 -- pad connections
19 PAD_IN: in std_logic;
20 PAD_OUT: out std_logic;
21 PAD_EN: out std_logic;
22
23 -- BD shift register
24 BDSR_IN: in std_logic;
25 BDSR_OUT: out std_logic;
26
27 -- Mode of I/O cell
28 IOMODE: in SRIOMODE_TYPE;
29 SAMPLEMODE: in SRSAMPLEMODE_TYPE;
30 TCK: in std_logic
31 );
32 end c4m_jtag_iocell;
33
34 architecture rtl of c4m_jtag_iocell is
35 signal SR_IOIN: std_logic;
36 signal SR_IOOUT: std_logic;
37 signal SR_IOEN: std_logic;
38 signal SR_IOIN_next: std_logic;
39 signal SR_IOOUT_next: std_logic;
40 signal SR_IOEN_next: std_logic;
41
42 signal CORE_IN_BD: std_logic;
43 signal PAD_OUT_BD: std_logic;
44 signal PAD_EN_BD: std_logic;
45 begin
46 --
47 -- CORE_* and PAD_* signals
48 --
49 INPUT_gen: if IOTYPE = IO_IN or IOTYPE = IO_INOUT3 generate
50 with IOMODE select
51 CORE_IN <=
52 PAD_IN when SR_Through | SR_Z,
53 PAD_IN when SR_2Pad,
54 CORE_IN_BD when SR_2Core | SR_2PadCore,
55 'X' when others;
56 end generate INPUT_gen;
57 NOINPUT_gen: if IOTYPE /= IO_IN and IOTYPE /= IO_INOUT3 generate
58 CORE_IN <= 'X';
59 end generate NOINPUT_gen;
60
61 OUTPUT_gen: if IOTYPE /= IO_IN generate
62 with IOMODE select
63 PAD_OUT <=
64 CORE_OUT when SR_Through,
65 PAD_OUT_BD when SR_2Pad | SR_2PadCore,
66 '0' when SR_2Core | SR_Z,
67 'X' when others;
68 end generate OUTPUT_gen;
69 NOOUTPUT_gen: if IOTYPE = IO_IN generate
70 PAD_OUT <= 'X';
71 end generate NOOUTPUT_gen;
72
73 ENABLE_gen: if IOTYPE = IO_OUT3 or IOTYPE = IO_INOUT3 generate
74 with IOMODE select
75 PAD_EN <=
76 CORE_EN when SR_Through,
77 PAD_EN_BD when SR_2Pad | SR_2PadCore,
78 '0' when SR_2Core | SR_Z,
79 'X' when others;
80 end generate ENABLE_gen;
81 NOENABLE_gen: if IOTYPE /= IO_OUT3 and IOTYPE /= IO_INOUT3 generate
82 PAD_EN <= 'X';
83 end generate NOENABLE_gen;
84
85
86 --
87 -- SR_* signals
88 --
89 IOIN_WITHIN_gen: if IOTYPE = IO_IN or IOTYPE = IO_INOUT3 generate
90 with SAMPLEMODE select
91 SR_IOIN_next <=
92 PAD_IN when SR_Sample,
93 BDSR_IN when SR_Shift,
94 SR_IOIN when others;
95 end generate IOIN_WITHIN_gen;
96 IOIN_NOIN_gen: if IOTYPE /= IO_IN and IOTYPE /= IO_INOUT3 generate
97 SR_IOIN_next <= 'X';
98 end generate IOIN_NOIN_gen;
99
100 IOOUT_NOINWITHOUT_gen: if IOTYPE = IO_OUT or IOTYPE = IO_OUT3 generate
101 with SAMPLEMODE select
102 SR_IOOUT_next <=
103 CORE_OUT when SR_Sample,
104 BDSR_IN when SR_Shift,
105 SR_IOOUT when others;
106 end generate IOOUT_NOINWITHOUT_gen;
107 IOOUT_WITHINOUT_gen: if IOTYPE = IO_INOUT3 generate
108 with SAMPLEMODE select
109 SR_IOOUT_next <=
110 CORE_OUT when SR_Sample,
111 SR_IOIN when SR_Shift,
112 SR_IOOUT when others;
113 end generate IOOUT_WITHINOUT_gen;
114 IOOUT_NOOUT_gen: if IOTYPE = IO_IN generate
115 SR_IOOUT_next <= 'X';
116 end generate IOOUT_NOOUT_gen;
117
118 IOEN_WITHOUT3_gen: if IOTYPE = IO_OUT3 or IOTYPE = IO_INOUT3 generate
119 with SAMPLEMODE select
120 SR_IOEN_next <=
121 CORE_EN when SR_Sample,
122 SR_IOOUT when SR_Shift,
123 SR_IOEN when others;
124 end generate IOEN_WITHOUT3_gen;
125 IOEN_NOOUT3_gen: if IOTYPE /= IO_OUT3 and IOTYPE /= IO_INOUT3 generate
126 SR_IOEN_next <= 'X';
127 end generate IOEN_NOOUT3_gen;
128
129 process (TCK)
130 begin
131 -- Sampling of inputs and shifting of boundary scan SR needs to be done on
132 -- rising edge of TCK.
133 if rising_edge(TCK) then
134 SR_IOIN <= SR_IOIN_next;
135 SR_IOOUT <= SR_IOOUT_next;
136 SR_IOEN <= SR_IOEN_next;
137 end if;
138
139 -- Update of output from boundary scan SR needs to be done on falling edge
140 -- of TCK
141 if falling_edge(TCK) and SAMPLEMODE = SR_Update then
142 CORE_IN_BD <= SR_IOIN;
143 PAD_OUT_BD <= SR_IOOUT;
144 PAD_EN_BD <= SR_IOEN;
145 end if;
146 end process;
147
148
149 --
150 -- BDSR_OUT signal
151 --
152 BDSROUT_NOOUT_gen: if IOTYPE = IO_IN generate
153 BDSR_OUT <= SR_IOIN;
154 end generate BDSROUT_NOOUT_gen;
155 BDSROUT_WITHOUT_gen: if IOTYPE = IO_OUT generate
156 BDSR_OUT <= SR_IOOUT;
157 end generate BDSROUT_WITHOUT_gen;
158 BDSROUT_WITHOUT3_gen: if IOTYPE = IO_OUT3 or IOTYPE = IO_INOUT3 generate
159 BDSR_OUT <= SR_IOEN;
160 end generate BDSROUT_WITHOUT3_gen;
161 end rtl;