張立強,宋 玲,劉寶娟
(中國電子科技集團公司第四十七研究所,沈陽110032)
利用并口下載電纜實現JTAG下載,把并口的有效端口和JTAG端口連接起來,實現了數據寫入、數據讀出、控制器的信號輸入、時鐘的傳輸。在狀態機的正確狀態下進行指令匹配和數據傳輸。并在保證數據下載正確的前提下,達到下載速度的最優化。
計算機的標準并行端口是25針的母接頭端口。這25只管腳并不是都被用到。這些管腳分別用于數據的傳輸、檢查打印機的狀態及控制打印機。數據端口保存了寫入數據和輸出端口的一個字節信息。每位數據都是并行傳送的,它通常是以字節(8位)為單位進行數據傳輸。并口的Pin2(TCK)、Pin3(TDI)、Pin8(TMS)分別對應數據寄存器的第0位、第1位、第6位。并口的Pin11(TDO)對應狀態寄存器的第7位。Pin18到Pin25是引腳GND。
TAP控制器是一個有限狀態機,一共有16個狀態。測試訪問狀態機的目的是選擇指令寄存器和數據寄存器,使其連接到TDI和TDO之間。
邏輯測試單元有一個指令寄存器和三個數據寄存器,三個數據寄存器為:旁路寄存器(BYPASS),識別碼寄存器(IDCODE),邊界掃描寄存器(BOUND)。指令決定使用哪個寄存器。指令寄存器為4位,指令由TDI引腳串行輸入。如圖1所示。
1位旁路寄存器(BYPASS)為TDI-TDO提供了一個最短的串行通路。在板級測試期間,可以通過這條通路繞開不需測試的設備。這可以提高測試速度。32位識別寄存器(IDCODE)提供了設備的制造商、版本號等信息。邊界掃描寄存器(BOUND)保持引腳的狀態或引腳需要的數據。邊界掃描寄存器為一個串行的移位寄存器,每個單元分配給芯片的相應引腳。

圖1 測試單元的結構
在這些指令中時鐘的上升沿對TDI和TMS進行采樣。所有的輸出TDO都是在下降沿產生的。
JTAG并口編程的實質就是首先將EXTEST指令串行移入可編程芯片上JTAG器件的指令寄存器,然后控制JTAG器件的TCK和TMS引腳使其進入SHIFT-DR狀態,再將數據串行移入到JTAG器件的邊界掃描寄存器,最后控制JTAG器件的TCK和TMS引腳使其進入UPDATE-DR狀態,將位流寫入FPGA。指令裝載完成后,只要不更改指令,就不需要再進行指令移位了,此時只需要進行數據移位,所以數據移位是編程的主要操作。狀態轉換如圖2所示。

圖2 TAP控制器的16種狀態切換圖
首先對狀態機復位,使JTAG單元從任何的未知狀態回到TEST-LOGIC-RESET狀態,讓TMS至少保持連續6個周期的高電平后,回到TESTLOGIC-RESET狀態。程序代碼片段如下:
for(n=0;n<6;n++)
send_bit(0,1);//連續6個周期的高電平
TMS加一個周期的低電平,轉到RUN-TEST/IDLE狀態。TMS加兩個周期的高電平轉到 SELECT-IR狀態。加兩個周期的低電平后轉到SHIFT-IR狀態。程序代碼片段如下:
send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
send_bit(0,0);//轉到SHIFT-IR狀態
開始加載CFG_IN指令,指令碼是0101,加載一個周期的高電平轉到EXIT1-IR。程序代碼片段如下:
send_bit(1,0);
send_bit(0,0);
send_bit(1,0);
send_bit(0,0);
send_bit(0,1);//加載CFG_IN指令
TMS加載兩個周期的高電平轉到SELECT-DR狀態,再加載兩個周期的低電平后轉到SHIFTDR。程序代碼片段如下:
send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
send_bit(0,0);//轉到SHIFT-DR狀態
開始寫配置寄存器選項 COR,寫入指令后SHUTDOWN置1。寫START指令到CMD指令寄存器。寫清CRC指令寄存器。然后加載三個周期的高電平轉到SELECT-IR,再加載兩個周期的低電平轉到SHIFT-IR狀態。程序代碼片段如下:
send_bit(0,1);
send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
send_bit(0,0);//轉到 SHIFT-IR 狀態
加載 JSTART指令到指令寄存器,指令碼是0011,加載一個周期的高電平轉到EXIT1-IR狀態。程序代碼片段如下:
send_bit(0,0);
send_bit(0,0);
send_bit(1,0);
send_bit(1,0);
send_bit(0,1);//加載JSTART指令
加載兩個周期的高電平,再加載兩個周期的低電平轉到SHIFT-DR狀態。程序代碼片段如下:send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
send_bit(0,0);//轉到SHIFT-DR狀態
加載17個時鐘周期關閉時序。程序代碼片段如下:
for(n=0;n<17;n++)
send_bit(0,n==16);
加載三個周期的高電平和兩個周期的底電平轉到SHIFT-IR狀態,加載CFG_IN指令。在SHIFTDR狀態寫AGHIGH指令到CMD寄存器中,產生GHIGH_B信號。寫COR使得SHUTDOWN狀態是0。寫完指令后,加載三個周期的高電平和兩個周期的低電平,狀態轉到 SHIFT-IR狀態。加載JSTART指令后轉到SHIFT-DR狀態。加載17個時鐘周期關閉時序轉到SHIFT-IR狀態,加載CFG_IN指令。在SHIFT-DR狀態寫AGHIGH指令到CMD寄存器中,產生GHIGH_B信號。寫COR使得SHUTDOWN狀態是1。寫完指令后,加載三個周期的高電平和兩個周期的低電平,轉到SHIFT-IR狀態。加載JSTART指令。轉到SHIFT-DR狀態,加載17個時鐘周期關閉時序。轉到SHIFT-IR狀態,加載CFG_IN指令。轉到SHIFT-DR狀態,加載二進制位流文件,進行編程下載工作。位流全部移進后,轉到SHIFT-IR狀態,加載JSTART指令。加載兩個周期的高電平和兩個周期的低電平后轉到SHIFT-DR狀態。加載17個周期的低電平后,再加載兩個周期的高電平和一個周期的低電平,狀態機轉到RUN-TEST/IDLE狀態。程序代碼片段如下:
send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
JTAG編程下載完成。
JTAG下載程序在多款可編程芯片上進行了測試,位流能成功進行下載,電路的功能經驗證完全正確。
JTAG并口編程很好的實現了位流文件到FPGA的下載,并對下載成功與否做出了明確的判斷。通過指令回讀出狀態寄存器的狀態,用于對比下載前后FPGA的狀態變化。
[1][美]Dhananjay.V.Gadre.并行端口編程[M].北京:中國電力出版社,2000.
[2]何希順,張躍,何榮森.嵌入系統中的JTAG接口編程技術[J].電子技術應用,2001,27(12):9-12.