首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 硬件指南 > 应用技巧 > 并口jtag转换工具
【标  题】:并口jtag转换工具
【关键字】:jtag
【来  源】:http://www.cublog.cn/u/20871/showart.php?id=252111

并口jtag转换工具

以前总觉得简单的并口jtag板速度太慢,特别是调试bootloader的时候,简直难以忍受。最近没什么事情,于是补习了几天vhdl,用cpld实现了一个快速的jtag转换板。cpld用epm7128stc100-15,晶振20兆,tck频率5兆。用sjf2410作测试,以前写50k的文件用时5分钟,现在则是50秒左右。tck的频率还可以加倍,但是不太稳定,而且速度的瓶颈已经不在tck这里,而在通讯上面了。大家有时间不妨测试一下。我是vhdl的菜鸟,还请各位大虾指正啊。
 
-- Faster JTAG tool over EPP port
-- Writen By tpu, 2004-06-10
-- 
-- write:
--     address 0: last data length, 1-8 bits
--     address 1: tdi data(data & cmd)
--     address 2: tms data
-- read:
--     address x: tdo data
-- status read:
--     epp/spp status byte d6-d3: rsr full, rbr full, tsr empty, thr empty
-- 
-- block:
--  ---------------------------------------------------
--  |   _______    ___________             _______    |
--  |   | thr |    |bit count|             | rbr |    |
--  |   -------    -----------             -------    |
--  |      |                                  |       |
--  |   _______                            _______    |
--  |MSB| tsr |LSB -> TDI/TMS     TDO-> MSB| rsr |LSB |
--  |   -------                            -------    |
--  ---------------------------------------------------
-- 
-- device  : EPM7128STC100-15
-- crystal : 20 MHz
-- tck     : 5 MHz
-- 
-- 

LIBRARY ieee;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY jtag IS
PORT(
	clk		:IN STD_LOGIC;
	rst		:IN STD_LOGIC;
	
	EPP_DATA:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);
	nwrite	:IN STD_LOGIC;
	nwait	:OUT STD_LOGIC;
	ndatastb:IN STD_LOGIC;
	naddrstb:IN STD_LOGIC;
	

	in_d6	:OUT STD_LOGIC;
	in_d5	:OUT STD_LOGIC;
	in_d4	:OUT STD_LOGIC;
	in_d3	:OUT STD_LOGIC;

	led0	:OUT STD_LOGIC;
	led1	:OUT STD_LOGIC;
	led2	:OUT STD_LOGIC;
	led3	:OUT STD_LOGIC;

	tdo_i	:IN STD_LOGIC;
	tdi_o	:OUT STD_LOGIC;
	tms_o	:OUT STD_LOGIC;
	ntrst_o	:OUT STD_LOGIC;
	tck_o	:OUT STD_LOGIC
);
END jtag;

ARCHITECTURE main OF jtag IS
	SIGNAL thcnt_w0	:STD_LOGIC;
	SIGNAL thcnt_w1	:STD_LOGIC;
	SIGNAL thcnt_w	:STD_LOGIC;
	SIGNAL thcnt	:STD_LOGIC_VECTOR(3 DOWNTO 0);
	
	SIGNAL thr_w0	:STD_LOGIC;
	SIGNAL thr_w1	:STD_LOGIC;
	SIGNAL thr_w	:STD_LOGIC;
	SIGNAL thr		:STD_LOGIC_VECTOR(7 DOWNTO 0);
	SIGNAL thr_e	:STD_LOGIC;
	SIGNAL data_type:STD_LOGIC;
	SIGNAL last_data:STD_LOGIC;

	SIGNAL tsr_e	:STD_LOGIC;
	SIGNAL tsr_e0	:STD_LOGIC;
	SIGNAL tsr		:STD_LOGIC_VECTOR(7 DOWNTO 0);
	SIGNAL tms0		:STD_LOGIC;
	SIGNAL auto_tms		:STD_LOGIC;

	SIGNAL tscnt	:STD_LOGIC_VECTOR(5 DOWNTO 0);
	SIGNAL tscnt_z	:STD_LOGIC;
	SIGNAL tscnt_z0	:STD_LOGIC;
	
	SIGNAL rbr_r0	:STD_LOGIC;
	SIGNAL rbr_r1	:STD_LOGIC;
	SIGNAL rbr_r	:STD_LOGIC;
	SIGNAL rbr		:STD_LOGIC_VECTOR(7 DOWNTO 0);
	SIGNAL rbr_f0	:STD_LOGIC;
	SIGNAL rbr_f	:STD_LOGIC;
	
	SIGNAL rsr_f	:STD_LOGIC;
	SIGNAL rsr		:STD_LOGIC_VECTOR(7 DOWNTO 0);

	SIGNAL addr_w0	:STD_LOGIC;
	SIGNAL addr_w1	:STD_LOGIC;
	SIGNAL addr_w	:STD_LOGIC;
	SIGNAL addr_reg:STD_LOGIC_VECTOR(1 DOWNTO 0);
	
	SIGNAL strobe	:STD_LOGIC;
	SIGNAL wait_out:STD_LOGIC;
BEGIN

	-- EPP status
	in_d3 <= thr_e;
	in_d4 <= tsr_e;
	in_d5 <= rbr_f;
	in_d6 <= rsr_f;

	-- LED status;
	led0 <= NOT rsr_f;
	led1 <= NOT rbr_f;
	led2 <= NOT addr_reg(0);
	led3 <= NOT addr_reg(1);

	-- nWait generation
	PROCESS(rst, clk)
	BEGIN
		IF rst='0' THEN
			strobe <= '1';
		ELSIF RISING_EDGE(clk) THEN
			strobe <= ndatastb AND naddrstb;
		END IF;
	END PROCESS;

	PROCESS(rst, clk)
	BEGIN
		IF rst='0' THEN
			wait_out <= '0';
		ELSIF RISING_EDGE(clk) THEN
			wait_out <= NOT strobe;
		END IF;
	END PROCESS;
	nwait <= wait_out;

	-- read and write signal
	addr_w0 <= nwrite OR naddrstb;
	thcnt_w0 <= nwrite OR ndatastb OR addr_reg(0) OR addr_reg(1);
	thr_w0  <= nwrite OR ndatastb OR NOT(addr_reg(0) OR addr_reg(1));
	rbr_r0  <= ndatastb OR (NOT nwrite) OR (NOT naddrstb);

	-- Delay signal
	PROCESS(clk)
	BEGIN
		IF RISING_EDGE(clk) THEN
			addr_w1 <= addr_w0;
			addr_w  <= addr_w1;

			thcnt_w1<= thcnt_w0;
			thcnt_w <= thcnt_w1;

			thr_w1  <= thr_w0;
			thr_w   <= thr_w1;

			rbr_r1  <= rbr_r0;
			rbr_r   <= rbr_r1;
			
			rbr_f0  <= rbr_f;

			tsr_e0  <= tsr_e;

			tscnt_z0<= tscnt_z;
		END IF;
	END PROCESS;

	-- address write
	PROCESS(rst, addr_w)
	BEGIN
		IF rst='0' THEN
			addr_reg <= "10";
		ELSIF FALLING_EDGE(addr_w) THEN
			addr_reg <= EPP_DATA(1 DOWNTO 0);
		END IF;
	END PROCESS;

	-- counter write
	PROCESS(rst, clk, thcnt_w)
	BEGIN
		IF rst='0' THEN
			thcnt <= "1000";
			last_data <= '0';
		ELSIF RISING_EDGE(clk) THEN
			IF thcnt_w='0' THEN
				thcnt <= EPP_DATA(3 DOWNTO 0);
				last_data <= '1';
			ELSIF tscnt_z='0' AND tscnt_z0='1' THEN
				thcnt <= "1000";
				last_data <= '0';
			END IF;
		END IF;
	END PROCESS;

	-- data write
	PROCESS(thr_w)
	BEGIN
		IF FALLING_EDGE(thr_w) THEN
			thr <= EPP_DATA;
			data_type <= addr_reg(0);
		END IF;
	END PROCESS;

	-- data read
	PROCESS(rbr_r, rbr)
	BEGIN
		IF rbr_r='0' THEN
			EPP_DATA <= rbr;
		ELSE
			EPP_DATA <= "ZZZZZZZZ";
		END IF;
	END PROCESS;

-----------------------------------------------------------------

	-- thr_e
	PROCESS(rst, clk, thr_w1, thr_w, tsr_e)
	BEGIN
		IF rst='0' THEN
			thr_e <= '1';
		ELSIF RISING_EDGE(clk) THEN
			IF thr_w1='0' AND thr_w='1' THEN
				thr_e <= '0';
			ELSIF tsr_e='0' AND tsr_e0='1' THEN
				thr_e <= '1';
			END IF;
		END IF;
	END PROCESS;

	-- tsr_e
	PROCESS(rst, clk, thr_e)
	BEGIN
		IF rst='0' THEN
			tsr_e <= '1';
		ELSIF RISING_EDGE(clk) THEN
--			IF tsr_e='1' AND thr_e='0' AND rsr_f='0' THEN
			IF tsr_e='1' AND thr_e='0' THEN
				tsr_e <= '0';
			ELSIF tscnt_z='1' AND tscnt_z0='0' THEN
				tsr_e <= '1';
			END IF;
		END IF;
	END PROCESS;

	-- tsr
	PROCESS(clk, thr_e)
	BEGIN
		IF RISING_EDGE(clk) THEN
--			IF tsr_e='1' AND thr_e='0' AND rsr_f='0' THEN
			IF tsr_e='1' AND thr_e='0' THEN
				tsr <= thr;
			ELSIF tscnt(1)='1' AND tscnt(0)='0' THEN
				tsr <= '0' & tsr(7 DOWNTO 1);
			END IF;
		END IF;
	END PROCESS;

	-- tdi
	PROCESS(clk)
	BEGIN
		IF RISING_EDGE(clk) THEN
			IF data_type='1' THEN
				tdi_o <= tsr(0);
			ELSE
				tdi_o <= '0';
			END IF;
		END IF;
	END PROCESS;
	
	-- tms
	PROCESS(clk)
	BEGIN
		IF RISING_EDGE(clk) THEN
			IF tscnt(5 DOWNTO 2)="0001" AND auto_tms='1' AND data_type='1' THEN
				tms0 <= '1';
			ELSIF data_type='0' THEN
				tms0 <= tsr(0);
			END IF;
		END IF;
	END PROCESS;
	tms_o <= tms0;
	ntrst_o <= rst;
	
	-- tscnt
	PROCESS(rst, clk)
	BEGIN
		IF rst='0' THEN
			tscnt_z <= '1';
			tscnt <= "000000";
		ELSIF RISING_EDGE(clk) THEN
			IF tsr_e='0' AND tsr_e0='1' THEN
				tscnt_z <= '0';
				tscnt <= thcnt & "00";
				auto_tms <= last_data;
			ELSIF tscnt="000000" THEN
				tscnt_z <= '1';
				auto_tms <= '0';
			ELSE
				tscnt_z <= '0';
				tscnt <= tscnt-1;
			END IF;
		END IF;
	END PROCESS;
	tck_o <= tscnt(1);
-----------------------------------------------------

	-- rsr_f
	PROCESS(rst, clk)
	BEGIN
		IF rst='0' THEN
			rsr_f <= '0';
		ELSIF RISING_EDGE(clk) THEN
			IF tscnt_z='1' AND tscnt_z0='0' THEN
				rsr_f <= '1';
--			ELSIF rbr_f='1' AND rbr_f0='0' THEN
			ELSIF (rbr_f='1' AND rbr_f0='0') OR (tsr_e='0' AND tsr_e0='1') THEN
				rsr_f <= '0';
			END IF;
		END IF;
	END PROCESS;

	-- rbr_f
	PROCESS(rst, clk)
	BEGIN
		IF rst='0' THEN
			rbr_f <= '0';
		ELSIF RISING_EDGE(clk) THEN
			IF rbr_r1='1' AND rbr_r='0' THEN
				rbr_f <= '0';
			ELSIF rsr_f='1' AND rbr_f='0' THEN
				rbr_f <= '1';
			END IF;
		END IF;
	END PROCESS;

	-- rsr
	PROCESS(clk)
	BEGIN
		IF RISING_EDGE(clk) THEN
			IF tscnt(1)='1' AND tscnt(0)='1' AND tscnt_z='0' THEN
				rsr <= rsr(6 DOWNTO 0) & tdo_i;
			END IF;
		END IF;
	END PROCESS;

	-- rbr
	PROCESS(clk)
	BEGIN
		IF RISING_EDGE(clk) THEN
			IF rsr_f='1' AND rbr_f='0' THEN
				rbr <= rsr;
			END IF;
		END IF;
	END PROCESS;
	
END main;
[转]P2P中的P2P中的“P文化”:【上一篇】
SAN Extension and Routing:【下一篇】
【相关文章】
  • Learn lumit Step 9 : 使用 JTAG 调试
  • 使用BDM和JTAG调试MPC8xx
  • linux下S3C44B0X Jtag工具(支持cfly.org Jtag cable)
  • 满足的嵌入式系统电路特性测试需求的JTAG技术
  • ARM系统设计JTAG接口常见问题
  • 【转】什么是JTAG与关于JTAG的一些说明
  • JTAG口及其对Flash的在线编程
  • 【随机文章】
  • word自动更正功能
  • 多服务器的日志合并统计
  • 使用PHP模拟HTTP认证
  • 用递归方法列出目录,在命令行中指定目录。
  • 现存问题以及解决方案:在ASP.NET AJAX中从客户端向服务器端传送DataTable
  • 全面解析韩国商业网站的设计
  • MapViewer移植到Weblogic Server的详细步骤
  • 朋友久违了!!!
  • 我是这样领导一个学生项目的(1)
  • 转载--博客技巧
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.