硬件和軟件需求
以下為所需要的硬件和軟件:
TINI400評估板,并配置有MxTNI OS 1.12或更高版本(見 https://www.maximintegrated.com/cn/app-notes/index.mvp/id/612 )。
JTAG器件(可編程邏輯)。
器件鏈中JTAG器件模型的SVF文件。關于SVF文件的更多信息,請查閱 。
MxTNI JTAG庫。關于JTAG類的更多信息請訪問 。
編程步驟
第1步: 將MxTNI板的4個JTAG引腳與JTAG器件的4個JTAG引腳相連。
第2步: 遵循SVF文件的命令并使用JTAG庫編寫JAVA應用程序,來對JTAG器件進行編程,編譯后加載到MxTNI。
(附錄A: 一個樣例Idcode.svf文件,實現從單獨的XC18V02 Xilinx器件讀取IDCODE。)
(附錄B: 樣例AppJtag.java程序,將SVF文件作為輸入并產生JTAG信號來讀取IDCODE。該樣例程序是用來處理單獨器件的(對于級連器件的詳細信息見附錄C)。)
(附錄C: 展示了由已有的SVF文件編程級連器件的步驟。)
第3步: 運行JAVA程序。可執行AppJtag.tini將加載到MxTNI板。在MxTNI提示符下錄入“java AppJtag.tini Idcode.svf”來運行程序。程序將產生JTAG信號與JTAG器件進行通信。注意:
1、生成的編程JTAG器件SVF文件應該與器件鏈中設計的確切模型一致。
2、所有操作碼,例如編程JTAG器件的READ、WRITE、ERASE及其它命令等,都是由生產商定義的。SVF文件應該包含用戶需要的所有操作碼。
示例
以下示例說明了如何利用JTAG庫從Xilinx JTAG器件XC18V02中讀取Idcode。完整的樣例代碼,請查閱附錄B。
1、生成器件模型的SVF文件:
使用Xilinx WEB START來生成SVF文件。
執行iMPACT并選擇單選按鈕“Prepare Configuration Files”選項,然后點擊next。選擇單選按鈕“Boundary Scan file”并點擊next。選擇“SVF File”然后點擊finish。
在對話框中錄入SVF文件名,例如example,并點擊OK。
選擇要加載的name_of_mcs_file.mcs文件,并從列表中選擇PROM器件(XC18V02_vq44)。
XC18V02已加到模型中。
點擊我們要編程的XC18V02器件型號。器件將為高亮顯示。
點擊鼠標右鍵,并選擇編程選項。勾選“Get Idcode”。
在模型外點擊鼠標以取消高亮顯示器件,右擊并選擇option以關閉SVF。這時就生成了模型的SVF文件。
讀取SVF文件并使用JTAG庫來編程XC18V02器件。
以下為SVF文件的部分樣例代碼:
// Created using Xilinx iMPACT Software [ISE WebPACK - 5.1i]
TRST OFF;
ENDIR IDLE;
ENDDR IDLE;
STATE RESET IDLE;
TIR 0 ;
HIR 0 ;
TDR 0 ;
HDR 0 ;
// Validating chain...
TIR 0 ;
HIR 0 ;
TDR 0 ;
HDR 0 ;
SIR 8 TDI (ff) SMASK (ff) ;
TIR 0 ;
HIR 5 TDI (1f) SMASK (1f) ;
HDR 1 TDI (00) SMASK (01) ;
TDR 0 ;
//Loading device with 'idcode' instruction.
SIR 8 TDI (fe) SMASK (ff) ;
SDR 32 TDI (00000000) SMASK (ffffffff) TDO (05025093) MASK (ffffffff) ;
//Loading device with 'conld' instruction.
SIR 8 TDI (f0) ;
RUNTEST 110000 TCK;
遵循SVF命令并使用庫向XC18V02發送命令。
SVF規范提供了四個全局填充指令:頭指令寄存器(HIR)、尾部指令寄存器(TIR)、頭數據寄存器(HDR)和尾部數據寄存器(TDR)。這些全局命令規定了移位操作的開始和結尾處要填充的位數,從而解決旁路器件問題,并為SVF文件壓縮提供了一種簡單的方法。一旦指定,這些位會出現在SIR或者SDR命令的每一組比特位的前面或者后面。
以下兩個示例說明如何把SVF命令解釋為JTAG庫命令。
示例1: 帶有全局填充指令的SVF語法結構
a/ SVF file commands:
STATE RESET IDLE;
TIR 0 ;
HIR 5 TDI (1f) SMASK (1f) ;
HDR 1 TDI (00) SMASK (01) ;
TDR 0 ;
//Loading device with 'idcode' instruction.
SIR 8 TDI (fe) SMASK (ff) ;
SDR 32 TDI (00000000) SMASK (ffffffff) TDO (05025093) MASK (ffffffff) ;
//Loading device with 'conld' instruction.
SIR 8 TDI (f0) ;
RUNTEST 110000 TCK;
//Check for Read/Write Protect.
SIR 8 TDI (ff) TDO (01) MASK (ff) ;
//Loading device with 'idcode' instruction.
SIR 8 TDI (fe) ;
SDR 32 TDI (00000000) TDO (05025093) ;
//Loading device with 'conld' instruction.
SIR 8 TDI (f0) ;
RUNTEST 110000 TCK;
//Check for Read/Write Protect.
SIR 8 TDI (ff) TDO (01) ;
TIR 0 ;
HIR 0 ;
TDR 0 ;
HDR 0 ;
b/ Sample JAVA program using JTAG library:
import java.io.*;
import javax.comm.*;
import com.dalsemi.comm.*
public static void main(String[] args)
{
myJtag = new jtag();
int SIZE = 0x1000;
byte[] byteArray = new byte[SIZE];
byte HeaderInstBitVal = (byte)0x00;
byte TrailerInstBitVal = (byte)0x00;
byte HeaderDataBitVal= (byte)0x00;
byte TrailerDataBitVal= (byte)0x00;
// STATE RESET IDLE;
myJtag.initialize();//This JTAG library method will initialize
// XC18V02 TAP controller and stay at
// Run-Test/Idle
// TIR 0 ;
byte TIR = (byte)0x00;
// HIR 5 TDI (1f) SMASK (1f) ;
byte HIR = (byte)0x05;
HeaderInstBitVal = (byte)0x01;
// HDR 1 TDI (00) SMASK (01) ;
byte HDR = (byte)0x01;
HeaderDataBitVal = (byte)0x00;
// TDR 0
byte TDR = (byte)0x00;
// SIR 8 TDI (fe) SMASK (ff) ;
byteArray[0] = (byte)0xfe;
myJtag.sendNrcv(byteArray,0,1,(byte)8,true,false,(byte)HIR,
(byte)HeaderInstBitVal,(byte)TIR,(byte)TrailerInstBitVal);
// SDR 32 TDI (00000000) SMASK (ffffffff) TDO (05025093) MASK
// (ffffffff) ;
byteArray[0] = (byte)0x00;
byteArray[1] = (byte)0x00;
byteArray[2] = (byte)0x00;
byteArray[3] = (byte)0x00;
myJtag.sendNrcv(byteArray,0,4,(byte)8,false,false,(byte)HDR,
(byte)HeaderDataBitVal,(byte)TDR,(byte)TrailerDataBitVal);
// SIR 8 TDI (f0) ;
byteArray[0] = (byte)0xf0;
myJtag.sendNrcv(byteArray,0,1,(byte)8,true,false,(byte)HIR,
(byte)HeaderInstBitVal,(byte)TIR,(byte)TrailerInstBitVal);
// RUNTEST 110000 TCK;
myJtag.waitState(100); // Depend on operation frequency, user can
// calculate how many miliseconds to wait.
}
評論
查看更多