1 -- An JTAG boundary scan for bidirectional I/O
4 use ieee.std_logic_1164.ALL;
8 entity c4m_jtag_iocell is
14 CORE_IN: out std_logic;
15 CORE_OUT: in std_logic;
16 CORE_EN: in std_logic;
20 PAD_OUT: out std_logic;
21 PAD_EN: out std_logic;
24 BDSR_IN: in std_logic;
25 BDSR_OUT: out std_logic;
28 IOMODE: in SRIOMODE_TYPE;
29 SAMPLEMODE: in SRSAMPLEMODE_TYPE;
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;
42 signal CORE_IN_BD: std_logic;
43 signal PAD_OUT_BD: std_logic;
44 signal PAD_EN_BD: std_logic;
47 -- CORE_* and PAD_* signals
49 INPUT_gen: if IOTYPE = IO_IN or IOTYPE = IO_INOUT3 generate
52 PAD_IN when SR_Through | SR_Z,
54 CORE_IN_BD when SR_2Core | SR_2PadCore,
56 end generate INPUT_gen;
57 NOINPUT_gen: if IOTYPE /= IO_IN and IOTYPE /= IO_INOUT3 generate
59 end generate NOINPUT_gen;
61 OUTPUT_gen: if IOTYPE /= IO_IN generate
64 CORE_OUT when SR_Through,
65 PAD_OUT_BD when SR_2Pad | SR_2PadCore,
66 '0' when SR_2Core | SR_Z,
68 end generate OUTPUT_gen;
69 NOOUTPUT_gen: if IOTYPE = IO_IN generate
71 end generate NOOUTPUT_gen;
73 ENABLE_gen: if IOTYPE = IO_OUT3 or IOTYPE = IO_INOUT3 generate
76 CORE_EN when SR_Through,
77 PAD_EN_BD when SR_2Pad | SR_2PadCore,
78 '0' when SR_2Core | SR_Z,
80 end generate ENABLE_gen;
81 NOENABLE_gen: if IOTYPE /= IO_OUT3 and IOTYPE /= IO_INOUT3 generate
83 end generate NOENABLE_gen;
89 IOIN_WITHIN_gen: if IOTYPE = IO_IN or IOTYPE = IO_INOUT3 generate
90 with SAMPLEMODE select
92 PAD_IN when SR_Sample,
93 BDSR_IN when SR_Shift,
95 end generate IOIN_WITHIN_gen;
96 IOIN_NOIN_gen: if IOTYPE /= IO_IN and IOTYPE /= IO_INOUT3 generate
98 end generate IOIN_NOIN_gen;
100 IOOUT_NOINWITHOUT_gen: if IOTYPE = IO_OUT or IOTYPE = IO_OUT3 generate
101 with SAMPLEMODE select
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
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;
118 IOEN_WITHOUT3_gen: if IOTYPE = IO_OUT3 or IOTYPE = IO_INOUT3 generate
119 with SAMPLEMODE select
121 CORE_EN when SR_Sample,
122 SR_IOOUT when SR_Shift,
124 end generate IOEN_WITHOUT3_gen;
125 IOEN_NOOUT3_gen: if IOTYPE /= IO_OUT3 and IOTYPE /= IO_INOUT3 generate
127 end generate IOEN_NOOUT3_gen;
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;
139 -- Update of output from boundary scan SR needs to be done on falling edge
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;
152 BDSROUT_NOOUT_gen: if IOTYPE = IO_IN generate
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
160 end generate BDSROUT_WITHOUT3_gen;