擴(kuò)展TINI的IO性能
引言
DS80C400評(píng)估板包括TINIm400參考電路板和TINIs400插座板,為評(píng)估TINI運(yùn)行環(huán)境和利用DS80C400網(wǎng)絡(luò)微控制器開發(fā)基于TINI的應(yīng)用提供了一個(gè)優(yōu)秀平臺(tái)。TINIm400/TINIs400組合電路板的一個(gè)缺點(diǎn)是其通用IO (GPIO)引腳數(shù)有限。TINIs400插座板只包含幾個(gè)可方便用作GPIO的引腳;插座板上的大多數(shù)IO引腳遍布在電路板上,并被用作其它功能(例如,J27為I2C引腳,J4為外部中斷引腳)。
本應(yīng)用筆記逐步演示了如何使用復(fù)雜可編程邏輯器件(CPLD)來(lái)配置硬件和開發(fā)軟件,從而為TINIs400插座板額外提供32個(gè)GPIO引腳。
硬件設(shè)置
擴(kuò)展TINI的IO性能的第一步是在TINIs400插座板上額外安裝四個(gè)器件:CPLD、電源調(diào)節(jié)器,以及兩個(gè)插頭。Dallas Semiconductor公司售出的TINIs400插座板上沒有安裝這些器件,但為添加這些器件預(yù)留了焊盤和走線。板上并未安裝這些器件,因?yàn)樵S多應(yīng)用并不需要擴(kuò)展IO性能,或者采用定制電路板設(shè)計(jì)。
TINIs400電路原理圖1的第7頁(yè)詳細(xì)給出了擴(kuò)展TINI IO性能所必需的器件。該電路使用了100引腳VQFP封裝的Xilinx XC2C64 CoolRunner-II CPLD。
XC2C64和更大規(guī)模的XC2C128均已在TINI硬件平臺(tái)上通過(guò)測(cè)試,該平臺(tái)也支持相同引腳和相同封裝的其他規(guī)模的器件。 與CPLD相關(guān)的插頭有三個(gè),其中兩個(gè)是必需安裝的,具體說(shuō)明如下:
J30 JTAG編程連接器。通過(guò)JTAG接口對(duì)XC2C64 CPLD編程。J30連接器為JTAG信號(hào)TMS、TCK、TDI和TDO提供引腳。更詳細(xì)的討論見下文的CPLD編程一節(jié)。
J28擴(kuò)展IO連接器。通過(guò)該連接器可訪問(wèn)XC2C64器件的32個(gè)引腳。對(duì)CPLD編程將為這些引腳提供讀/寫接口。
J29額外IO連接器。該連接器提供與XC2C64的16個(gè)額外連接,本設(shè)計(jì)中未用到這些連接器。
除J30和J28插頭以外,還需要安裝以下器件:
U2 MAX1792EUA18調(diào)節(jié)器
U12 Xilinx CPLD
電容C40至C57。這些電容僅在使用CPLD時(shí)才需要,從Dallas Semiconductor獲得的TINIs400插座板應(yīng)該已安裝了這些電容。如果安裝位置不正確或缺失,在進(jìn)行其它TINI開發(fā)時(shí)也許不會(huì)注意到。
CPLD配置
CPLD是可編程邏輯器件??蓪⑺醋魇强删幊逃布哂蟹浅l`活的內(nèi)部邏輯,允許通過(guò)簡(jiǎn)單再編程實(shí)現(xiàn)很多功能。用CPLD可以實(shí)現(xiàn)32位觸發(fā)器,以存儲(chǔ)CPLD輸出引腳的邏輯電平。用Verilog,一種硬件描述語(yǔ)言(HDL)來(lái)描述CPLD要實(shí)現(xiàn)的功能。Xilinx提供的工具可將Verilog源代碼轉(zhuǎn)換成二進(jìn)制形式,用來(lái)配置CPLD。
在TINIs400電路板上,XC2C64與TINI微控制器DS80C400的存儲(chǔ)器總線連接。這種連接允許TINI程序通過(guò)讀、寫特定地址訪問(wèn)CPLD。所以,當(dāng)?shù)刂肪€選擇CPLD時(shí),必須對(duì)CPLD編程以正確響應(yīng);CPLD必須鎖存寫入的數(shù)據(jù)總線信號(hào),并且當(dāng)讀CPLD時(shí)必須驅(qū)動(dòng)端口輸入。
圖1. CPLD功能框圖 |
圖1為CPLD需要實(shí)現(xiàn)的功能方框圖。圖中右上部的模塊(IO7:0、IO15:8、IO23:16、IO31:24)代表存儲(chǔ)輸出電平值的觸發(fā)器。這些8位寄存器組每一個(gè)均連接到數(shù)據(jù)總線。當(dāng)通過(guò)適當(dāng)?shù)牡刂肪€和寫選通信號(hào)(nWr)使能時(shí),數(shù)據(jù)總線上的內(nèi)容被鎖存到寄存器內(nèi)。檢測(cè)IO引腳的輸入電平并送入4:1多路復(fù)用器,此時(shí)低位地址選擇8位值并傳遞到數(shù)據(jù)總線。如果CPU請(qǐng)求讀(由地址線和nPSEN信號(hào)使能),則使能多路復(fù)用器的輸出并驅(qū)動(dòng)數(shù)據(jù)總線。
盡管10條地址線(不包括芯片使能)與CPLD連接,但本示例應(yīng)用只使用其中四條。A17:A16高地址線配合芯片使能6一起使用。當(dāng)?shù)刂肺籄17:A16為低且nCE6有效(低電平)時(shí),選擇CPLD,但CPLD在讀或?qū)懶盘?hào)有效之前不起作用。其它兩個(gè)地址位A1:A0,用來(lái)選擇四個(gè)8位寄存器當(dāng)中的一個(gè)作為寫操作的目標(biāo)地址或讀操作的源地址。這一地址方案意味著許多地址都可使能對(duì)四個(gè)8位寄存器的訪問(wèn)。表1概括了這種地址方案的靈活性。
表1. 能夠激活CPLD寄存器的地址線取值
由于TINI庫(kù)和工作固件將DS80C400配置為每個(gè)芯片使能端對(duì)應(yīng)2MB空間,并且DS80C400的地址范圍是24位(16MB),所以八個(gè)芯片使能端對(duì)應(yīng)地址的高3位。為激活芯片使能6,24位地址的高3位必須為110b。
盡管表1說(shuō)明多個(gè)地址均可激活寄存器,我們僅使用了以下寄存器地址:
地址C00000h IO7:0
地址C00001h IO15:8
地址C00002h IO23:16
地址C00003h IO31:24
Verilog編碼
有六個(gè)Verilog文件用來(lái)實(shí)現(xiàn)CPLD的32位GPIO功能。本應(yīng)用筆記的源代碼中包含了這些文件,并附帶提供Xilinx WebPACK(參見下文的討論)工程文件。本工程的Verilog源文件包括:
Buffer8.v:8位緩沖器,用來(lái)連接TINI到四個(gè)8位寄存器的數(shù)據(jù)總線。
Mux2x8.v:2:1多路復(fù)用器,用來(lái)選擇兩條8位總線中的一條。
OneO4e.v:2-4譯碼器,輸出一個(gè)取決于低地址位的有效信號(hào)。
Reg8OD.v:8位偽開漏極觸發(fā)器陣列,用來(lái)存儲(chǔ)輸出值。
TSBuffer8.v:8位三態(tài)緩沖器,用來(lái)驅(qū)動(dòng)數(shù)據(jù)總線輸入值。
CPLD.v:模塊間的頂層連接。
最應(yīng)引起注意的Verilog源文件是CPLD.v。它包含輸入、輸出和節(jié)點(diǎn)的定義,并且給出在其它文件中定義的實(shí)例化模塊。該源文件也是提取寫脈沖和讀脈沖的地方:
assign Reset = ~nRstOut; // make a hi-active Reset
assign IOBank = ~nCE6 ~|AH; // decode the I/O bank
assign ReadT = IOBank ~nPSEn; // qualify Read strobe
assign WriteT = IOBank ~nWr; // qualify Write strobe
然后將信號(hào)ReadT作為三態(tài)緩沖器的使能信號(hào),使用檢測(cè)到的輸入值驅(qū)動(dòng)DS80C400的數(shù)據(jù)總線:
// Tri-State data bus to TINI needs this buffer
TSBuffer8 U4(ReadT, DataToTINI, D);
信號(hào)WriteT送入四個(gè)8位寄存器組作為時(shí)鐘信號(hào)。
// 4 8-bit pseudo-open-drain output drivers
Reg8Out U6(Reset, ~WriteT, Enable[0], DataFromTINI, UIO[ 7: 0]);
Reg8Out U7(Reset, ~WriteT, Enable[1], DataFromTINI, UIO[15: 8]);
Reg8Out U8(Reset, ~WriteT, Enable[2], DataFromTINI, UIO[23:16]);
Reg8Out U9(Reset, ~WriteT, Enable[3], DataFromTINI, UIO[31:24]);
另一個(gè)重要的源文件(雖然不是Verilog文件)是CPLD.ucf。該文件給出了CPLD.v中聲明的信號(hào)名稱和XC2C64器件實(shí)際引腳之間的映射關(guān)系。地址線和幾個(gè)IO引腳的定義如下:
NET "AL1>" LOC = "P30";
NET "AL0>" LOC = "P32";
NET "AH1>" LOC = "P37";
NET "AH0>" LOC = "P39";
NET "UIO5>" LOC = "P43";
NET "UIO6>" LOC = "P49";
NET "UIO7>" LOC = "P50";
NET "UIO8>" LOC = "P52";
NET "UIO9>" LOC = "P53";
注意,這些引腳定義直接來(lái)自TINIs400電路原理圖的第7頁(yè)。例如,從電路圖可以看出:地址線3-0 (A[3:0])連接到引腳28、29、30和32。如以上清單所示,我們定義了兩條最低地址線信號(hào)(AL1>和AL0>),它們被映射至CPLD的引腳30和32。
CPLD編程
用于CPLD編程的工程文件包含在本應(yīng)用筆記的源代碼CPLD目錄內(nèi)??梢允褂肵ilinx的免費(fèi)Webpack工具來(lái)構(gòu)建并編程CPLD。本應(yīng)用筆記中的應(yīng)用實(shí)例是用6.3.03i版本開發(fā)的。只要支持CoolRunner 2 CPLD系列,Xilinx工具的最新版本應(yīng)該也適合本設(shè)計(jì)。
硬件連接
我們使用Avnet Avenue JTAG編程電纜來(lái)連接計(jì)算機(jī)的并口和CPLD的JTAG引腳。許多CPLD或FPGA評(píng)估套件均提供JTAG編程電纜。本文使用的編程電纜如圖2所示。
圖2. Avnet Avenue JTAG編程電纜 |
圖3為編程電纜和TINIs400插座板之間所需的連接。對(duì)信號(hào)做了標(biāo)記,因此也可以用其他編程電纜。TINIs400插座板要求VCC為3.3V。
圖3. JTAG編程器與TINIS400插座板的連接關(guān)系。J30上未標(biāo)注的引腳沒有連接。 |
載入工程時(shí),點(diǎn)擊File菜單并選擇Open Project。瀏覽本應(yīng)用筆記的源文件并選擇parallel32.npl?,F(xiàn)在已經(jīng)打開工程并準(zhǔn)備構(gòu)建。接下來(lái)說(shuō)明如何配置一個(gè)全新的工程。也可以跳過(guò)這一節(jié),直接瀏覽后面的部分了解如何編程CPLD。
遵照以下指導(dǎo)說(shuō)明,根據(jù)應(yīng)用筆記提供的源代碼創(chuàng)建一個(gè)新工程。
在File菜單中選擇New Project。
選擇想要?jiǎng)?chuàng)建新工程的目錄,輸入工程名稱。將創(chuàng)建一個(gè)以工程名稱命名的新目錄。確保Top Level Module Type為HDL。點(diǎn)擊Next繼續(xù)。
在接下來(lái)的菜單中選擇工程需要的器件和封裝。器件系列選擇CoolRunner 2 CPLDs。然后從給出的列表中選擇器件——可以是XC2C64、XC2C128或其它同類器件。封裝選擇VQ100,這是TINIs400插座板認(rèn)定的封裝。本應(yīng)用筆記中用到的其它配置選項(xiàng)參見圖4。完成配置后,點(diǎn)擊Next繼續(xù)。
圖4. 配置新工程的器件和設(shè)計(jì)流程 |
下一個(gè)窗口詢問(wèn)新工程中要?jiǎng)?chuàng)建的所有新文件。由于已提供了所有源文件,因此點(diǎn)擊Next,不增加任何新文件。
接下來(lái)的窗口要求添加任何現(xiàn)有的源文件。點(diǎn)擊Add Source按鈕添加源代碼提供的所有Verilog文件(文件列表見上文的Verilog編碼一節(jié))和CPLD.ucf文件。一旦添加后,程序會(huì)詢問(wèn):File.v is which source type The suffix is ambiguous as to type (File.v是什么文件類型,后綴類型不明確)。選擇Verilog Design File并點(diǎn)擊OK (參見圖5)。所有輸入文件歸類完畢后,點(diǎn)擊Next繼續(xù)。
圖5. 確定輸入源文件的文件類型 |
接下來(lái)的窗口概括了新工程的基本信息。查看一遍信息并點(diǎn)擊Finish。
只要在上面第5步中添加了UCF文件,程序?qū)⒁蟀言撐募P(guān)聯(lián)到其影響的內(nèi)容。在列表中選擇CPLD并點(diǎn)擊OK。
至此,完成了工程創(chuàng)建和配置?,F(xiàn)在可以編輯、構(gòu)建及綜合您的設(shè)計(jì)。
器件編程
按照以下指導(dǎo)說(shuō)明來(lái)綜合CPLD工程,并對(duì)XC2C64器件編程。確保編程電纜已按上文硬件連接一節(jié)中說(shuō)明的方法連接完畢。
CPLD編程:
在Project View (一般在窗口左上部)中選擇Module View標(biāo)簽。在Module View中選擇主文件CPLD.v。
在Process View窗口(一般在Project View窗口下部)中,展開Implement Design分支并雙擊Generate Programming File。這將運(yùn)行把Verilog源代碼轉(zhuǎn)換成二進(jìn)制文件(用于編程CPLD)需要的所有進(jìn)程。運(yùn)行進(jìn)程時(shí),進(jìn)程左側(cè)將出現(xiàn)說(shuō)明執(zhí)行結(jié)果的標(biāo)記。綠勾標(biāo)志意味著進(jìn)程成功結(jié)束,沒有錯(cuò)誤或警告。黃色驚嘆號(hào)意味著進(jìn)程成功結(jié)束,但有警告信息。紅色X號(hào)意味著進(jìn)程沒有成功結(jié)束,出現(xiàn)了錯(cuò)誤。
一旦程序結(jié)束并且成功生成編程文件,雙擊Configure Device (IMPACT)。
將出現(xiàn)一個(gè)窗口,顯示Configure Devices。選擇Boundary Scan Mode選項(xiàng)并點(diǎn)擊Next。
在接下來(lái)的窗口(Boundary-Scan Mode Selection)中選擇Automatically connect to cable and identify Boundary Scan chain,并點(diǎn)擊Finish。
如果器件連接正確,iMPACT將彈出一個(gè)窗口,顯示“There was one device detected in the boundary-scan chain. iMPACT will now direct you to associate a programming or BSDL file with this device....”。點(diǎn)擊OK。
應(yīng)該在當(dāng)前的工程目錄下打開一個(gè)文件對(duì)話窗口(如果沒有在該目錄下打開,應(yīng)查到其正確位置)。在該窗口中雙擊選擇CPLD.jed。
右鍵單擊Xilinx芯片圖并選擇Program。
確保選中Erase Before Programming and Verify,并且不要選其它項(xiàng)。點(diǎn)擊OK。
此時(shí)將出現(xiàn)編程狀態(tài)進(jìn)度條,幾秒鐘(少于20秒)后編程結(jié)束,CPLD配置完畢。
進(jìn)行自己的CPLD功能設(shè)計(jì)時(shí),當(dāng)DS80C400不和CPLD通信時(shí),應(yīng)確保CPLD代碼釋放地址、控制和數(shù)據(jù)信號(hào)為高阻抗?fàn)顟B(tài)。忽略這一點(diǎn)是很常見的錯(cuò)誤,這會(huì)導(dǎo)致奇怪的故障現(xiàn)象,例如電路板會(huì)被保持在復(fù)位狀態(tài)或發(fā)生隨機(jī)性重啟。發(fā)生此類問(wèn)題時(shí),只要擦除CPLD即可阻止該問(wèn)題。
調(diào)試電路板
簡(jiǎn)單地借助32個(gè)LED,即可以演示TINI的IO擴(kuò)展性能。該演示板用四組LED和四個(gè)電阻排來(lái)指示每個(gè)CPLD IO引腳的狀態(tài)。LED板(安裝在TINIs400上)如圖6所示。
圖6. 裝有調(diào)試IO板的TINIs400/TINIm400 |
該簡(jiǎn)易電路板的原理圖包含在本應(yīng)用筆記的源代碼中。注意,其中的電阻值是建議值;阻值太高會(huì)導(dǎo)致顯示較暗,阻值太低會(huì)消耗太多TINI電源電流,并中止執(zhí)行過(guò)程。
軟件接口
這一簡(jiǎn)單的存儲(chǔ)器接口實(shí)現(xiàn)后,軟件訪問(wèn)擴(kuò)展的IO引腳變得相當(dāng)簡(jiǎn)單,將采用匯編語(yǔ)言來(lái)實(shí)現(xiàn)(作為原生函數(shù)嵌入Java應(yīng)用中)。
表2給出了為實(shí)現(xiàn)接口功能而定義的Java原生函數(shù)。
表2. TINI-CPLD接口使用的Java函數(shù)
注意,也可以用兩個(gè)函數(shù)完成同樣的工作:program(int address, int x)和read(int address)。但是,在本應(yīng)用中選擇每個(gè)地址分配一個(gè)函數(shù),這樣允許應(yīng)用提取不同的地址作為功能寄存器。每個(gè)程序的匯編程序代碼和讀函數(shù)都相當(dāng)簡(jiǎn)單。代碼只要求以正確的地址載入數(shù)據(jù)指針,然后用一個(gè)movx指令激活存儲(chǔ)器總線。
Native_program0:
clr a ; request first parameter
lcall NatLib_LoadPrimitive ; load parameter into r3:r0
mov dptr, #0C00000h ; point to memory mapped peripheral
mov a, r0 ; move low byte of source into accumulator
movx @dptr, a ; write to memory mapped peripheral
clr a ; indicate no error condition
ret ;
...
Native_read0:
mov dptr, #0C00000h ; point to memory mapped peripheral
movx a, @dptr ; read from memory mapped peripheral
mov r0, a ; move into low byte of result
clr a ; indicate no error condition
mov r1, a ; unsigned extend to 32-bits
mov r2, a ; unsigned extend to 32-bits
mov r3, a ; unsigned extend to 32-bits
ret ;
應(yīng)用實(shí)例
應(yīng)用實(shí)例在源代碼的javacode文件夾中。該應(yīng)用向四組LED寫入遞增值。該數(shù)值每500ms更新一次,因此可以很方便地知道應(yīng)用是否正確運(yùn)行。
由于該應(yīng)用包括原生函數(shù)和Java代碼,因此構(gòu)建過(guò)程比純粹的Java程序更為復(fù)雜。源代碼中包含構(gòu)建批處理文件,但要求針對(duì)您開發(fā)的系統(tǒng)做一些修改,具體說(shuō)明如下:
c:worktinitini1.16
ativebinwin32macro -Ic:worktinitini1.16
ativelib cpld.a51
改變目錄以使其指向宏預(yù)編譯處理器和本地庫(kù)(native library)包含文件在您硬盤上的存儲(chǔ)位置。這些項(xiàng)目是標(biāo)準(zhǔn)TINI SDK的一部分,可從ftp.dalsemi.com/pub/tini/index.html下載。
c:worktinitini1.16
ativebinwin32a390 -f 1.16 -p 400 -l cpld.mpp
改變目錄以使其指向a390匯編程序的地址。它們和宏預(yù)編譯處理器存儲(chǔ)在相同的目錄中。
del *.class
從當(dāng)前目錄中刪除先前存在的類。
javac -bootclasspath C:worktinitini1.16bintiniclasses.jar demo.java
不考慮TINI類文件,構(gòu)建源文件demo.java。改變目錄以指向TINI的API類,它是TINI SDK的一部分。
java -classpath C:worktinitini1.16bintini.jar;%classpath% TINIConvertor -n cpld.tlib -f . -o demo.tini -d C:worktinitini1.16bintini.db
組合本地庫(kù)構(gòu)建TINI可執(zhí)行文件,實(shí)現(xiàn)與CPLD的接口。Java代碼只需要調(diào)用該函數(shù)。
System.loadLibrary("cpld.tlib")
為了訪問(wèn)CPLD的擴(kuò)展IO引腳,需要再次改變目錄以使其指向TINI SDK附帶的tini.jar工具文件和tini.db類數(shù)據(jù)庫(kù)。
結(jié)束語(yǔ)
TINI和CPLD的結(jié)合提供了一種簡(jiǎn)單接口,可擴(kuò)展IO性能,并具有高度靈活性。然而,使用可編程邏輯器件時(shí)其功能并不僅限于擴(kuò)展IO。CPLD可用來(lái)實(shí)現(xiàn)許多邏輯功能和狀態(tài)機(jī)。與TINI網(wǎng)絡(luò)棧、Java虛擬機(jī)和操作系統(tǒng)結(jié)合使用,CPLD可使TINI系統(tǒng)具有高度可配置性和靈活性。
評(píng)論