yxr注:
主要zt,附上自己的心得如下:
1)反觀SVF文件,除了設置必要的條件之外(初始條件和TIR等四條命令),真正的運行命令就兩條,SIR向JTAG TAP狀態機的IR寄存器送命令,SDR往JTAG TAP狀態機的DR寄存器送數據,在寫入的時候,送入的數據有效,在讀取的時候,送數據同時輸出的數據有效。
這樣的寫法及計算麻煩,可讀性也差。為了方便使用,SVF引入了TIR、HIR、TDR和HDR四條指令。
TIR是在SIR前面添加數據,比如,操作器件是第二個,那么第一個器件的數據用TIR添加,下一條指令是添加第一個器件的bypass命令。
TIR 6 TDI (3f) SMASK (3f) ;
2)FREQUENCY 4E6 HZ; (頻率4x10的6次方)
RUNTEST IDLE 164000000E-6 SEC; 即164000000 x 10 的-6,即164秒,
TAP有16個狀態,其中一個狀態就是RUNTEST IDLE(問題是,此時是否一直有TCK???)
3)
! ACT_TE_TAG Erase ... 表示開始
! ACT_TE_TAG Completed erase 表示結束
4)轉貼 JTAG 詳解
blog.csdn.net/broadview2006/article/details/3951512
--------------------------------------------------------------------------------------------------------------------------
http://www.chinabaike.com/2011/0203/282255.html
系統編程PROM可以進行單獨編程,或者級連編程。鏈中的所有器件共享TCK和TMS信號。TINI的TDI信號接到邊界掃描鏈中第一個器件的TDI輸進端。第一個器件的TDO信號接到鏈中第二個器件的TDI輸進上,如此連接下往。鏈中的最后一個器件的TDO輸出接到TINI的TDO引腳上,見圖1所示。
圖1. 所有JTAG操縱都通過器件的測試訪問端口進行控制
所有JTAG操縱都是由器件的測試訪問端口(TAP)控制的。TAP包括四個信號:TMS、TDI、TDO和TCK。 這些信號通過TAP控制器,即16狀態有限狀態機與器件相互作用。JTAG的TMS信號控制狀態間的轉換。指令和數據由TDI引腳移進器件,並由TDO引腳移出。TDI和TDO信號的所有狀態轉換和行為都與TCK同步。見圖2。
圖2.
所有JTAG操縱都是將數據移進或移出JTAG指令和數據寄存器。TAP控制器可對所有這些寄存器直接訪問。有兩類JTAG寄存器:指令寄存器(IR)和數據寄存器(DR)。訪問IR通過移位-IR (Shift-IR)狀態實現,而訪問DR通過移位-DR (Shift-IR)狀態實現。IR長度通常是大於2位的任意長度。除了由IEEE® Std. 1149.1定義的BYPASS指令為全1以外,生產約定義所有其它的指令位碼。
在本應用筆記中,JAVA樣例代碼將解釋說明串行向量格式(SVF)文件來進行編程。這里所用的SVF是描述高層IEEE 1149.1 (JTAG)總線操縱的語法規范。JTAG設備和軟件提供商已經將SVF作為標准用於數據交換。SVF以緊湊和可移植的形式描述JTAG鏈操縱。SVF文件通過描述需要移進器件鏈的信息,記錄JTAG操縱。通過Xilinx iMPACT (具體信息見下面)軟件,將JTAG操縱記錄在SVF文件中。SVF文件寫成ASCII文本形式,因此可以在任何文本編輯器中人工讀、修改和寫。“很多第三方編程工具使用SVF文件作為輸進,這樣利用包含在SVF文件中的信息可以對JTAG鏈中的Xilinx器件編程。”
http://www.wtoutiao.com/a/2508547.html
SVF的全稱是Serial Vector Format,是IEEE 1149.1的一部分。SVF主要用來控制JTAG收發數據。由於JTAG是串行的,所以收發是一起的。
使用SVF可以控制JTAG的發送端,而不用考慮JTAG TAP狀態機的細節。
通過SVF,就可以控制JTAG來傳輸數據。
目前,Vivado 2015.1沒有發布,所以SVF的操作只能通過iMPACT來實現。
這一篇主要講解SVF文件的生成。
iMPACT生成SVF的方法,其實類似於捕獲操作。下面用讀取FPGA的IDCODE來介紹如何生成SVF。
首先,啟動iMPACT,並點擊Boundary Scan。
上一回,生成了一個用於讀取FPGA IDCODE的SVF文件。今天,講講SVF語句。
SVF是控制JTAG的語句,類似於匯編語言,偏底層,控制JTAG具體的操作。
在上次的123.svf文件中,開頭一段是這樣的
TRST OFF;
ENDIR IDLE;
ENDDR IDLE;
STATE RESET;
STATE IDLE;
FREQUENCY 1E6 HZ;
這是設置JTAG初始狀態。這里不細說了,幾乎所有Xilinx iMPACT生成的SVF里都是一樣的。
然后是下列語句。
TIR 0 ;
HIR 0 ;
TDR 0 ;
HDR 0 ;
TIR 0 ;
HIR 0 ;
HDR 0 ;
TDR 0 ;
Xilinx iMPACT工具生成的SVF都會把TIR、HIR、TDR和HDR這四個命令重復一遍,一共8條。其實,只要四條即可。
具體的用處后面再講。
下面就是開始是正式的命令了。再一次,Xilinx iMPACT生成的svf中有大量重復。
SIR 6 TDI (09) ;
SDR 32 TDI (00000000) TDO (f3631093) ;
第一行 SIR 6 TDI (09)
這一句的意思是,往IR寄存器中輸入6bit數據,數值是0x09;
這就是讀取IDCODE的指令,6是IR Length,0x09是命令。在第三篇中已經提到這部分內容。
輸入讀取IDCODE的指令后,就是讀取IDCODE。
SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f3631093) MASK (0fffffff) ;
這一條命令是向DR寄存器發送32位數據,由於JTAG是串行的,所以這里輸入的數據沒有意義,只是為了串行移出DR寄存器中的32bit數據。
SMASK中的全f代表輸入的數據全部有效,不過這里由於輸入沒有意義,所以這個mask也沒有意義。
TDO后面是預計輸出的值,這里是f3631093,意思是預計輸出為這個數據,如果這個數據和真實數據不符,則會終止svf的運行。
后面的MASK代表對TDO數據的有效性。之前已經提過,NEXYS-4上的Artix-7,ID是3631093,也就是說只有7個16進制數據。IDCODE寄存器是32位,多出4位數據是無關緊要的,所以這里的mask值為 0fffffff,表明低28位有效,高4位無效。
另外說明一下,如果沒有重新聲明,TDI的SMARK和TDO的MASK會一直被使用到下次修改。同樣,TIR等命令也是如此。
隨后的兩條命令,是bypass模式。
SIR 6 TDI (3f) ;
SDR 1 TDI (00) SMASK (01) ;
反觀SVF文件,除了設置必要的條件之外(初始條件和TIR等四條命令),真正的運行命令就兩條,SIR向JTAG TAP狀態機的IR寄存器送命令,SDR往JTAG TAP狀態機的DR寄存器送數據,在寫入的時候,送入的數據有效,在讀取的時候,送數據同時輸出的數據有效。
下面討論一個問題,如果JTAG上不單單有一個器件,應該怎么寫。
比如,JTAG上有三個器件,簡單討論,都是Artix-7。那么IR Length都是6. 要操作的是中間一個。
這樣算的話,第一個器件和第三個器件的IR寄存器數據都是bypass命令 111111;中間一個器件的命令是001001。
總共的數據是 111111001001111111,
4個一組改寫一下,11_1111_0010_0111_1111,
寫成16進制,是3f27f
所以 SDR的命令是 SIR 18 TDI (3f27f) ; (YXR注:應該是SDR 18 TDI (3f27f)吧)
同理,bypass的數據寄存器位寬是1位,取這一位為0,所以數據總長度是34,預計輸出是
0x6c62126
掩碼為 1fffffe
這樣的寫法及計算麻煩,可讀性也差。為了方便使用,SVF引入了TIR、HIR、TDR和HDR四條指令。
TIR是在SIR前面添加數據,比如,操作器件是第二個,那么第一個器件的數據用TIR添加,下一條指令是添加第一個器件的bypass命令。
TIR 6 TDI (3f) SMASK (3f) ;
同理,TDR是在SDR前面添加數據。
TDR 1 TDI (00) SMASK (01) ;
HIR是在SIR后面添加數據,所以第三個器件的bypass命令如下。
HIR 6 TDI (3f) SMASK (3f) ;
HDR 1 TDI (00) SMASK (01) ;
添加這四條命令之后,對第二個器件的操作命令就和只有一個器件時完全一樣了,直接使用下面的命令即可
SIR 6 TDI (09) ;
SDR 32 TDI (00000000) TDO (f3631093) ;
再次修改之前,TIR等四條命令一直有效。(yxr注:一直有效是什么意思,是指一直對第二個器件操作嗎?)
好了,基本的SVF命令已經介紹完畢。不過,除了IDCODE,還沒有和FPGA聯系起來。下一回,來看看與Xilinx FPGA的聯系吧。