引言DS80C400评估板包括TINIm400参考电路板和TINIs400插座板,为评估TINI运行环境和利用DS80C400网络微控制器开发基于TINI的应用提供了一个优秀平台。TINIm400/TINIs400组合电路板的一个缺点是其通用IO (GPIO)引脚数有限。TINIs400插座板只包含几个可方便用作GPIO的引脚;插座板上的大多数IO引脚遍布在电路板上,并被用作其它功能(例如,J27为I²C引脚,J4为外部中断引脚)。
本应用笔记逐步演示了如何使用复杂可编程逻辑器件(CPLD)来配置硬件和开发软件,从而为TINIs400插座板额外提供32个GPIO引脚。
下载:与本应用笔记相关的源代码和电路图。 硬件设置扩展TINI的IO性能的第一步是在TINIs400插座板上额外安装四个器件:CPLD、电源调节器,以及两个插头。Dallas Semiconductor公司售出的TINIs400插座板上没有安装这些器件,但为添加这些器件预留了焊盘和走线。板上并未安装这些器件,因为许多应用并不需要扩展IO性能,或者采用定制电路板设计。
TINIs400电路原理图¹的第7页详细给出了扩展TINI IO性能所必需的器件。该电路使用了100引脚VQFP封装的Xilinx® XC2C64 CoolRunner®-II CPLD。XC2C64和更大规模的XC2C128均已在TINI硬件平台上通过测试,该平台也支持相同引脚和相同封装的其他规模的器件。
与CPLD相关的插头有三个,其中两个是必需安装的,具体说明如下:
- J30 JTAG编程连接器。通过JTAG接口对XC2C64 CPLD编程。J30连接器为JTAG信号TMS、TCK、TDI和TDO提供引脚。更详细的讨论见下文的CPLD编程一节。
- J28扩展IO连接器。通过该连接器可访问XC2C64器件的32个引脚。对CPLD编程将为这些引脚提供读/写接口。
- J29额外IO连接器。该连接器提供与XC2C64的16个额外连接,本设计中未用到这些连接器。
- U2 MAX1792EUA18调节器
- U12 Xilinx CPLD
- 电容C40至C57。这些电容仅在使用CPLD时才需要,从Dallas Semiconductor获得的TINIs400插座板应该已安装了这些电容。如果安装位置不正确或缺失,在进行其它TINI开发时也许不会注意到。
在TINIs400电路板上,XC2C64与TINI微控制器DS80C400的存储器总线连接。这种连接允许TINI程序通过读、写特定地址访问CPLD。所以,当地址线选择CPLD时,必须对CPLD编程以正确响应;CPLD必须锁存写入的数据总线信号,并且当读CPLD时必须驱动端口输入。
图1. CPLD功能框图
图1为CPLD需要实现的功能方框图。图中右上部的模块(IO7:0、IO15:8、IO23:16、IO31:24)代表存储输出电平值的触发器。这些8位寄存器组每一个均连接到数据总线。当通过适当的地址线和写选通信号(nWr)使能时,数据总线上的内容被锁存到寄存器内。检测IO引脚的输入电平并送入4:1多路复用器,此时低位地址选择8位值并传递到数据总线。如果CPU请求读(由地址线和nPSEN信号使能),则使能多路复用器的输出并驱动数据总线。
尽管10条地址线(不包括芯片使能)与CPLD连接,但本示例应用只使用其中四条。A17:A16高地址线配合芯片使能6一起使用。当地址位A17:A16为低且nCE6有效(低电平)时,选择CPLD,但CPLD在读或写信号有效之前不起作用。其它两个地址位A1:A0,用来选择四个8位寄存器当中的一个作为写 *** 作的目标地址或读 *** 作的源地址。这一地址方案意味着许多地址都可使能对四个8位寄存器的访问。表1概括了这种地址方案的灵活性。
表1. 能够激活CPLD寄存器的地址线取值
由于TINI库和工作固件将DS80C400配置为每个芯片使能端对应2MB空间,并且DS80C400的地址范围是24位(16MB),所以八个芯片使能端对应地址的高3位。为激活芯片使能6,24位地址的高3位必须为110b。
尽管表1说明多个地址均可激活寄存器,我们仅使用了以下寄存器地址:
- 地址C00000h → IO7:0
- 地址C00001h → IO15:8
- 地址C00002h → IO23:16
- 地址C00003h → IO31:24
- Buffer8.v:8位缓冲器,用来连接TINI到四个8位寄存器的数据总线。
- Mux2x8.v:2:1多路复用器,用来选择两条8位总线中的一条。
- OneO4e.v:2-4译码器,输出一个取决于低地址位的有效信号。
- Reg8OD.v:8位伪开漏极触发器阵列,用来存储输出值。
- TSBuffer8.v:8位三态缓冲器,用来驱动数据总线输入值。
- CPLD.v:模块间的顶层连接。
// Tri-State data bus to TINI needs this buffer TSBuffer8 U4(ReadT, DataToTINI, D);信号WriteT送入四个8位寄存器组作为时钟信号。
// 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]);另一个重要的源文件(虽然不是Verilog文件)是CPLD.ucf。该文件给出了CPLD.v中声明的信号名称和XC2C64器件实际引脚之间的映射关系。地址线和几个IO引脚的定义如下:
NET "AL<1>" LOC = "P30"; NET "AL<0>" LOC = "P32"; NET "AH<1>" LOC = "P37"; NET "AH<0>" LOC = "P39"; NET "UIO<5>" LOC = "P43"; NET "UIO<6>" LOC = "P49"; NET "UIO<7>" LOC = "P50"; NET "UIO<8>" LOC = "P52"; NET "UIO<9>" LOC = "P53";注意,这些引脚定义直接来自TINIs400电路原理图的第7页。例如,从电路图可以看出:地址线3-0 (A[3:0])连接到引脚28、29、30和32。如以上清单所示,我们定义了两条最低地址线信号(AL<1>和AL<0>),它们被映射至CPLD的引脚30和32。 CPLD编程用于CPLD编程的工程文件包含在本应用笔记的源代码CPLD目录内。可以使用Xilinx的免费WebPACK工具来构建并编程CPLD。本应用笔记中的应用实例是用6.3.03i版本开发的。只要支持CoolRunner 2 CPLD系列,Xilinx工具的最新版本应该也适合本设计。
硬件连接我们使用Avnet Avenue JTAG编程电缆来连接计算机的并口和CPLD的JTAG引脚。许多CPLD或FPGA评估套件均提供JTAG编程电缆。本文使用的编程电缆如图2所示。
图2. Avnet Avenue JTAG编程电缆
图3为编程电缆和TINIs400插座板之间所需的连接。对信号做了标记,因此也可以用其他编程电缆。TINIs400插座板要求VCC为3.3V。
图3. JTAG编程器与TINIS400插座板的连接关系。J30上未标注的引脚没有连接。
载入工程载入工程时,点击File菜单并选择Open Project。浏览本应用笔记的源文件并选择parallel32.npl。现在已经打开工程并准备构建。接下来说明如何配置一个全新的工程。也可以跳过这一节,直接浏览后面的部分了解如何编程CPLD。
遵照以下指导说明,根据应用笔记提供的源代码创建一个新工程。
- 在File菜单中选择New Project。
- 选择想要创建新工程的目录,输入工程名称。将创建一个以工程名称命名的新目录。确保Top Level Module Type为HDL。点击Next继续。
- 在接下来的菜单中选择工程需要的器件和封装。器件系列选择CoolRunner 2 CPLDs。然后从给出的列表中选择器件――可以是XC2C64、XC2C128或其它同类器件。封装选择VQ100,这是TINIs400插座板认定的封装。本应用笔记中用到的其它配置选项参见图4。完成配置后,点击Next继续。
图4. 配置新工程的器件和设计流程
- 下一个窗口询问新工程中要创建的所有新文件。由于已提供了所有源文件,因此点击Next,不增加任何新文件。
- 接下来的窗口要求添加任何现有的源文件。点击Add Source按钮添加源代码提供的所有Verilog文件(文件列表见上文的Verilog编码一节)和CPLD.ucf文件。一旦添加后,程序会询问:File.v is which source type? The suffix is ambiguous as to type (File.v是什么文件类型,后缀类型不明确)。选择Verilog Design File并点击OK (参见图5)。所有输入文件归类完毕后,点击Next继续。
图5. 确定输入源文件的文件类型。
- 接下来的窗口概括了新工程的基本信息。查看一遍信息并点击Finish。
- 只要在上面第5步中添加了UCF文件,程序将要求把该文件关联到其影响的内容。在列表中选择CPLD并点击OK。
器件编程按照以下指导说明来综合CPLD工程,并对XC2C64器件编程。确保编程电缆已按上文硬件安装一节中说明的方法连接完毕。
CPLD编程:
- 在Project View (一般在窗口左上部)中选择Module View标签。在Module View中选择主文件CPLD.v。
- 在Process View窗口(一般在Project View窗口下部)中,展开Implement Design分支并双击Generate Programming File。这将运行把Verilog源代码转换成二进制文件(用于编程CPLD)需要的所有进程。运行进程时,进程左侧将出现说明执行结果的标记。绿勾标志意味着进程成功结束,没有错误或警告。黄色惊叹号意味着进程成功结束,但有警告信息。红色X号意味着进程没有成功结束,出现了错误。
- 一旦程序结束并且成功生成编程文件,双击Configure Device (IMPACT)。
- 将出现一个窗口,显示Configure Devices。选择Boundary Scan Mode选项并点击Next。
- 在接下来的窗口(Boundary-Scan Mode Selection)中选择Automatically connect to cable and identify Boundary Scan chain,并点击Finish。
- 如果器件连接正确,iMPACT将d出一个窗口,显示“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....”。点击OK。
- 应该在当前的工程目录下打开一个文件对话窗口(如果没有在该目录下打开,应查到其正确位置)。在该窗口中双击选择CPLD.jed。
- 右键单击Xilinx芯片图并选择Program。
- 确保选中Erase Before Programming and Verify,并且不要选其它项。点击OK。
- 此时将出现编程状态进度条,几秒钟(少于20秒)后编程结束,CPLD配置完毕。
图6. 装有调试IO板的TINIs400/TINIm400
该简易电路板的原理图包含在本应用笔记的源代码中。注意,其中的电阻值是建议值;阻值太高会导致显示较暗,阻值太低会消耗太多TINI电源电流,并中止执行过程。 软件接口这一简单的存储器接口实现后,软件访问扩展的IO引脚变得相当简单,将采用汇编语言来实现(作为原生函数嵌入Java应用中)。
表2给出了为实现接口功能而定义的Java原生函数。
表2. TINI-CPLD接口使用的Java函数
注意,也可以用两个函数完成同样的工作:program(int address, int x)和read(int address)。但是,在本应用中选择每个地址分配一个函数,这样允许应用提取不同的地址作为功能寄存器。每个程序的汇编程序代码和读函数都相当简单。代码只要求以正确的地址载入数据指针,然后用一个movx指令激活存储器总线。
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 ;应用实例应用实例在源代码的javacode文件夹中。该应用向四组LED写入递增值。该数值每500ms更新一次,因此可以很方便地知道应用是否正确运行。
由于该应用包括原生函数和Java代码,因此构建过程比纯粹的Java程序更为复杂。源代码中包含构建批处理文件,但要求针对您开发的系统做一些修改,具体说明如下:
c:work ini ini1.16 ativeinwin32macro -Ic:work ini ini1.16 ativelib cpld.a51
改变目录以使其指向宏预编译处理器和本地库(native library)包含文件在您硬盘上的存储位置。这些项目是标准TINI SDK的一部分,可从ftp.dalsemi.com/pub/tini/index.html下载。c:work ini ini1.16 ativeinwin32a390 -f 1.16 -p 400 -l cpld.mpp
改变目录以使其指向a390汇编程序的地址。它们和宏预编译处理器存储在相同的目录中。del *.class
从当前目录中删除先前存在的类。javac -bootclasspath C:work ini ini1.16in iniclasses.jar demo.java
不考虑TINI类文件,构建源文件demo.java。改变目录以指向TINI的API类,它是TINI SDK的一部分。java -classpath C:work ini ini1.16in ini.jar;%classpath% TINIConvertor -n cpld.tlib
组合本地库构建TINI可执行文件,实现与CPLD的接口。Java代码只需要调用该函数。
-f . -o demo.tini -d C:work ini ini1.16in ini.dbSystem.loadLibrary("cpld.tlib")
为了访问CPLD的扩展IO引脚,需要再次改变目录以使其指向TINI SDK附带的tini.jar工具文件和tini.db类数据库。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)