📄 xc18v04.vhd
字号:
BYTmp := TDI; Shift := true; WHEN idcode => TDOTmp := IDTmp(0); FOR I IN 0 TO 30 LOOP IDTmp(i) := IDTmp(i+1); END LOOP; IDTmp(31) := TDI; Shift := true; WHEN usercode => TDOTmp := USETmp(0); FOR I IN 0 TO 30 LOOP USETmp(i) := USETmp(i+1); END LOOP; USETmp(31) := TDI; Shift := true; WHEN faddr => TDOTmp := AddrTmp(0); FOR I IN 0 TO 14 LOOP AddrTmp(i) := AddrTmp(i+1); END LOOP; AddrTmp(15) := TDI; Shift := true; WHEN fdata0 => TDOTmp := Data0Tmp(0); FOR I IN 0 TO 4094 LOOP Data0Tmp(i) := Data0Tmp(i+1); END LOOP; Data0Tmp(4095) := TDI; Shift := true; WHEN fdata3 => TDOTmp := ConfTmp(0); FOR I IN 0 TO 1 LOOP ConfTmp(i) := ConfTmp(i+1); END LOOP; ConfTmp(2) := TDI; Shift := true; WHEN others => NULL; END CASE; END IF; WHEN Shift_DR => IF TMS = '1' THEN TAP_state := Exit1_DR; Shift := false; ELSE TAP_state := Shift_DR; CASE Instruct IS WHEN bypass => TDOTmp := BYTmp; BYTmp := TDI; Shift := true; WHEN sample_preload => TDOTmp := BSTmp(24); FOR I IN 24 DOWNTO 1 LOOP BSTmp(i) := BSTmp(i-1); END LOOP; BSTmp(0) := TDI; Shift := true; WHEN extest => TDOTmp := BSTmp(24); FOR I IN 24 DOWNTO 1 LOOP BSTmp(i) := BSTmp(i-1); END LOOP; BSTmp(0) := TDI; Shift := true; WHEN clamp => TDOTmp := BYTmp; BYTmp := TDI; Shift := true; WHEN highz => TDOTmp := BYTmp; BYTmp := TDI; Shift := true; WHEN idcode => TDOTmp := IDTmp(0); FOR I IN 0 TO 30 LOOP IDTmp(i) := IDTmp(i+1); END LOOP; IDTmp(31) := TDI; Shift := true; WHEN usercode => TDOTmp := USETmp(0); FOR I IN 0 TO 30 LOOP USETmp(i) := USETmp(i+1); END LOOP; USETmp(31) := TDI; Shift := true; WHEN faddr => TDOTmp := AddrTmp(0); FOR I IN 0 TO 14 LOOP AddrTmp(i) := AddrTmp(i+1); END LOOP; AddrTmp(15) := TDI; Shift := true; WHEN fdata0 => TDOTmp := Data0Tmp(0); FOR I IN 0 TO 4094 LOOP Data0Tmp(i) := Data0Tmp(i+1); END LOOP; Data0Tmp(4095) := TDI; Shift := true; WHEN fdata3 => TDOTmp := ConfTmp(0); FOR I IN 0 TO 1 LOOP ConfTmp(i) := ConfTmp(i+1); END LOOP; ConfTmp(2) := TDI; Shift := true; WHEN others => NULL; END CASE; END IF; WHEN Exit1_DR => IF TMS = '1' THEN TAP_state := Update_DR; UpdateDR := true; ELSE TAP_state := Pause_DR; END IF; WHEN Pause_DR => IF TMS = '1' THEN TAP_state := Exit2_DR; ELSE TAP_state := Pause_DR; END IF; WHEN Exit2_DR => IF TMS = '1' THEN TAP_state := Update_DR; UpdateDR := true; ELSE TAP_state := Shift_DR; Shift := false; END IF; WHEN Update_DR => IF TMS = '1' THEN TAP_state := Select_DR_Scan; ELSE TAP_state := Run_Test_Idle; END IF; WHEN Select_IR_Scan => IF TMS = '1' THEN TAP_state := Test_Logic_Reset; IReg := "11111110"; IDReg := to_slv(DeviceID,32); Instruct <= idcode; ELSE TAP_state := Capture_IR; IF ISP AND ReadProt THEN ITmp := "00011001"; ELSIF ISP AND NOT ReadProt THEN ITmp := "00010001"; ELSE ITmp := "00000001"; END IF; TDO_zd <= 'Z'; END IF; WHEN Capture_IR => IF TMS = '1' THEN TAP_state := Exit1_IR; Shift := false; ELSE TAP_state := Shift_IR; TDOTmp := ITmp(0); FOR I IN 0 TO 6 LOOP ITmp(i) := ITmp(i+1); END LOOP; ITmp(7) := TDI; Shift := true; END IF; WHEN Shift_IR => IF TMS = '1' THEN TAP_state := Exit1_IR; Shift := false; ELSE TAP_state := Shift_IR; TDOTmp := ITmp(0); FOR I IN 0 TO 6 LOOP ITmp(i) := ITmp(i+1); END LOOP; ITmp(7) := TDI; Shift := true; END IF; WHEN Exit1_IR => IF TMS = '1' THEN TAP_state := Update_IR; UpdateIR := true; ELSE TAP_state := Pause_IR; END IF; WHEN Pause_IR => IF TMS = '1' THEN TAP_state := Exit2_IR; ELSE TAP_state := Pause_IR; END IF; WHEN Exit2_IR => IF TMS = '1' THEN TAP_state := Update_IR; UpdateIR := true; ELSE TAP_state := Shift_IR; Shift := false; END IF; WHEN Update_IR => IF TMS = '1' THEN TAP_state := Select_DR_Scan; ELSE TAP_state := Run_Test_Idle; END IF; END CASE; END IF; IF falling_edge(TCK) THEN IF Shift = true THEN TDO_zd <= TDOTmp; ELSIF UpdateIR = true THEN TDO_zd <= 'Z'; IReg:= ITmp; CASE IReg IS WHEN "11111111" => Instruct <= bypass; BYPSS <= '1'; WHEN "00000001" => Instruct <= sample_preload; BYPSS <= '0'; WHEN "00000000" => Instruct <= extest; BYPSS <= '0'; WHEN "11111010" => Instruct <= clamp; BYPSS <= '0'; WHEN "11111100" => Instruct <= highz; BYPSS <= '0'; WHEN "11111110" => Instruct <= idcode; BYPSS <= '0'; IDReg := to_slv(DeviceID,32); WHEN "11111101" => Instruct <= usercode; BYPSS <= '0'; WHEN "11101110" => Instruct <= config; BSReg(21) <= '0', '1' AFTER 400 ns; BYPSS <= '0'; WHEN "11101000" => Instruct <= ispen; ISP <= TRUE; BYPSS <= '0'; WHEN "11101100" => Instruct <= ferase; ConfReg <= (OTHERS => '1'); BYPSS <= '0'; WHEN "11101010" => Instruct <= fpgm; BYPSS <= '0'; WHEN "11101001" => Instruct <= ispex; ISP <= FALSE; BYPSS <= '0'; WHEN "11101011" => Instruct <= faddr; BYPSS <= '0'; WHEN "11101101" => Instruct <= fdata0; BYPSS <= '0'; WHEN "11110011" => Instruct <= fdata3; BYPSS <= '0'; WHEN others => NULL; END CASE; UpdateIR := false; ELSIF UpdateDR = true THEN TDO_zd <= 'Z'; UpdateDR := false; CASE Instruct IS WHEN bypass => BYReg := BYTmp; WHEN sample_preload => BSReg <= BSTmp; WHEN extest => BSReg <= BSTmp; WHEN clamp => BYReg := BYTmp; WHEN highz => BYReg := BYTmp; WHEN idcode => IDReg := IDTmp; WHEN usercode => USEReg1 := USETmp(15 downto 0); USEReg2 := USETmp(31 downto 16); WHEN faddr => AddrReg := to_nat(AddrTmp); Address <= AddrReg; change_addr <= '1','0' AFTER 1 ns; WHEN fdata0 => Data0Reg := Data0Tmp; FOR I IN 0 TO RowSize LOOP FOR J IN 7 DOWNTO 0 LOOP Byte_slv(j) := Data0Reg((i*8) + (7-j)); END LOOP; WByte(i) <= to_nat(Byte_slv); END LOOP; WHEN fdata3 => ConfReg <= ConfTmp; WHEN others => NULL; END CASE; ELSE TDO_zd <= 'Z'; END IF; END IF; END PROCESS JTAG; ---------------------------------------------------------------------------- -- sequential process for FSM state transition ---------------------------------------------------------------------------- StateTransition : PROCESS(next_state) BEGIN IF RESETIn = '0' THEN current_state <= next_state; ELSE current_state <= IDLE; END IF; END PROCESS StateTransition; --------------------------------------------------------------------------- -- Timing control for Program All Addresses --------------------------------------------------------------------------- ProgTime : PROCESS(PSTART) BEGIN IF PSTART = '0' THEN PDONE <= '0'; ELSE IF LongTiming THEN PDONE <= '1' AFTER (tdevice_ISP - 1 ns); ELSE PDONE <= '1' AFTER (tdevice_ISP/1000 - 1 ns); END IF; END IF; END PROCESS ProgTime; --------------------------------------------------------------------------- -- Timing control for the Erase --------------------------------------------------------------------------- ErsTime : PROCESS(ESTART) BEGIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -