<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          擴(kuò)展TINI的IO性能

          作者: 時(shí)間:2006-09-01 來源:網(wǎng)絡(luò) 收藏

          引言

          DS80C400評估板包括TINIm400參考電路板和TINIs400插座板,為評估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)來配置硬件和開發(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頁詳細(xì)給出了擴(kuò)展TINI IO性能所必需的器件。該電路使用了100引腳VQFP封裝的Xilinx XC2C64 CoolRunner-II CPLD。
          XC2C64和更大規(guī)模的XC2C128均已在TINI硬件平臺(tái)上通過測試,該平臺(tái)也支持相同引腳和相同封裝的其他規(guī)模的器件。 與CPLD相關(guān)的插頭有三個(gè),其中兩個(gè)是必需安裝的,具體說明如下:

          J30 JTAG連接器。通過JTAG接口對XC2C64 CPLD。J30連接器為JTAG信號TMS、TCK、TDI和TDO提供引腳。更詳細(xì)的討論見下文的CPLD編程一節(jié)。

          J28擴(kuò)展IO連接器。通過該連接器可訪問XC2C64器件的32個(gè)引腳。對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是可編程邏輯器件??蓪⑺醋魇强删幊逃布?,具有非常靈活的內(nèi)部邏輯,允許通過簡單再編程實(shí)現(xiàn)很多功能。用CPLD可以實(shí)現(xiàn)32位觸發(fā)器,以存儲(chǔ)CPLD輸出引腳的邏輯電平。用Verilog,一種硬件描述語言(HDL)來描述CPLD要實(shí)現(xiàn)的功能。Xilinx提供的工具可將Verilog源代碼轉(zhuǎn)換成二進(jìn)制形式,用來配置CPLD。

          在TINIs400電路板上,XC2C64與TINI微控制器DS80C400的存儲(chǔ)器總線連接。這種連接允許TINI程序通過讀、寫特定地址訪問CPLD。所以,當(dāng)?shù)刂肪€選擇CPLD時(shí),必須對CPLD編程以正確響應(yīng);CPLD必須鎖存寫入的數(shù)據(jù)總線信號,并且當(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)通過適當(dāng)?shù)牡刂肪€和寫選通信號(nWr)使能時(shí),數(shù)據(jù)總線上的內(nèi)容被鎖存到內(nèi)。檢測IO引腳的輸入電平并送入4:1多路復(fù)用器,此時(shí)低位地址選擇8位值并傳遞到數(shù)據(jù)總線。如果CPU請求讀(由地址線和nPSEN信號使能),則使能多路復(fù)用器的輸出并驅(qū)動(dòng)數(shù)據(jù)總線。

          盡管10條地址線(不包括芯片使能)與CPLD連接,但本示例應(yīng)用只使用其中四條。A17:A16高地址線配合芯片使能6一起使用。當(dāng)?shù)刂肺籄17:A16為低且nCE6有效(低電平)時(shí),選擇CPLD,但CPLD在讀或?qū)懶盘栍行е安黄鹱饔?。其它兩個(gè)地址位A1:A0,用來選擇四個(gè)8位當(dāng)中的一個(gè)作為寫操作的目標(biāo)地址或讀操作的源地址。這一地址方案意味著許多地址都可使能對四個(gè)8位寄存器的訪問。表1概括了這種地址方案的靈活性。

          表1. 能夠激活CPLD寄存器的地址線取值

          由于TINI庫和工作固件將DS80C400配置為每個(gè)芯片使能端對應(yīng)2MB空間,并且DS80C400的地址范圍是24位(16MB),所以八個(gè)芯片使能端對應(yīng)地址的高3位。為激活芯片使能6,24位地址的高3位必須為110b。

          盡管表1說明多個(gè)地址均可激活寄存器,我們僅使用了以下寄存器地址:

          地址C00000h IO7:0
          地址C00001h IO15:8
          地址C00002h IO23:16
          地址C00003h IO31:24
          Verilog編碼
          有六個(gè)Verilog文件用來實(shí)現(xiàn)CPLD的32位GPIO功能。本應(yīng)用筆記的源代碼中包含了這些文件,并附帶提供Xilinx WebPACK(參見下文的討論)工程文件。本工程的Verilog源文件包括:

          Buffer8.v:8位緩沖器,用來連接TINI到四個(gè)8位寄存器的數(shù)據(jù)總線。
          Mux2x8.v:2:1多路復(fù)用器,用來選擇兩條8位總線中的一條。
          OneO4e.v:2-4譯碼器,輸出一個(gè)取決于低地址位的有效信號。
          Reg8OD.v:8位偽開漏極觸發(fā)器陣列,用來存儲(chǔ)輸出值。
          TSBuffer8.v:8位三態(tà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

          然后將信號ReadT作為三態(tài)緩沖器的使能信號,使用檢測到的輸入值驅(qū)動(dòng)DS80C400的數(shù)據(jù)總線:

          // Tri-State data bus to TINI needs this buffer
          TSBuffer8 U4(ReadT, DataToTINI, D);

          信號WriteT送入四個(gè)8位寄存器組作為時(shí)鐘信號。
          // 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中聲明的信號名稱和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";

          注意,這些引腳定義直接來自TINIs400電路原理圖的第7頁。例如,從電路圖可以看出:地址線3-0 (A[3:0])連接到引腳28、29、30和32。如以上清單所示,我們定義了兩條最低地址線信號(AL1>和AL0>),它們被映射至CPLD的引腳30和32。

          CPLD編程
          用于CPLD編程的工程文件包含在本應(yīng)用筆記的源代碼CPLD目錄內(nèi)??梢允褂肵ilinx的免費(fèi)Webpack工具來構(gòu)建并編程CPLD。本應(yīng)用筆記中的應(yīng)用實(shí)例是用6.3.03i版本開發(fā)的。只要支持CoolRunner 2 CPLD系列,Xilinx工具的最新版本應(yīng)該也適合本設(shè)計(jì)。
          硬件連接
          我們使用Avnet Avenue JTAG編程電纜來連接計(jì)算機(jī)的并口和CPLD的JTAG引腳。許多CPLD或FPGA評估套件均提供JTAG編程電纜。本文使用的編程電纜如圖2所示。


          圖2. Avnet Avenue JTAG編程電纜

          圖3為編程電纜和TINIs400插座板之間所需的連接。對信號做了標(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)建。接下來說明如何配置一個(gè)全新的工程。也可以跳過這一節(jié),直接瀏覽后面的部分了解如何編程CPLD。

          遵照以下指導(dǎo)說明,根據(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ù)。

          在接下來的菜單中選擇工程需要的器件和封裝。器件系列選擇CoolRunner 2 CPLDs。然后從給出的列表中選擇器件——可以是XC2C64、XC2C128或其它同類器件。封裝選擇VQ100,這是TINIs400插座板認(rèn)定的封裝。本應(yīng)用筆記中用到的其它配置選項(xiàng)參見圖4。完成配置后,點(diǎn)擊Next繼續(xù)。


          圖4. 配置新工程的器件和設(shè)計(jì)流程

          下一個(gè)窗口詢問新工程中要?jiǎng)?chuàng)建的所有新文件。由于已提供了所有源文件,因此點(diǎn)擊Next,不增加任何新文件。

          接下來的窗口要求添加任何現(xiàn)有的源文件。點(diǎn)擊Add Source按鈕添加源代碼提供的所有Verilog文件(文件列表見上文的Verilog編碼一節(jié))和CPLD.ucf文件。一旦添加后,程序會(huì)詢問: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. 確定輸入源文件的文件類型

          接下來的窗口概括了新工程的基本信息。查看一遍信息并點(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)說明來綜合CPLD工程,并對XC2C64器件編程。確保編程電纜已按上文硬件連接一節(jié)中說明的方法連接完畢。

          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)說明執(zhí)行結(jié)果的標(biāo)記。綠勾標(biāo)志意味著進(jìn)程成功結(jié)束,沒有錯(cuò)誤或警告。黃色驚嘆號意味著進(jìn)程成功結(jié)束,但有警告信息。紅色X號意味著進(jìn)程沒有成功結(jié)束,出現(xiàn)了錯(cuò)誤。

          一旦程序結(jié)束并且成功生成編程文件,雙擊Configure Device (IMPACT)。
          將出現(xiàn)一個(gè)窗口,顯示Configure Devices。選擇Boundary Scan Mode選項(xiàng)并點(diǎn)擊Next。

          在接下來的窗口(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è)文件對話窗口(如果沒有在該目錄下打開,應(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ù)信號為高阻抗?fàn)顟B(tài)。忽略這一點(diǎn)是很常見的錯(cuò)誤,這會(huì)導(dǎo)致奇怪的故障現(xiàn)象,例如電路板會(huì)被保持在復(fù)位狀態(tài)或發(fā)生隨機(jī)性重啟。發(fā)生此類問題時(shí),只要擦除CPLD即可阻止該問題。

          調(diào)試電路板

          簡單地借助32個(gè)LED,即可以演示TINI的IO擴(kuò)展性能。該演示板用四組LED和四個(gè)電阻排來指示每個(gè)CPLD IO引腳的狀態(tài)。LED板(安裝在TINIs400上)如圖6所示。


          圖6. 裝有調(diào)試IO板的TINIs400/TINIm400

          該簡易電路板的原理圖包含在本應(yīng)用筆記的源代碼中。注意,其中的電阻值是建議值;阻值太高會(huì)導(dǎo)致顯示較暗,阻值太低會(huì)消耗太多TINI電源電流,并中止執(zhí)行過程。


          軟件接口

          這一簡單的存儲(chǔ)器接口實(shí)現(xiàn)后,軟件訪問擴(kuò)展的IO引腳變得相當(dāng)簡單,將采用匯編語言來實(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)簡單。代碼只要求以正確的地址載入數(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)建過程比純粹的Java程序更為復(fù)雜。源代碼中包含構(gòu)建批處理文件,但要求針對您開發(fā)的系統(tǒng)做一些修改,具體說明如下:

          c:worktinitini1.16
          ativebinwin32macro -Ic:worktinitini1.16
          ativelib cpld.a51
          改變目錄以使其指向宏預(yù)編譯處理器和本地庫(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
          組合本地庫構(gòu)建TINI可執(zhí)行文件,實(shí)現(xiàn)與CPLD的接口。Java代碼只需要調(diào)用該函數(shù)。
          System.loadLibrary("cpld.tlib")
          為了訪問CPLD的擴(kuò)展IO引腳,需要再次改變目錄以使其指向TINI SDK附帶的tini.jar工具文件和tini.db類數(shù)據(jù)庫。

          結(jié)束語

          TINI和CPLD的結(jié)合提供了一種簡單接口,可擴(kuò)展IO性能,并具有高度靈活性。然而,使用可編程邏輯器件時(shí)其功能并不僅限于擴(kuò)展IO。CPLD可用來實(shí)現(xiàn)許多邏輯功能和狀態(tài)機(jī)。與TINI網(wǎng)絡(luò)棧、Java虛擬機(jī)和操作系統(tǒng)結(jié)合使用,CPLD可使TINI系統(tǒng)具有高度可配置性和靈活性。



          關(guān)鍵詞: 寄存器 編程 器件

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();