Support for different IO types in VHDL code.
[c4m-jtag.git] / c4m / vhdl / jtag / c4m_jtag_tap_controller.vhdl
index 217982e80ec237e074eb2bf90c08fa9d48f9e47f..cfdf2f99a37029ba96e18bdc973880ecbccdb29e 100644 (file)
@@ -11,7 +11,7 @@ entity c4m_jtag_tap_controller is
     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";
@@ -25,32 +25,36 @@ entity c4m_jtag_tap_controller is
     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;
@@ -61,11 +65,10 @@ architecture rtl of c4m_jtag_tap_controller is
   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
@@ -73,10 +76,12 @@ begin
       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
@@ -89,10 +94,11 @@ begin
       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
@@ -100,42 +106,52 @@ begin
     generic map (
       IR_WIDTH => IR_WIDTH,
       PART_NUMBER => PART_NUMBER,
-      MANUFACTURER => MANUFACTURER
+      MANUFACTURER => MANUFACTURER,
+      VERSION => VERSION
     )
     port map (
       TCK => TCK,
       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
@@ -150,5 +166,3 @@ begin
       severity ERROR;
   end generate CHECK_EN;
 end rtl;
-
-