DEBUG: boolean := false;
IR_WIDTH: integer := 2;
- IOS: integer := 1;
+ IOTYPES: IOTYPE_VECTOR := IOTYPES_NULL;
MANUFACTURER: std_logic_vector(10 downto 0) := "10001111111";
PART_NUMBER: std_logic_vector(15 downto 0) := "0000000000000001";
TDO: out std_logic;
TRST_N: in std_logic;
- -- The FSM state indicators
- RESET: out std_logic;
- DRCAPTURE: out std_logic;
- DRSHIFT: out std_logic;
- DRUPDATE: out std_logic;
-
-- The Instruction Register
IR: out std_logic_vector(IR_WIDTH-1 downto 0);
+ -- The FSM state indicators
+ RESET: out std_logic;
+ CAPTURE: out std_logic;
+ SHIFT: out std_logic;
+ UPDATE: out std_logic;
+
-- The I/O access ports
- CORE_IN: out std_logic_vector(IOS-1 downto 0);
- CORE_EN: in std_logic_vector(IOS-1 downto 0);
- CORE_OUT: in std_logic_vector(IOS-1 downto 0);
+ CORE_IN: out std_logic_vector(IOTYPES'range);
+ CORE_EN: in std_logic_vector(IOTYPES'range);
+ CORE_OUT: in std_logic_vector(IOTYPES'range);
-- The pad connections
- PAD_IN: in std_logic_vector(IOS-1 downto 0);
- PAD_EN: out std_logic_vector(IOS-1 downto 0);
- PAD_OUT: out std_logic_vector(IOS-1 downto 0)
+ PAD_IN: in std_logic_vector(IOTYPES'range);
+ PAD_EN: out std_logic_vector(IOTYPES'range);
+ PAD_OUT: out std_logic_vector(IOTYPES'range)
);
end c4m_jtag_tap_controller;
architecture rtl of c4m_jtag_tap_controller is
- signal S_STATE: TAPSTATE_TYPE;
- signal S_NEXT_STATE: TAPSTATE_TYPE;
- signal S_IRSTATE: std_logic;
- signal S_DRSTATE: std_logic;
+ constant null_logic_vector: std_logic_vector(1 to 0) := (others => 'X');
+
+ signal S_RESET: std_logic;
+ signal S_ISIR: std_logic;
+ signal S_ISDR: std_logic;
+ signal S_CAPTURE: std_logic;
+ signal S_SHIFT: std_logic;
+ signal S_UPDATE: std_logic;
signal S_IR: std_logic_vector(IR_WIDTH-1 downto 0);
signal IR_TDO: std_logic;
signal IO_TDO_EN: std_logic;
begin
IR <= S_IR;
-
- RESET <= '1' when S_STATE = TestLogicReset else '0';
- DRCAPTURE <= '1' when S_STATE = Capture and S_DRSTATE = '1' else '0';
- DRSHIFT <= '1' when S_STATE = Shift and S_DRSTATE = '1' else '0';
- DRUPDATE <= '1' when S_STATE = Update and S_DRSTATE = '1' else '0';
+ RESET <= S_RESET;
+ CAPTURE <= S_CAPTURE and S_ISDR;
+ SHIFT <= S_SHIFT and S_ISDR;
+ UPDATE <= S_UPDATE and S_ISDR;
-- JTAG state machine
FSM: c4m_jtag_tap_fsm
TCK => TCK,
TMS => TMS,
TRST_N => TRST_N,
- STATE => S_STATE,
- NEXT_STATE => S_NEXT_STATE,
- DRSTATE => S_DRSTATE,
- IRSTATE => S_IRSTATE
+ RESET => S_RESET,
+ ISIR => S_ISIR,
+ ISDR => S_ISDR,
+ CAPTURE => S_CAPTURE,
+ SHIFT => S_SHIFT,
+ UPDATE => S_UPDATE
);
-- The instruction register
TDI => TDI,
TDO => IR_TDO,
TDO_EN => IR_TDO_EN,
- STATE => S_STATE,
- NEXT_STATE => S_NEXT_STATE,
- IRSTATE => S_IRSTATE,
- IR => S_IR
+ IR => S_IR,
+ RESET => S_RESET,
+ CAPTURE => S_CAPTURE and S_ISIR,
+ SHIFT => S_SHIFT and S_ISIR,
+ UPDATE => S_UPDATE and S_ISIR
);
-- The ID
TDI => TDI,
TDO => ID_TDO,
TDO_EN => ID_TDO_EN,
- STATE => S_STATE,
- NEXT_STATE => S_NEXT_STATE,
- DRSTATE => S_DRSTATE,
- IR => S_IR
- );
-
- -- The IOS
- IOBLOCK: c4m_jtag_ioblock
- generic map (
- IR_WIDTH => IR_WIDTH,
- IOS => IOS
- )
- port map (
- TCK => TCK,
- TDI => TDI,
- TDO => IO_TDO,
- TDO_EN => IO_TDO_EN,
- STATE => S_STATE,
- NEXT_STATE => S_NEXT_STATE,
- DRSTATE => S_DRSTATE,
IR => S_IR,
- CORE_OUT => CORE_OUT,
- CORE_IN => CORE_IN,
- CORE_EN => CORE_EN,
- PAD_OUT => PAD_OUT,
- PAD_IN => PAD_IN,
- PAD_EN => PAD_EN
+ CAPTURE => S_CAPTURE and S_ISDR,
+ SHIFT => S_SHIFT and S_ISDR,
+ UPDATE => S_UPDATE and S_ISDR
);
+ -- The IOs
+ IOBLOCK_gen: if IOTYPES'length > 0 generate
+ IOBLOCK: c4m_jtag_ioblock
+ generic map (
+ IR_WIDTH => IR_WIDTH,
+ IOTYPES => IOTYPES
+ )
+ port map (
+ TCK => TCK,
+ TDI => TDI,
+ TDO => IO_TDO,
+ TDO_EN => IO_TDO_EN,
+ IR => S_IR,
+ CAPTURE => S_CAPTURE and S_ISDR,
+ SHIFT => S_SHIFT and S_ISDR,
+ UPDATE => S_UPDATE and S_ISDR,
+ CORE_OUT => CORE_OUT,
+ CORE_IN => CORE_IN,
+ CORE_EN => CORE_EN,
+ PAD_OUT => PAD_OUT,
+ PAD_IN => PAD_IN,
+ PAD_EN => PAD_EN
+ );
+ end generate IOBLOCK_gen;
+ NOIOBLOCK_gen: if IOTYPES'length = 0 generate
+ IO_TDO <= '0';
+ IO_TDO_EN <= '0';
+ CORE_IN <= null_logic_vector;
+ PAD_EN <= null_logic_vector;
+ PAD_OUT <= null_logic_vector;
+ end generate NOIOBLOCK_gen;
+
TDO <= IR_TDO when IR_TDO_EN = '1' else
ID_TDO when ID_TDO_EN = '1' else
IO_TDO when IO_TDO_EN = '1' else
severity ERROR;
end generate CHECK_EN;
end rtl;
-
-