⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jt.tdf

📁 turbo jtag CPLD source code use altera EPM7128S
💻 TDF
字号:
-- Created on Wed Aug 20 21:28:33 2003
-- turbo jtag for Trimedia TM1300 DSP

TITLE "JTAG_CONTROL";

	INCLUDE "lpm_counter.inc";
	INCLUDE "lpm_shiftreg.inc";
	INCLUDE "lpm_mux.inc";

SUBDESIGN jt
(
	WR: 		INPUT;
	RD: 		INPUT;
	CS: 		INPUT;
	CLK: 		INPUT;		--40MHz
	A[4..0]: 	INPUT;
	ISA_CLK: 	INPUT;		--8MHz
	RESET: 		INPUT;

	SBHE: 		OUTPUT;
	IO_CH_RDY:	OUTPUT;
	IO_CS16: 	OUTPUT;
	D[15..0]: 	BIDIR;

	probe[3..0]:		OUTPUT;		--test

	mTDI: 		OUTPUT;
	mTDO: 		INPUT;
	mTMS:		OUTPUT;
	mTCK:		OUTPUT;
)

VARIABLE
shift_L0:	lpm_shiftreg WITH (LPM_WIDTH = 5, LPM_DIRECTION = "RIGHT");
shift_L1:	lpm_shiftreg WITH (LPM_WIDTH = 3, LPM_DIRECTION = "RIGHT");
shift_L2:	lpm_shiftreg WITH (LPM_WIDTH = 8, LPM_DIRECTION = "RIGHT");
shift_H:	lpm_shiftreg WITH (LPM_WIDTH = 16, LPM_DIRECTION = "RIGHT");
shift_H16:	DFFE;
rdmux:		lpm_mux WITH(LPM_WIDTH = 16, LPM_SIZE = 3, LPM_WIDTHS = 2);
cnt:		lpm_counter WITH (LPM_WIDTH = 6, LPM_DIRECTION = "DOWN");
--Dtck:			DFF;
control1[8..0]:	DFFE;		--8:BYPASS_EXBIT, 7:EXBIT, 6:SCAN_IR, 5..0:LENGTH. addr:4
control2[1..0]:	DFFE;		--6:JTAG_OUTPUT_ENABLE, 0:CTRLRST. addr:6

Dout[15..0]:	TRI;		--for ISA interface
BUSY:			NODE;
shifting_data:	NODE;
CS_data_L:		NODE;		-- 0
CS_data_H:		NODE;		-- 2
CS_control1:	NODE;		-- 4
CS_control2:	NODE;		-- 6
CS_status:		NODE;		-- 8
--CLK2:			NODE;

--scan_ir: 011(n-1)0011
--scan_dr: 011(n-1)001

mm	: MACHINE WITH STATES (
		midle,			--wait input

		mpre0,
		mpre1,
		mpre2,
		mpre3,

		mshift_data,	--shift out data

		mpost0,			--shift out 011, return IDLE state
		mpost1,
		mpost2,

		mreset1,
		mreset2,
		mreset3,
		mreset4
		);

BEGIN
	DEFAULTS
		cnt.sload = GND;
		cnt.cnt_en = GND;

		shifting_data = GND;

		IO_CH_RDY = VCC;

		mTDI = GND;
		mTCK = GND;
		mTMS = GND;
		BUSY = GND;

		control1[].clrn = VCC;
		control2[].clrn = VCC;		

		probe[] = GND;
	END DEFAULTS;

	cnt.clock = CLK;

--	Dtck.clk = CLK;
--	Dtck = !Dtck;
--	CLK2 = !Dtck;

	IO_CS16 = CS # (RD & WR);
	SBHE = CS # (RD & WR);

--ISA common
	CS_data_L = ((A[] == 0) & !CS);
	CS_data_H = ((A[] == 2) & !CS);
	CS_control1 = ((A[] == 4) & !CS);
	CS_control2 = ((A[] == 6) & !CS);
	CS_status = ((A[] == 8) & !CS);

	rdmux.data[0][4..0] = shift_L0.q[4..0];
	rdmux.data[0][7..5] = shift_L1.q[2..0];
	rdmux.data[0][15..8] = shift_L2.q[7..0];
	rdmux.data[1][15..0] = shift_H.q[15..0];
	rdmux.data[2][0] = BUSY;						--status
	rdmux.data[2][6..1] = 0;
	rdmux.data[2][7] = shift_H16.q;

	FOR i IN 0 TO 15 GENERATE
		Dout[i].in = rdmux.result[i];
		Dout[i].oe = !RD & !CS;
		D[i] = Dout[i].out;
	END GENERATE;
--ISA write	
	control1[].clk = WR;
	control1[].ena = CS_control1;
	control1[8..0] = D[8..0];

	control2[].clk = WR;
	control2[].ena = CS_control2;
	control2[1] = D[6];
	control2[0] = D[0];

	shift_L0.data[4..0] = D[4..0];
	shift_L0.load = CS_data_L & !WR;
	shift_L0.clock = GLOBAL(CLK);
	shift_L0.enable = (CS_data_L & !WR) # shifting_data;

	shift_L1.data[2..0] = D[7..5];
	shift_L1.load = CS_data_L & !WR;
	shift_L1.clock = GLOBAL(CLK);
	shift_L1.enable = (CS_data_L & !WR) # shifting_data;

	shift_L2.shiftin = shift_H.shiftout;
	shift_L2.data[7..0] = D[15..8];
	shift_L2.load = CS_data_L & !WR;
	shift_L2.clock = GLOBAL(CLK);
	shift_L2.enable = (CS_data_L & !WR) # shifting_data;

	shift_H.data[15..0] = D[15..0];
	shift_H.load = CS_data_H & !WR;
	shift_H.clock = CLK;
	shift_H.enable = (CS_data_H & !WR) # shifting_data;

	shift_H16.clk = CLK;

--ISA read
	IF 	CS_data_L THEN
		rdmux.sel[] = 0;
	END IF;

	IF 	CS_data_H THEN
		rdmux.sel[] = 1;
	END IF;

	IF 	CS_status THEN
		rdmux.sel[] = 2;
	END IF;

--shift reg
	CASE control1[5..0] IS
		WHEN 5 =>
			shift_L0.shiftin = mTDO;
		WHEN 8 =>
			shift_L0.shiftin = shift_L1.shiftout;
			shift_L1.shiftin = mTDO;
		WHEN 32 =>
			shift_L0.shiftin = shift_L1.shiftout;
			shift_L1.shiftin = shift_L2.shiftout;
			shift_L2.shiftin = shift_H.shiftout;
			shift_H.shiftin = mTDO;
		WHEN 33 =>
			shift_L0.shiftin = shift_L1.shiftout;
			shift_L1.shiftin = shift_L2.shiftout;
			shift_L2.shiftin = shift_H.shiftout;
			shift_H.shiftin = shift_H16.q;
			shift_H16.d = mTDO;
	END CASE;
-----------------------------------------------
	mm.clk = CLK;
	mm.reset = RESET;

	CASE mm IS
		WHEN midle =>
			probe[] = 0;
			IF control2[1..0] == 1 THEN			--reset
				mm = mreset1;
			END IF;

			IF control1[5..0] != 0 THEN			--length != 0, scan data
				IF control1[6] THEN
					mm = mpre0;					--scan ir
				ELSE
					mm = mpre1;					--scan dr
				END IF;
			END IF;

		WHEN mpre0 =>
			probe[] = 1;
			mTMS = VCC;
			mTCK = !CLK;
			BUSY = VCC;
			mm = mpre1;

		WHEN mpre1 =>
			probe[] = 2;
			mTMS = VCC;
			mTCK = !CLK;
			BUSY = VCC;
			mm = mpre2;

		WHEN mpre2 =>
			probe[] = 3;
			mTMS = GND;
			mTCK = !CLK;
			BUSY = VCC;
			mm = mpre3;

		WHEN mpre3 =>
			probe[] = 4;
			mTMS = GND;
			mTCK = !CLK;

			shifting_data = VCC;
			cnt.data[5..0] = control1[5..0];
			shift_H16.d = control1[7];			--ext_bit
			cnt.sload = VCC;
			BUSY = VCC;
			mm = mshift_data;

		WHEN mshift_data =>
			probe[] = 5;
			mTDI = shift_L0.shiftout;
			mTCK = !CLK;
			shifting_data = VCC;
			BUSY = VCC;
			cnt.cnt_en = VCC;

			IF cnt.q[] == 2 THEN
				mm = mpost0;
			END IF;

		WHEN mpost0 =>
			probe[] = 6;
			mTDI = shift_L0.shiftout;
			mTMS = VCC;
			mTCK = !CLK;
			shifting_data = VCC;
			BUSY = VCC;
			mm = mpost1;

		WHEN mpost1 =>
			probe[] = 7;		
			mTMS = VCC;
			mTCK = !CLK;
			BUSY = VCC;
			mm = mpost2;

		WHEN mpost2 =>
			probe[] = 8;
			mTMS = GND;
			mTCK = !CLK;
			BUSY = VCC;
			control1[].clrn = GND;
			mm = midle;

		WHEN mreset1 =>
			probe[] = 9;		
			mTDI = VCC;
			mTCK = !CLK;
			mTCK = VCC;
			mTMS = VCC;

			IF control2[1..0] == 3 THEN
				mm = mreset2;
			END IF;

		WHEN mreset2 =>
			probe[] = 10;
			mTDI = VCC;
			mTCK = !CLK;
			mTMS = VCC;
			
			IF control2[1..0] == 2 THEN
				mm = mreset3;
			END IF;

		WHEN mreset3 =>
			probe[] = 11;
			mTDI = VCC;
			mTCK = GND;
			mTMS = GND;
			mm = mreset4;

		WHEN mreset4 =>
			probe[] = 12;
			mTDI = VCC;
			mTCK = VCC;
			mTMS = GND;
			control2[].clrn = GND;
			mm = midle;

		WHEN OTHERS =>
			probe[] = 13;
			control1[].clrn = GND;
			control2[].clrn = GND;
			mm = midle;

	END CASE;
END;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -