亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tag2.vhd

?? Xilinx_usb_jtag 下載器原理圖及程序
?? VHD
?? 第 1 頁 / 共 2 頁
字號:
--
--   Copyright (C) 2003 by J. Kearney, Bolton, Massachusetts
--
--   This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
--   This program is distributed in the hope that it will be useful, but
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-- for more details.
--
--   You should have received a copy of the GNU General Public License along
-- with this program; if not, write to the Free Software Foundation, Inc.,
-- 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
--

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

library unisim;
use unisim.vcomponents.all;

entity JTAG_Controller is
	generic
		(NUM_TAPS : integer := 2;
		 NUM_BUFS : integer := 4);
	port
		(clk : in std_logic;
		 usb_d : inout std_logic_vector(7 downto 0);
		 usb_rd_n : buffer std_logic;
		 usb_wr : buffer std_logic;
		 usb_txe_n : in std_logic;
		 usb_rxf_n : in std_logic;
		 usb_si : out std_logic;
		 jtag_tck_A : out std_logic_vector(0 to NUM_TAPS-1);
		 jtag_tck_B : out std_logic_vector(0 to NUM_TAPS-1);
		 jtag_tck_fb : in std_logic_vector(0 to NUM_TAPS-1);
		 jtag_tdo : in std_logic_vector(0 to NUM_TAPS-1);
		 jtag_tdi_term : out std_logic_vector(0 to NUM_TAPS-1);
		 jtag_tdi : out std_logic_vector(0 to NUM_TAPS-1);
		 jtag_tms : out std_logic_vector(0 to NUM_TAPS-1);
		 jtag_trst_n : out std_logic_vector(0 to NUM_TAPS-1);
		 jtag_rst_n : out std_logic_vector(0 to NUM_TAPS-1);
		 jtag_dint : out std_logic_vector(0 to NUM_TAPS-1);
		 jtag_vgnd : out std_logic_vector(0 to 3);
		 LEDs : out std_logic_vector(3 downto 0);
		 jtag_extra : inout std_logic_vector(0 to 7);
		 reconfigure : out std_logic);

attribute clock_buffer : string;
attribute clock_buffer of jtag_tck_fb : signal is "ibufg";
attribute clock_buffer of usb_rxf_n : signal is "ibuf";
attribute clock_buffer of usb_txe_n : signal is "ibuf";

end JTAG_Controller;

architecture RTL of JTAG_Controller is

	constant DEBUG : boolean := false;

	-- Action Commands (msb of received byte is '0', this code is in b6..b4).

	subtype JCCMD is std_logic_vector(2 downto 0);
	constant CMD_SETCURTAP 	: JCCMD := "000";	-- new current TAP is in b3..0
	constant CMD_GETSTATUS 	: JCCMD := "001";	-- return status byte (see below)
	constant CMD_WRBUF	 	: JCCMD := "010"; -- write to current output buffer using COUNT and ADDR (*)
	constant CMD_RDBUF	 	: JCCMD := "011";	-- read from input buffer using COUNT and ADDR (*)
	constant CMD_RUN		 	: JCCMD := "100";	-- start TAP cycle (see below)
	constant	CMD_COPY			: JCCMD := "101";	-- copy input buffer to current
															-- output buffer ADDR..ADDR+COUNT-1
	constant	CMD_DELAY		: JCCMD := "110";	-- delay COUNT+(8192-ADDR)*8191 USB cycles (62.5ns)

	-- If msb is '1', b6..b4 are register number, b3..b0 are high 4 bits to
	-- put in that register and next received byte is low 8 bits.
	-- registers are 12 bits each

	constant GLOBAL: integer := 0;	-- global configuration settings
	constant COUNT : integer := 1;	-- number of bytes to transfer to/from buffer
	constant TMS	: integer := 2;	-- tms data (*1)
	constant BITS  : integer := 3;	-- length of vector in bits
	constant ADDR  : integer := 4;	-- offset into buffer
	-- reg 5 unused, next two are mapped to 6 and 7
	constant CONFIG1: integer := 0;	-- settings, on a per-TAP basis
	constant CONFIG2: integer := 1;	-- settings, on a per-TAP basis

	subtype JCRegister is unsigned(11 downto 0);
	type JCRegFile is array(GLOBAL to ADDR) of JCRegister;
	type JCSetupRegFile is array(CONFIG1 to CONFIG2) of JCRegister;

	-- GLOBAL reg:
	-- b0..3		LEDs (1=on)
	-- b11..8	reconfigure when = 1001

	-- CONFIG1 reg:
	-- b0		output enable jtag_extra(0)
	-- b1		output value jtag_extra(1)
	-- b2..b7	same for jtag_extra(1..3)
	-- b9		TDO termination on
	-- b10	TCK termination A on
	-- b11	TCK termination B on

	-- CONFIG2 reg:
	-- b3..0 	clock setting
	--		0000 => 48, 32, 24, 16, 12, 8, 6, 4, 3, 2, 1.5, 1, 0.75, 0.5, 0.375, 0.25 MHz
	-- b6..4 	current output buffer assignment
	-- b7			tristated
	-- b8			rst (active low)
	-- b9			trst (active low)
	-- b10		dint (active high)
	-- b11		free-running TCK mode

	-- CMD_GETSTATUS returns: (specific to current TAP)
	--	b0 	running
	-- b1 	DLLs locked
	-- b4..7	values at jtag_extra() pins

	-- CMD_RUN takes:
	-- b0 1=>store tdi into input buffer, else unchanged
	-- b1 1=>output tdo from output buffer, else '0'
	-- b2 1=>raise TMS on last bit
	-- register BITS determines how many tck pulses there will be
	-- register TMS contains the bit pattern to be put on TMS. The last bit will be repeated
	-- if BITS is greater than 12.
	-- These registers can be changed any time after CMD_RUN is issued

	-- Timing:
	-- With a 48 MHz clock, the USB state machine cycle is 62.5 ns.
	-- This means that each byte of a command will take 125 ns,
	-- and any additional bytes sent or received 125 ns each.
	-- E.g. a register set command
	-- will take 250 ns, exclusive of any USB latency.
	-- A couple of special cases:
	-- 	CMD_RUN will finish when the TAP state machine starts, which depends on the
	-- 	TAP clock speed.
	-- 	CMD_DELAY will take 125+62.5*(COUNT+8191*(8192-ADDR)) ns

	-- Note (*) - bit ordering follows Xilinx convention of lsb being first bit shifted out or in

	-- attributes used
	attribute clock_signal : string;
	attribute clkdv_divide : string;

	-- components used

	component Sync is
	    Port ( RESET : in std_logic;
		 		  REQ : in std_logic;
	           ACK : in std_logic;
	           STATUS : buffer std_logic);
	end component;

	-- signals
	signal reset 	: std_logic;

	signal clk_2	: std_logic;								-- 96 MHz
	signal clk_1_5	: std_logic;								-- 64 MHz

	signal clk_lock_1, clk_lock_2 : std_logic;			-- DLLs locked
	signal usb_clk	: std_logic;								-- 16 MHz
	signal jtag_clk: std_logic_vector(0 to NUM_TAPS-1);-- selected tck freq

	attribute clock_signal of usb_clk : signal is "true";

	type CmdStates is
		(Idle,
		 GetAck,
		 GetAck_wait,
		 PutCmd,
		 PutLow_wait,
		 PutLow,
		 PutLowT_wait,
		 PutLowT,
		 PutBuf_wait,
		 PutBuf,
		 GetStatus_wait,
		 GetStatus,
		 GetBuf_wait,
		 GetBuf,
		 RunStart,
		 RunAck,
		 Copy1,
		 Copy2,
		 Delay);

	signal cmd_state : CmdStates;

	attribute fsm_encoding : string; 
	attribute fsm_encoding of cmd_state : signal is "sequential"; 

	signal cur_tap : integer range 0 to NUM_TAPS-1;
	signal want_tdi, want_tdo, want_pingTMS: boolean;
	signal cur_reg : integer range JCRegFile'range;
	signal cur_setup_reg : integer range JCSetupRegFile'range;
	signal reading_buf, reading_status, reading_ack: boolean;
	signal ack_code: std_logic_vector(7 downto 0);

	signal reg : JCRegFile;

	type JCSetupRegs is array(0 to NUM_TAPS-1) of JCSetupRegFile;
	signal setup_reg: JCSetupRegs;

	-- TCK feedback
	signal tck_fb: std_logic_vector(NUM_TAPS-1 downto 0);

	-- buffer signals from the TAP side
	subtype BVAddr is unsigned(11 downto 0);	-- 4096x1
	type TAPAddrs is array(0 to NUM_TAPS-1) of BVAddr;

	signal TAP_rd_addr, TAP_wr_addr : TAPAddrs;
	signal done_flagged,
			 done_ack,
			 TAP_rd_data,
			 TAP_rd_clk,
			 TAP_wr_data,
			 TAP_wr_store,
			 TAP_wr_clk,
			 TAP_start,
			 TAP_ack,
			 TAP_busy : std_logic_vector(0 to NUM_TAPS-1);

	-- buffer signals from the USB side
	subtype BFAddr is unsigned(8 downto 0);	-- 512x8
	type BFDatas is array(0 to NUM_TAPS-1) of std_logic_vector(7 downto 0);

	signal Buf_rd_data : BFDatas;

	-- synchronized USB signals
	signal sync_rd : std_logic;

begin

	jtag_vgnd <= (others => '0');

	debug_output: if DEBUG generate
	signal xstate : std_logic_vector(0 to 4);
	begin

		xstate <= std_logic_vector(to_unsigned(CmdStates'pos(cmd_state), 5));
		jtag_extra(0 to 4) <= xstate;
		jtag_extra(5) <= sync_rd;
		jtag_extra(6) <= '0';
		jtag_extra(7) <= usb_clk;

	end generate;

--===========================================================================
-- Reset
--===========================================================================
-- We use built-in 'reset on configure' component so that the VHDL can be
-- coded with explicit resets.  This is really the built-in startup logic,
-- so no extra circuitry is generated.
-----------------------------------------------------------------------------

global_reset: ROC port map (O => reset);

--===========================================================================
-- Clock Generation
--===========================================================================
-- 96 Mhz, 64 Mhz and 16 MHz clocks are generated from the input 48 MHz clock
-- here.
-----------------------------------------------------------------------------

global_clk_gen: if true generate

	attribute clkdv_divide of clk_div_1_5 : label is "1.5";

	signal clk_int, clk_2_int, clk_2_fb : std_logic;
	signal dll2, dll2fb, rst2 : std_logic;
	signal usb_clk_int : std_logic;
	signal usb_clk_div : unsigned(1 downto 0);

begin

	-- if we need the BUFG's, 2x and /1.5 could be done in logic -
	-- see XCell and TechXclusives on Xilinx website.

	clkpad : IBUFG  port map (I => clk, O => clk_int);
	-- generate 96 MHz clock
	clk_dll: CLKDLL
		port map (RST => reset,
					 CLKIN => clk_int, CLK2X => clk_2_int, CLKFB => clk_2,
					 LOCKED => clk_lock_1);

	clk2fb: BUFG port map (I => clk_2_int, O => clk_2);

	-- hold 2nd DLL in reset until the 1st is locked
	rst2 <= not clk_lock_1;

	-- generate 64 MHz clock
	clk_div_1_5: CLKDLLHF
		port map (RST => rst2,
					 CLKIN => clk_2, CLK0 => dll2, CLKFB => dll2fb,
					 CLKDV => clk_1_5, LOCKED => clk_lock_2);

	dll_fb: BUFG port map (I => dll2, O => dll2fb);

	-- divide 72 MHz downto 16MHz - get 62.5 ns period clock used for communicating with the
	-- FT245BM, which wants >= 50 ns pulses for RD and WR.
	process (reset, clk_1_5)
	begin
		if reset = '1' then
			usb_clk_div <= (others => '0');
		elsif rising_edge(clk_1_5) then
			usb_clk_div <= usb_clk_div + 1;
		end if;
	end process;

	-- put the usb clock onto a clock net
	usb_clk_buf: BUFG
		port map (I => usb_clk_div(usb_clk_div'high), O => usb_clk);

end generate;

--===========================================================================
-- Global Configuration register
--===========================================================================
-- global feature selects
-----------------------------------------------------------------------------

--LEDs <= std_logic_vector(not reg(GLOBAL)(3 downto 0));
LEDs(3) <= '0' when (reg(GLOBAL)(3) = '1') or (cmd_state = IDle) else '1';
LEDs(2) <= '0' when (reg(GLOBAL)(2) = '1') or (cmd_state = Delay) else '1';
LEDs(1) <= '0' when (reg(GLOBAL)(1) = '1') or (TAP_busy(0) = '1') else '1';
LEDs(0) <= '0' when (reg(GLOBAL)(0) = '1') or (TAP_busy(1) = '1') else '1';

reconfigure <= '0' when reg(GLOBAL)(11 downto 8) = "1001" else 'Z';

--===========================================================================
-- USB command state machine
--===========================================================================
-- this state machine controls all communications with the USB interface,
-- and command decoding and execution.
-----------------------------------------------------------------------------

-- async process to write data to USB data bus
process (reading_buf, reading_status, reading_ack,
			cur_tap, Buf_rd_data, jtag_extra, ack_code)
begin
	if reading_status then
		usb_d(0) <= TAP_busy(cur_tap);	-- doing TAP run?
		usb_d(1) <= '1';	-- clocks locked?
		usb_d(2) <= '0';
		usb_d(3) <= '0';

		if DEBUG then
			usb_d(7 downto 4) <= (others => '0');
		else
			extra_rd: for idx in 0 to 3 loop
				usb_d(idx+4) <= jtag_extra(cur_tap*4+idx);
			end loop;
		end if;
	elsif reading_buf then
		usb_d <= Buf_rd_data(cur_tap);
	elsif reading_ack then
		usb_d <= ack_code;
	else
		usb_d <= (others => 'Z');
	end if;
end process;

-- handshake USB RXF with RD - data available when sync_rd is set
hs_rd: Sync port map
	(RESET => reset, REQ => not usb_rxf_n, ACK => usb_rd_n, STATUS => sync_rd);

-- track done statusi
dones: for cur in 0 to NUM_TAPS-1 generate
begin
	doneflag: Sync port map
		(RESET => reset, REQ => not TAP_busy(cur),
		 ACK => done_ack(cur), STATUS => done_flagged(cur));
end generate;

-- generate usb_rd_n and usb_wr
process (reset, cmd_state)
begin
	if reset = '1' then
		usb_rd_n <= '1';
		usb_wr <= '0';
	else
		case cmd_state is

			when PutCmd | PutLow | PutLowT | PutBuf =>
				usb_rd_n <= '0';
				usb_wr <= '0';

			when GetStatus | GetBuf | GetAck =>
				usb_rd_n <= '1';
				usb_wr <= '1';

			when others =>
				usb_rd_n <= '1';
				usb_wr <= '0';

		end case;
	end if;
end process;

-- generate usb_si
usb_si <= '0' when cmd_state = Idle else '1';

-- sync process manages all USB communication and executes commands
process (clk_lock_2, usb_clk, usb_d, sync_rd, usb_txe_n)
variable reg_num : integer;
variable acking : boolean;
begin

	if clk_lock_2 = '0' then	-- indirect result of reset

		cmd_state <= Idle;
		cur_tap <= 0;
		TAP_start <= (others => '0');
		reading_status <= false;
		reading_buf <= false;
		reading_ack <= false;
		done_ack <= (others => '0');

		-- init registers all to 0
		for idx in reg'left to reg'right loop
			reg(idx) <= (others => '0');

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美丰满一区二区免费视频| 亚洲影视在线播放| 欧美成人精品二区三区99精品| 欧美在线不卡一区| 在线观看日韩毛片| 91高清在线观看| 99久久精品一区| 成人免费视频播放| 成人动漫中文字幕| 91在线观看成人| 91免费看片在线观看| 成人av网在线| 91亚洲男人天堂| 色综合中文综合网| 国产三区在线成人av| 国产欧美日韩精品一区| 国产夜色精品一区二区av| 国产亚洲一二三区| 中文欧美字幕免费| 亚洲免费av观看| 久久99国内精品| 看片的网站亚洲| 国产福利电影一区二区三区| 成人精品在线视频观看| 99麻豆久久久国产精品免费 | 91在线精品秘密一区二区| 97久久超碰国产精品电影| 色综合色综合色综合色综合色综合 | 五月天视频一区| 伦理电影国产精品| 国产成人av影院| 一本一道久久a久久精品| 欧美群妇大交群的观看方式| 精品精品国产高清一毛片一天堂| 亚洲精品在线观看视频| 欧美国产视频在线| 一区二区久久久久久| 视频一区在线视频| 国产精品一区免费视频| 91女厕偷拍女厕偷拍高清| 欧美精品少妇一区二区三区| www久久精品| 又紧又大又爽精品一区二区| 免费在线看成人av| 国产成人免费在线视频| 日本道精品一区二区三区| 欧美一区二区三区四区高清| 欧美va亚洲va香蕉在线| 国产精品短视频| 蜜臀久久99精品久久久久久9 | 欧美女孩性生活视频| 精品成人佐山爱一区二区| 亚洲视频一区二区在线观看| 日本sm残虐另类| 成人性生交大片免费看在线播放| 欧美三电影在线| 久久久久久久久一| 亚洲国产日韩在线一区模特 | 精品国一区二区三区| 亚洲精品美腿丝袜| 经典三级在线一区| 欧美最猛性xxxxx直播| 久久久国产精品不卡| 肉色丝袜一区二区| 99精品视频在线观看| 欧美sm美女调教| 亚洲一区免费视频| 大白屁股一区二区视频| 日韩三级视频在线观看| 亚洲视频一区二区在线观看| 久久精品国产亚洲aⅴ| 91国模大尺度私拍在线视频| 国产欧美日本一区二区三区| 蜜臀av一区二区在线观看| 日本精品一区二区三区高清 | 国产调教视频一区| 午夜久久久久久电影| 本田岬高潮一区二区三区| 欧美videossexotv100| 亚洲成人久久影院| 色综合久久66| 美女免费视频一区二区| 91色.com| 成人欧美一区二区三区| 高清成人在线观看| 久久这里只有精品首页| 日韩av中文字幕一区二区三区| 99国产精品久久久久久久久久| 久久久久九九视频| 久久国产精品99久久久久久老狼| 欧美日本在线视频| 亚洲少妇30p| av中文字幕亚洲| 欧美激情一二三区| 国产裸体歌舞团一区二区| 日韩精品一区二区三区老鸭窝| 亚洲成人综合在线| 欧美综合天天夜夜久久| 亚洲精品写真福利| 91无套直看片红桃| 国产精品高潮呻吟| 成人av网站免费观看| 最好看的中文字幕久久| 色屁屁一区二区| 亚洲一区二区中文在线| 欧美视频一区二区三区| 亚洲成人av一区二区三区| 欧美日韩一区二区三区在线| 亚洲成人av中文| 在线不卡免费av| 蜜臀va亚洲va欧美va天堂 | 精品久久99ma| 国产尤物一区二区| 久久久国产精品麻豆| 高清av一区二区| |精品福利一区二区三区| 99久久精品国产观看| 亚洲一区视频在线观看视频| 欧美精品黑人性xxxx| 青椒成人免费视频| 337p粉嫩大胆色噜噜噜噜亚洲| 国产一区二三区| 国产精品久久久久影视| 色欧美88888久久久久久影院| 一区二区三区四区激情| 欧美高清视频在线高清观看mv色露露十八 | 91精品国产综合久久婷婷香蕉| 免费人成在线不卡| 2021国产精品久久精品| 不卡免费追剧大全电视剧网站| 亚洲欧美日韩国产另类专区| 欧美精品欧美精品系列| 黑人巨大精品欧美一区| 国产精品国产精品国产专区不蜜 | 美女国产一区二区| 久久久精品日韩欧美| 一本久久精品一区二区| 日韩精品电影在线| 国产视频不卡一区| 欧美唯美清纯偷拍| 精品在线一区二区| 国产精品国产三级国产普通话99 | 精品sm捆绑视频| 91年精品国产| 久久精品99国产精品| 国产精品入口麻豆九色| 精品视频一区二区三区免费| 黄色精品一二区| 一区二区视频在线看| 日韩三级视频在线看| 成人app网站| 日韩av电影免费观看高清完整版 | 日本vs亚洲vs韩国一区三区二区| 日本一区二区综合亚洲| 欧美曰成人黄网| 国产一区二区伦理片| 亚洲美女淫视频| 2021久久国产精品不只是精品| 在线欧美日韩国产| 激情偷乱视频一区二区三区| 一区二区在线观看视频| 欧美成人性战久久| 色94色欧美sute亚洲13| 国产精品 日产精品 欧美精品| 亚洲成年人网站在线观看| 国产精品欧美久久久久一区二区| 欧美精品久久99久久在免费线| 99国产精品久久久久久久久久久| 精品一区二区三区欧美| 洋洋av久久久久久久一区| 国产日产欧美一区二区视频| 欧美精品tushy高清| 91一区二区三区在线播放| 国产精品自在在线| 日本欧美大码aⅴ在线播放| 亚洲另类中文字| 中文字幕久久午夜不卡| 日韩免费看的电影| 欧美精品v国产精品v日韩精品| 一本高清dvd不卡在线观看 | 精品国免费一区二区三区| 日本高清不卡一区| 成人激情午夜影院| 国产一区二区三区日韩| 久久国产福利国产秒拍| 午夜精品久久久久久不卡8050| 亚洲免费资源在线播放| 国产精品人妖ts系列视频| 久久综合九色欧美综合狠狠| 在线播放视频一区| 欧美在线观看一二区| 91在线观看成人| 99久久婷婷国产综合精品| 国产精品香蕉一区二区三区| 久久丁香综合五月国产三级网站| 图片区小说区区亚洲影院| 亚洲高清免费观看高清完整版在线观看| 亚洲人吸女人奶水| 亚洲欧美在线视频| 国产精品理伦片|