📄 std8980.vhd
字号:
tdiincnt := 0; tdioutcnt := 0; tdibitcnt := 0; tdoincnt := 0; tdooutcnt := 0; tdobitcnt := 0; TDOS := '0'; TDIS := '0'; OP_done := false; END IF; ELSIF addr = 7 AND MODE = "010" THEN Reg(addr) := DataIn; TCKint := '0'; ELSE Reg(addr) := DataIn; END IF; ELSE -- error ASSERT false REPORT "Attempted access when not RDY" SEVERITY ERROR; END IF; END IF; -- TCK control IF CDIV = 0 AND clkrun THEN TCKint := to_UX01(CLKIN); ELSIF rising_edge(CLKIN) AND clkrun THEN IF CDIV /= prev_CDIV THEN tck_div := (2**CDIV)/2; prev_CDIV := CDIV; END IF; tck_cnt := tck_cnt + 1; IF tck_cnt >= tck_div THEN TCKint := not TCKint; tck_cnt := 0; END IF; END IF; -- TAP State Machine IF rising_edge(TCKsig) AND OPCOD /= 0 AND MODE /= "010" THEN CASE TAP_state IS WHEN Test_Logic_Reset => IF OPCOD = 3 THEN prev_state := Test_Logic_Reset; TAP_state := ASP_in; TDI_on := true; ELSIF OPCOD = 4 THEN prev_state := Test_Logic_Reset; TAP_state := ASP; TDI_on := true; ELSIF OPCOD = 5 THEN prev_state := Test_Logic_Reset; TAP_state := ASP_out; ELSE TMSint := '0'; TAP_state := Run_Test_Idle; END IF; WHEN Run_Test_Idle => TDI_on := false; IF OPCOD = 2 THEN IF Count = 0 THEN OP_done := true; IF ENDST = "01" THEN command(3 downto 0) := "0000"; RDYint := '1'; ELSE TMSint := '1'; TAP_state := Select_DR_Scan; END IF; ELSE Count := Count - 1; END IF; ELSIF OP_done AND ENDST = "01" THEN command(3 downto 0) := "0000"; RDYint := '1'; ELSIF OPCOD = 3 THEN prev_state := Run_Test_Idle; TAP_state := ASP_in; TDI_on := true; ELSIF OPCOD = 4 THEN prev_state := Run_Test_Idle; TAP_state := ASP; TDI_on := true; ELSIF OPCOD = 5 THEN prev_state := Run_Test_Idle; TAP_state := ASP_out; ELSE TMSint := '1'; TAP_state := Select_DR_Scan; END IF; WHEN Select_DR_Scan => IF OP_done THEN IF ENDST = "00" OR ENDST = "11" THEN TMSint := '1'; TAP_state := Select_IR_Scan; ELSE TMSint := '0'; TAP_state := Capture_DR; END IF; ELSE IF OPCOD = 2 OR OPCOD = 8 OR OPCOD = 10 OR OPCOD = 12 OR OPCOD = 14 THEN TMSint := '1'; TAP_state := Select_IR_Scan; ELSE TMSint := '0'; TAP_state := Capture_DR; END IF; END IF; WHEN Capture_DR => IF OPCOD = 2 AND ENDST = "10" THEN TMSint := '1'; TAP_state := Exit1_DR; ELSE TMSint := '0'; TAP_state := Shift_DR; IF OPCOD = 9 THEN TDOint := TDO_fifo(tdooutcnt)(tdobitcnt); tdobitcnt := tdobitcnt + 1; TDI_on := true; ELSIF OPCOD = 11 THEN TDI_on := true; TDOint := '1'; ELSIF OPCOD = 13 THEN TDOint := TDO_fifo(tdooutcnt)(tdobitcnt); tdobitcnt := tdobitcnt + 1; TDI_on := false; ELSIF OPCOD = 15 THEN TDI_on := true; TDOint := TDI_nwv; END IF; END IF; WHEN Shift_DR => IF Count = 0 THEN TMSint := '1'; TAP_state := Exit1_DR; OP_done := true; TDI_on := false; TDOint := 'Z'; ELSE Count := Count - 1; IF OPCOD = 9 OR OPCOD = 13 THEN IF OPCOD = 9 THEN TDI_on := true; END IF; TDOint := TDO_fifo(tdooutcnt)(tdobitcnt); IF tdobitcnt = 7 THEN TDOS := '0'; tdobitcnt := 0; IF tdooutcnt = tdoincnt - 1 OR (tdooutcnt = 3 AND tdoincnt = 0) THEN IF MODE = "000" THEN TAP_state := Exit1_DR; TDO_empty := true; ELSE clkrun := false; END IF; ELSE IF tdooutcnt = 3 THEN tdooutcnt := 0; ELSE tdooutcnt := tdooutcnt + 1; END IF; END IF; ELSE tdobitcnt := tdobitcnt + 1; END IF; ELSIF OPCOD = 11 THEN TDI_on := true; TDOint := '1'; END IF; END IF; WHEN Exit1_DR => IF OP_done AND ENDST = "10" THEN TMSint := '0'; TAP_state := Pause_DR; command(3 downto 0) := "0000"; RDYint := '1'; ELSE TMSint := '1'; TAP_state := Update_DR; END IF; WHEN Pause_DR => IF OPCOD = 3 THEN prev_state := Pause_DR; TAP_state := ASP_in; TDI_on := true; ELSIF OPCOD = 4 THEN prev_state := Pause_DR; TAP_state := ASP; TDI_on := true; ELSIF OPCOD = 5 THEN prev_state := Pause_DR; TAP_state := ASP_out; ELSIF OPCOD /= 0 AND not TDO_empty THEN TMSint := '1'; TAP_state := Exit2_DR; ELSE TMSint := '0'; END IF; WHEN Exit2_DR => IF OPCOD = 9 OR OPCOD = 11 OR OPCOD = 13 OR OPCOD = 15 THEN TMSint := '0'; TAP_state := Shift_DR; TDI_on := true; ELSE TMSint := '1'; TAP_state := Update_DR; END IF; WHEN Update_DR => IF OPCOD = 2 THEN TMSint := '0'; TAP_state := Run_Test_Idle; ELSIF ENDST = "01" THEN TMSint := '0'; TAP_state := Run_Test_Idle; command(3 downto 0) := "0000"; RDYint := '1'; ELSE TMSint := '1'; TAP_state := Select_DR_Scan; END IF; WHEN Select_IR_Scan => IF OP_done AND ENDST = "00" THEN TMSint := '1'; TAP_state := Test_Logic_Reset; command(3 downto 0) := "0000"; RDYint := '1'; ELSE TMSint := '0'; TAP_state := Capture_IR; END IF; WHEN Capture_IR => IF OPCOD = 2 AND ENDST = "11" THEN TMSint := '1'; TAP_state := Exit1_IR; ELSE TMSint := '0'; TAP_state := Shift_IR; IF OPCOD = 8 THEN TDOint := TDO_fifo(tdooutcnt)(tdobitcnt); tdobitcnt := tdobitcnt + 1; TDI_on := true; ELSIF OPCOD = 12 THEN TDOint := TDO_fifo(tdooutcnt)(tdobitcnt); tdobitcnt := tdobitcnt + 1; ELSIF OPCOD = 14 THEN TDOint := TDI_nwv; ELSIF OPCOD = 10 THEN TDOint := '1'; TDI_on := true; END IF; END IF; WHEN Shift_IR => IF Count = 0 THEN TMSint := '1'; TAP_state := Exit1_IR; OP_done := true; TDI_on := false; TDOint := 'Z'; ELSE Count := Count - 1; IF OPCOD = 8 OR OPCOD = 12 THEN IF OPCOD = 8 THEN TDI_on := true; END IF; TDOint := TDO_fifo(tdooutcnt)(tdobitcnt); IF tdobitcnt = 7 THEN TDOS := '0'; tdobitcnt := 0; IF tdooutcnt = tdoincnt - 1 OR (tdooutcnt = 3 AND tdoincnt = 0) THEN IF MODE = "000" THEN TAP_state := Exit1_IR; TDO_empty := true; ELSE clkrun := false; END IF; ELSE IF tdooutcnt = 3 THEN tdooutcnt := 0; ELSE tdooutcnt := tdooutcnt + 1; END IF; END IF; ELSE tdobitcnt := tdobitcnt + 1; END IF; ELSIF OPCOD = 10 THEN TDI_on := true; TDOint := '1'; END IF; END IF; WHEN Exit1_IR => IF OP_done AND ENDST = "11" THEN TMSint := '0'; TAP_state := Pause_IR; command(3 downto 0) := "0000"; RDYint := '1'; ELSE TMSint := '1'; TAP_state := Update_IR; END IF; WHEN Pause_IR => IF OPCOD = 3 THEN prev_state := Pause_IR; TAP_state := ASP_in; TDI_on := true; ELSIF OPCOD = 4 THEN prev_state := Pause_IR; TAP_state := ASP; TDI_on := true; ELSIF OPCOD = 5 THEN prev_state := Pause_IR; TAP_state := ASP_out; ELSIF OPCOD /= 0 THEN TMSint := '1'; TAP_state := Exit2_IR; END IF; WHEN Exit2_IR => IF OPCOD = 8 OR OPCOD = 10 OR OPCOD = 12 OR OPCOD = 14 THEN TMSint := '0'; TAP_state := Shift_IR; TDI_on := true; ELSE TMSint := '1'; TAP_state := Update_IR; END IF; WHEN Update_IR => IF OPCOD = 2 OR (OP_done AND ENDST = "01") THEN TMSint := '0'; TAP_state := Run_Test_Idle; ELSE TMSint := '1'; TAP_state := Select_DR_Scan; END IF; WHEN ASP => IF Count = 0 THEN TAP_state := prev_state; OP_done := true; TDI_on := false; TDOint := 'Z'; command(3 downto 0) := "0000"; RDYint := '1'; ELSE Count := Count - 1; TDOint := TDO_fifo(tdooutcnt)(tdobitcnt); IF tdobitcnt = 7 THEN TDOS := '0'; tdobitcnt := 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -