周清文,殳國(guó)華,黃冠
(上海交通大學(xué) 電子信息與電氣工程學(xué)院,上海 200240)
目前,可編程器件(如CPLD、FPGA)由于其高性能及靈活可配置性,得到廣泛的應(yīng)用。開(kāi)發(fā)人員在對(duì)其開(kāi)發(fā)時(shí),都需要專用的有線下載器對(duì)其進(jìn)行配置,或者需要在器件周圍設(shè)計(jì)專門的配置電路,這在一定程度上增加了設(shè)計(jì)的難度與成本??删幊唐骷季哂性谙到y(tǒng)可編程性,并且兼容邊界掃描功能(JTAG)[1]1,這使得使用微控制器更新、修改器件配置極為方便。本文針對(duì)Xilinx公司可編程邏輯器件FPGA芯片,基于藍(lán)牙通信并利用ARM處理器,設(shè)計(jì)了一種實(shí)現(xiàn)無(wú)線配置FPGA的下載器。
JTAG(Joint Test Action Group,聯(lián)合測(cè)試工作組),是一種國(guó)際標(biāo)準(zhǔn)測(cè)試協(xié)議(IEEE 1149.1兼容),主要用于芯片(主要是復(fù)雜的集成芯片,如微處理器、DSP、FPGA和CPLD)內(nèi)部測(cè)試。其基本原理是在器件內(nèi)部定義一個(gè)TAP(Test Access Port,測(cè)試訪問(wèn)口)通過(guò)專用的JTAG測(cè)試工具對(duì)內(nèi)部節(jié)點(diǎn)進(jìn)行測(cè)試[2]。在芯片正常工作時(shí),邊界掃描單元對(duì)于芯片內(nèi)部電路是“透明”的,所以不會(huì)影響芯片電路的正常工作與信號(hào)傳輸。
IEEE 1149.1 標(biāo)準(zhǔn)規(guī)定了一個(gè)四線串行接口(第五條線是可選的):
TCK:邊界掃描邏輯測(cè)試時(shí)鐘;
TMS:測(cè)試模式選擇,用于驅(qū)動(dòng)TAP控制器的狀態(tài);
TDI:測(cè)試數(shù)據(jù)輸入,數(shù)據(jù)在TCK上升沿采樣進(jìn)入器件寄存器;
TDO:測(cè)試數(shù)據(jù)輸出,串行數(shù)據(jù)在TCK的下降沿從移位寄存器輸出;
TRST:測(cè)試重置,為可選輸入信號(hào)。
在時(shí)鐘TCK的驅(qū)動(dòng)下,測(cè)試模式TMS信號(hào)控制TAP狀態(tài)機(jī)的狀態(tài),在不同的狀態(tài)下,TDI提供串行數(shù)據(jù)輸入,TDO為數(shù)據(jù)輸出提供通道。如圖1所示,JTAG所有的操作都同步于時(shí)鐘信號(hào)TCK,在時(shí)鐘上升沿,采樣信號(hào)TMS和TDI,在時(shí)鐘下降沿,輸出測(cè)試信號(hào)TDO。
圖1 JTAG接口時(shí)序圖
測(cè)試訪問(wèn)端口控制器(TAPC,TAP Controller)是JTAG工作的核心部分。如圖2所示,TAPC控制整個(gè)TAP的運(yùn)行狀態(tài),狀態(tài)切換線路上的數(shù)據(jù)“0”和“1”表示的是TMS的信號(hào)電平。
圖2 TAP狀態(tài)機(jī)流程圖
TAP狀態(tài)機(jī)是一個(gè)有16個(gè)狀態(tài)的有限狀態(tài)機(jī),通過(guò)TAP可以訪問(wèn)芯片提供的所有數(shù)據(jù)寄存器(DR)和指令寄存器(IR)。TAP狀態(tài)機(jī)主要可以分為三部分:復(fù)位操作、數(shù)據(jù)寄存器操作以及指令寄存器操作。其中,對(duì)指令寄存器的訪問(wèn)的一個(gè)周期中,從測(cè)試邏輯復(fù)位狀態(tài)出發(fā),歷經(jīng)測(cè)試/空閑、選擇數(shù)據(jù)寄存器掃描、選擇指令寄存器掃描、指令捕獲、指令移位、第一次指令退出、指令更新各個(gè)狀態(tài),最后回到測(cè)試/空閑狀態(tài)。在此過(guò)程中,狀態(tài)的轉(zhuǎn)移都是通過(guò)TCK信號(hào)進(jìn)行驅(qū)動(dòng)(上升沿),通過(guò)TMS信號(hào)對(duì)TAP的狀態(tài)進(jìn)行選擇轉(zhuǎn)換的[3]。其中,在指令捕獲(Capture-IR)狀態(tài)下,指令寄存器中將加載一個(gè)固定邏輯矢量;在指令轉(zhuǎn)移(Shift-IR)狀態(tài)下,一條特定指令將移位進(jìn)入指令寄存器;在指令更新(Update-IR)狀態(tài)下,新的指令被鎖存,即更新為當(dāng)前指令。這樣通過(guò)TAP狀態(tài)間的轉(zhuǎn)換就完成對(duì)指令寄存器的訪問(wèn),指令執(zhí)行,接下來(lái)將執(zhí)行對(duì)數(shù)據(jù)寄存器的操作。對(duì)數(shù)據(jù)寄存器的訪問(wèn)操作和對(duì)指令寄存器的操作基本相同。
可編程邏輯器件因其靈活性等優(yōu)點(diǎn)在嵌入式系統(tǒng)中得到廣泛的應(yīng)用,在這些系統(tǒng)中利用串行矢量文件(SVF)可通過(guò)微控制器對(duì)可編程器件進(jìn)行重新配置。SVF是一種描述IEEE 1149.1(JTAG)總線操作的標(biāo)準(zhǔn)文件格式[4]1。Xilinx公司提供用于可直接生成SVF格式配置文件的iMPACT工具,該工具附于標(biāo)準(zhǔn)Xilinx ISE軟件內(nèi)。SVF格式配置文件對(duì)于配置Xilinx系列可編程器件FPGA、CPLD以及PROM是非常方便的,因?yàn)樵跓o(wú)需了解目標(biāo)器件信息就可以生成包含復(fù)雜編程算法的SVF指令。SVF文件由ASCII語(yǔ)句構(gòu)成,需要較大的存儲(chǔ)空間,不便于嵌入式應(yīng)用。為了提高嵌入式系統(tǒng)中存儲(chǔ)空間的利用率,將SVF格式配置文件轉(zhuǎn)換成一種緊湊的二進(jìn)制XSVF文件。iMPACT工具能夠直接將標(biāo)準(zhǔn)的BIT/MCS配置文件轉(zhuǎn)化為XSVF格式文件。
在利用Xilinx ISE軟件對(duì)目標(biāo)器件進(jìn)行相關(guān)設(shè)計(jì)之后,可以生成對(duì)應(yīng)的器件配置文件(BIT/MCS文件)。利用iMPACT工具將BIT/MCS文件轉(zhuǎn)換為XSVF格式配置文件,XSVF格式文件包含所有編程指令和設(shè)計(jì)信息數(shù)據(jù)。利用文本編輯軟件UltraEdit打開(kāi)一個(gè)XSVF文件,其部分?jǐn)?shù)據(jù)如圖3所示。
圖3 XSVF格式文件數(shù)據(jù)
該文件中所有指令以十六進(jìn)制數(shù)字代表,描述了所有JTAG總線操作信息,其中包含TAP狀態(tài)機(jī)各個(gè)狀態(tài)的狀況指令和信息,以及目標(biāo)器件的程序信息。如0X07代表定義重復(fù)測(cè)試TDO數(shù)據(jù)的次數(shù),0X13代表設(shè)定指令移位狀態(tài)(Shift-IR)的下一狀態(tài)是空閑狀態(tài)(Run-Test/Idle)還是指令暫停狀態(tài)(Pause-IR),0X02表示進(jìn)入指令移位狀態(tài)[4]17-23。
基于藍(lán)牙通信的FPGA無(wú)線下載器的系統(tǒng)框圖如圖4所示。PC終端將可編程器件的配置文件(XSVF文件)通過(guò)藍(lán)牙傳輸?shù)綗o(wú)線下載器的藍(lán)牙模塊。藍(lán)牙模塊接收文件數(shù)據(jù)后通過(guò)串口方式輸出到ARM處理器,處理器將接收到的數(shù)據(jù)信息以文件的形式存儲(chǔ)至片外數(shù)據(jù)存儲(chǔ)器。當(dāng)數(shù)據(jù)文件接收完畢后,ARM處理器調(diào)用解碼程序?qū)SVF文件解碼為JTAG時(shí)序信息,通過(guò)GPIO口模擬JTAG接口配置相關(guān)器件。
圖4 系統(tǒng)框圖
所設(shè)計(jì)無(wú)線下載器主要功能是通過(guò)藍(lán)牙接收上位機(jī)傳輸?shù)呐渲梦募?,并將配置文件存?chǔ)在片外存儲(chǔ)器SD卡中,然后通過(guò)GPIO口模擬JTAG接口時(shí)序配置目標(biāo)可編程器件。硬件部分主要包括ARM處理器、數(shù)據(jù)存儲(chǔ)器、藍(lán)牙模塊HC-05,各功能部件主要功能如下:
(1)ARM處理器選用STM32F103系列芯片,主要功能是與藍(lán)牙模塊通信接收數(shù)據(jù)并將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)存儲(chǔ)器,調(diào)用相關(guān)程序?qū)崿F(xiàn)對(duì)XSVF文件的解碼,并通過(guò)GPIO口模擬JTAG接口時(shí)序?qū)崿F(xiàn)對(duì)FPGA的在系統(tǒng)配置。
(2)數(shù)據(jù)存儲(chǔ)器,用于存儲(chǔ)FPGA芯片的XSVF格式配置文件。由于微處理器片內(nèi)存儲(chǔ)空間有限,故采用片外小容量的SD卡存儲(chǔ)器。由于它具有體積小、數(shù)據(jù)傳輸速度快、可熱插拔等優(yōu)良特性,因此被廣泛地應(yīng)用于小型嵌入式系統(tǒng)裝置中。在本設(shè)計(jì)中采用SD卡,既能滿足存儲(chǔ)容量要求,也能滿足通信速度要求。
(3)藍(lán)牙模塊采用HC-05主從機(jī)一體藍(lán)牙模塊,它具有傳統(tǒng)藍(lán)牙技術(shù)的功能,模塊的接口形式有串口、SPI接口、USB接口,在短距離通信中具有穩(wěn)定的性能。此設(shè)計(jì)中選用了串口與ARM處理器進(jìn)行通信,該通信方式操作簡(jiǎn)單且易實(shí)現(xiàn)。
軟件設(shè)計(jì)是實(shí)現(xiàn)所述下載器設(shè)計(jì)的重要部分,主要包含以下三個(gè)部分:參考C代碼的移植、FATFS文件系統(tǒng)的嵌入以及XSVF文件數(shù)據(jù)接收與存儲(chǔ)。
Xilinx公司提供參考C代碼文件XAPP058,用于讀取XSVF文件并輸出TAP控制字,可理解為對(duì)XSVF文件的解碼過(guò)程,將XSVF文件中二進(jìn)制指令轉(zhuǎn)化為對(duì)JTAG總線操作。XAPP058源代碼包含C代碼文件lenval.c、micro.c、ports.c以及其對(duì)應(yīng)的頭文件lenval.h、micro.h、ports.h。lenval.c文件主要處理內(nèi)部定義的數(shù)據(jù)結(jié)構(gòu)變量,micro.c文件包含用來(lái)從存儲(chǔ)器中讀取XSVF文件、解碼XSVF文件指令以及驅(qū)動(dòng)JTAG信號(hào)的主要函數(shù),port.c文件中程序的功能主要為在JTAG引腳(TCK、TMS和TDI)輸出相應(yīng)值、讀取TDO端口的值以及以字節(jié)為單位讀取XSVF文件數(shù)據(jù)。
在ARM處理器中需要移植上述代碼,實(shí)現(xiàn)對(duì)可編程器件的配置。主要包含以下幾個(gè)關(guān)鍵函數(shù):
setPort:設(shè)定JTAG輸出信號(hào)(TCK、TMS和TDI)為特定值。該函數(shù)的設(shè)置取決于微處理器中用于JTAG信號(hào)輸出的I/O端口;
readTDOBit:讀取JTAG輸入信號(hào)(TDO)的值;
readByte:返回XSVF文件的下一字節(jié)。Micro.c文件調(diào)用readByte函數(shù)是為了連續(xù)讀取XSVF文件。readByte函數(shù)在運(yùn)行時(shí)必須記住上一次讀取XSVF文件的位置才能完成本次讀取,所以此函數(shù)通常用一個(gè)指針?lè)祷匚募乱蛔止?jié)位置信息;
waitTime:等待時(shí)間。器件完成相關(guān)操作需要的最少等待時(shí)間,對(duì)此函數(shù)的校準(zhǔn)是成功執(zhí)行XSVF文件操作至關(guān)重要的一步[1]17。
為了方便處理器調(diào)用參考C代碼對(duì)XSVF文件的讀取操作,以及方便存儲(chǔ)和管理不同的配置文件,在設(shè)計(jì)中嵌入FATFS文件系統(tǒng)。FATFS是專為小型嵌入式系統(tǒng)設(shè)計(jì)通用的文件系統(tǒng)模塊,它完全由C語(yǔ)言編寫,具有高可配置性以及良好的硬件平臺(tái)獨(dú)立性,可以將其嵌入到如8051、ARM、AVR、PIC等低成本的微控制器中[5]。
在設(shè)計(jì)中嵌入FATFS文件系統(tǒng),主要需要調(diào)用以下幾個(gè)關(guān)鍵函數(shù)來(lái)實(shí)現(xiàn)對(duì)文件的創(chuàng)建和讀寫操作:
f_mount函數(shù),在FATFS模塊中注冊(cè)/注銷一個(gè)工作區(qū);
f_open函數(shù),創(chuàng)建一個(gè)將要訪問(wèn)的文件對(duì)象;
f_close函數(shù),關(guān)閉一個(gè)打開(kāi)的文件,函數(shù)執(zhí)行成功后,文件對(duì)象不再有效;
f_read函數(shù),從文件中讀取數(shù)據(jù),其中文件對(duì)象的文件指針隨著讀取字節(jié)數(shù)的增加而增加;
f_write函數(shù),寫數(shù)據(jù)到文件。
如圖5所示,ARM處理器STM32F103和藍(lán)牙模塊HC-05與外置文件存儲(chǔ)器SD卡之間的接口類型。處理器和藍(lán)牙模塊之間采用串口UART的方式傳輸數(shù)據(jù),而和SD卡之間采用SDIO方式傳輸數(shù)據(jù)。藍(lán)牙模塊HC-05接收數(shù)據(jù)后通過(guò)串行方式傳輸?shù)轿⑻幚砥鳎琔ART串行通信方式簡(jiǎn)單易操作且成本低,適合通信速率不高的場(chǎng)合。處理器通過(guò)在存儲(chǔ)器SD卡中嵌入FATFS文件系統(tǒng)實(shí)現(xiàn)對(duì)XSVF文件的相關(guān)存儲(chǔ)和讀寫操作,SDIO接口方式能夠滿足數(shù)據(jù)傳輸速率要求。
圖5 ARM處理器接口示意圖
在對(duì)ARM處理器編程時(shí),需要設(shè)定處理器與藍(lán)牙模塊的通信速率。該速率不能過(guò)高,其受限于處理器的運(yùn)行速度以及和SD卡之間數(shù)據(jù)傳輸?shù)乃俾省T谕鵖D卡中存儲(chǔ)數(shù)據(jù)時(shí),調(diào)用了FATFS文件系統(tǒng),這在一定程度上降低了存儲(chǔ)速度,所以需要通過(guò)結(jié)合硬件調(diào)試協(xié)調(diào)各模塊之間的傳輸速率,以達(dá)到更高的傳輸效率。
圖6 測(cè)試流程圖
根據(jù)上述方法完成硬件設(shè)計(jì)和軟件程序編寫,完成無(wú)線下載器的設(shè)計(jì)工作。對(duì)Xilinx公司SPARTAN-6系列FPGA芯片XC6SLX9進(jìn)行測(cè)試工作,使用的是帶有該芯片的一款開(kāi)發(fā)板。
測(cè)試流程如圖6所示。
圖7所示為硬件測(cè)試平臺(tái),左邊電路板為所設(shè)計(jì)的無(wú)線下載器,藍(lán)牙模塊垂直嵌入在其上方,右邊為測(cè)試所用FPGA開(kāi)發(fā)板。
(1)首先測(cè)試讀取目標(biāo)。FPGA芯片的器件ID,利用iMPACT工具生成讀取器件ID的XSVF文件。此文件所含代碼量比較少,但能夠測(cè)試無(wú)線下載器模擬JTAG時(shí)序?qū)δ繕?biāo)器件的配置操作是否正常。該文件傳輸以及配置過(guò)程都非常短,利用串口軟件在其界面打印出配置結(jié)果,如圖8所示,可以看到“SUCCESS-Completed XSVF execution”信息,說(shuō)明執(zhí)行成功,下載器工作正常;此外,串口還輸出了TAP狀態(tài)轉(zhuǎn)移等信息。
圖8 串口輸出結(jié)果
(2)接下來(lái)采用ISE軟件編寫程序操作開(kāi)發(fā)板上4個(gè)LED燈,實(shí)現(xiàn)流水燈現(xiàn)象,完成仿真后生成BIN文件。同樣利用iMPACT生成XSVF文件進(jìn)行測(cè)試,此文件在10 s左右完成配置,如圖8所示, 為測(cè)試流水燈試驗(yàn)的效果圖,觀察到流水燈現(xiàn)象,
說(shuō)明配置成功。
(3)同樣利用實(shí)現(xiàn)流水燈現(xiàn)象的程序,通過(guò)ISE軟件生成MCS文件并將其存儲(chǔ)至開(kāi)發(fā)板外置SPI FLASH芯片M25P16中。由于直接對(duì)FPGA進(jìn)行配置斷電后程序丟失,而該FLASH芯片可以作為啟動(dòng)鏡像[6]。將MCS格式配置文件轉(zhuǎn)換為XSVF文件,然后進(jìn)行測(cè)試。MCS文件相比于BIN文件較大,所以配置時(shí)間也比步驟(2)長(zhǎng)。完成配置后同樣觀察到流水燈現(xiàn)象,接下來(lái)對(duì)FPGA開(kāi)發(fā)板斷電再重新上電,經(jīng)過(guò)短暫的啟動(dòng)時(shí)間后,依然觀察到流水燈現(xiàn)象,說(shuō)明XSVF文件成功燒至開(kāi)發(fā)板片外FLASH中。
本文提出了一種采用藍(lán)牙通信方式無(wú)線配置Xilinx可編程器件FPGA的方法,完成了基于ARM處理器的無(wú)線下載器的設(shè)計(jì)。利用包含有復(fù)雜編程算法指令和所有設(shè)計(jì)信息數(shù)據(jù)的XSVF格式配置文件,通過(guò)嵌入式處理器能夠方便地實(shí)現(xiàn)對(duì)兼容JTAG協(xié)議的器件進(jìn)行在線配置。利用藍(lán)牙傳輸方式實(shí)現(xiàn)了滿足設(shè)計(jì)要求的低成本、短距離數(shù)據(jù)傳輸,并且實(shí)現(xiàn)了從有線配置到無(wú)線配置的跨越,這也為遠(yuǎn)程更新器件配置提供了可能。此外,處理器的外置存儲(chǔ)器能夠高效、靈活地存儲(chǔ)以及管理配置文件。