張立強,宋 玲,劉寶娟
(中國電子科技集團(tuán)公司第四十七研究所,沈陽110032)
利用并口下載電纜實現(xiàn)JTAG下載,把并口的有效端口和JTAG端口連接起來,實現(xiàn)了數(shù)據(jù)寫入、數(shù)據(jù)讀出、控制器的信號輸入、時鐘的傳輸。在狀態(tài)機的正確狀態(tài)下進(jìn)行指令匹配和數(shù)據(jù)傳輸。并在保證數(shù)據(jù)下載正確的前提下,達(dá)到下載速度的最優(yōu)化。
計算機的標(biāo)準(zhǔn)并行端口是25針的母接頭端口。這25只管腳并不是都被用到。這些管腳分別用于數(shù)據(jù)的傳輸、檢查打印機的狀態(tài)及控制打印機。數(shù)據(jù)端口保存了寫入數(shù)據(jù)和輸出端口的一個字節(jié)信息。每位數(shù)據(jù)都是并行傳送的,它通常是以字節(jié)(8位)為單位進(jìn)行數(shù)據(jù)傳輸。并口的Pin2(TCK)、Pin3(TDI)、Pin8(TMS)分別對應(yīng)數(shù)據(jù)寄存器的第0位、第1位、第6位。并口的Pin11(TDO)對應(yīng)狀態(tài)寄存器的第7位。Pin18到Pin25是引腳GND。
TAP控制器是一個有限狀態(tài)機,一共有16個狀態(tài)。測試訪問狀態(tài)機的目的是選擇指令寄存器和數(shù)據(jù)寄存器,使其連接到TDI和TDO之間。
邏輯測試單元有一個指令寄存器和三個數(shù)據(jù)寄存器,三個數(shù)據(jù)寄存器為:旁路寄存器(BYPASS),識別碼寄存器(IDCODE),邊界掃描寄存器(BOUND)。指令決定使用哪個寄存器。指令寄存器為4位,指令由TDI引腳串行輸入。如圖1所示。
1位旁路寄存器(BYPASS)為TDI-TDO提供了一個最短的串行通路。在板級測試期間,可以通過這條通路繞開不需測試的設(shè)備。這可以提高測試速度。32位識別寄存器(IDCODE)提供了設(shè)備的制造商、版本號等信息。邊界掃描寄存器(BOUND)保持引腳的狀態(tài)或引腳需要的數(shù)據(jù)。邊界掃描寄存器為一個串行的移位寄存器,每個單元分配給芯片的相應(yīng)引腳。
圖1 測試單元的結(jié)構(gòu)
在這些指令中時鐘的上升沿對TDI和TMS進(jìn)行采樣。所有的輸出TDO都是在下降沿產(chǎn)生的。
JTAG并口編程的實質(zhì)就是首先將EXTEST指令串行移入可編程芯片上JTAG器件的指令寄存器,然后控制JTAG器件的TCK和TMS引腳使其進(jìn)入SHIFT-DR狀態(tài),再將數(shù)據(jù)串行移入到JTAG器件的邊界掃描寄存器,最后控制JTAG器件的TCK和TMS引腳使其進(jìn)入UPDATE-DR狀態(tài),將位流寫入FPGA。指令裝載完成后,只要不更改指令,就不需要再進(jìn)行指令移位了,此時只需要進(jìn)行數(shù)據(jù)移位,所以數(shù)據(jù)移位是編程的主要操作。狀態(tài)轉(zhuǎn)換如圖2所示。
圖2 TAP控制器的16種狀態(tài)切換圖
首先對狀態(tài)機復(fù)位,使JTAG單元從任何的未知狀態(tài)回到TEST-LOGIC-RESET狀態(tài),讓TMS至少保持連續(xù)6個周期的高電平后,回到TESTLOGIC-RESET狀態(tài)。程序代碼片段如下:
for(n=0;n<6;n++)
send_bit(0,1);//連續(xù)6個周期的高電平
TMS加一個周期的低電平,轉(zhuǎn)到RUN-TEST/IDLE狀態(tài)。TMS加兩個周期的高電平轉(zhuǎn)到 SELECT-IR狀態(tài)。加兩個周期的低電平后轉(zhuǎn)到SHIFT-IR狀態(tài)。程序代碼片段如下:
send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
send_bit(0,0);//轉(zhuǎn)到SHIFT-IR狀態(tài)
開始加載CFG_IN指令,指令碼是0101,加載一個周期的高電平轉(zhuǎn)到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加載兩個周期的高電平轉(zhuǎn)到SELECT-DR狀態(tài),再加載兩個周期的低電平后轉(zhuǎn)到SHIFTDR。程序代碼片段如下:
send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
send_bit(0,0);//轉(zhuǎn)到SHIFT-DR狀態(tài)
開始寫配置寄存器選項 COR,寫入指令后SHUTDOWN置1。寫START指令到CMD指令寄存器。寫清CRC指令寄存器。然后加載三個周期的高電平轉(zhuǎn)到SELECT-IR,再加載兩個周期的低電平轉(zhuǎn)到SHIFT-IR狀態(tài)。程序代碼片段如下:
send_bit(0,1);
send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
send_bit(0,0);//轉(zhuǎn)到 SHIFT-IR 狀態(tài)
加載 JSTART指令到指令寄存器,指令碼是0011,加載一個周期的高電平轉(zhuǎn)到EXIT1-IR狀態(tài)。程序代碼片段如下:
send_bit(0,0);
send_bit(0,0);
send_bit(1,0);
send_bit(1,0);
send_bit(0,1);//加載JSTART指令
加載兩個周期的高電平,再加載兩個周期的低電平轉(zhuǎn)到SHIFT-DR狀態(tài)。程序代碼片段如下:send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
send_bit(0,0);//轉(zhuǎn)到SHIFT-DR狀態(tài)
加載17個時鐘周期關(guān)閉時序。程序代碼片段如下:
for(n=0;n<17;n++)
send_bit(0,n==16);
加載三個周期的高電平和兩個周期的底電平轉(zhuǎn)到SHIFT-IR狀態(tài),加載CFG_IN指令。在SHIFTDR狀態(tài)寫AGHIGH指令到CMD寄存器中,產(chǎn)生GHIGH_B信號。寫COR使得SHUTDOWN狀態(tài)是0。寫完指令后,加載三個周期的高電平和兩個周期的低電平,狀態(tài)轉(zhuǎn)到 SHIFT-IR狀態(tài)。加載JSTART指令后轉(zhuǎn)到SHIFT-DR狀態(tài)。加載17個時鐘周期關(guān)閉時序轉(zhuǎn)到SHIFT-IR狀態(tài),加載CFG_IN指令。在SHIFT-DR狀態(tài)寫AGHIGH指令到CMD寄存器中,產(chǎn)生GHIGH_B信號。寫COR使得SHUTDOWN狀態(tài)是1。寫完指令后,加載三個周期的高電平和兩個周期的低電平,轉(zhuǎn)到SHIFT-IR狀態(tài)。加載JSTART指令。轉(zhuǎn)到SHIFT-DR狀態(tài),加載17個時鐘周期關(guān)閉時序。轉(zhuǎn)到SHIFT-IR狀態(tài),加載CFG_IN指令。轉(zhuǎn)到SHIFT-DR狀態(tài),加載二進(jìn)制位流文件,進(jìn)行編程下載工作。位流全部移進(jìn)后,轉(zhuǎn)到SHIFT-IR狀態(tài),加載JSTART指令。加載兩個周期的高電平和兩個周期的低電平后轉(zhuǎn)到SHIFT-DR狀態(tài)。加載17個周期的低電平后,再加載兩個周期的高電平和一個周期的低電平,狀態(tài)機轉(zhuǎn)到RUN-TEST/IDLE狀態(tài)。程序代碼片段如下:
send_bit(0,1);
send_bit(0,1);
send_bit(0,0);
JTAG編程下載完成。
JTAG下載程序在多款可編程芯片上進(jìn)行了測試,位流能成功進(jìn)行下載,電路的功能經(jīng)驗證完全正確。
JTAG并口編程很好的實現(xiàn)了位流文件到FPGA的下載,并對下載成功與否做出了明確的判斷。通過指令回讀出狀態(tài)寄存器的狀態(tài),用于對比下載前后FPGA的狀態(tài)變化。
[1][美]Dhananjay.V.Gadre.并行端口編程[M].北京:中國電力出版社,2000.
[2]何希順,張躍,何榮森.嵌入系統(tǒng)中的JTAG接口編程技術(shù)[J].電子技術(shù)應(yīng)用,2001,27(12):9-12.