摘要:介绍了基于ARM 内核的ATMEL AT91FR4081 微控制器以J TAG 的ISP 方式配置XILINXXC2S150PQ208 FPGA 的实现过程。这是一种灵活和经济的FPGA 的配置方法。介绍了ISP 和JTAG 的原理、系统实现的流程、硬件电路设计、JTAG 驱动算法的实现和配置时间的测试结果。
关键词:ARM;微控制器;FPGA ;配置
基于SRAM 的FPGA 加电时需要配置来预备其功能。一般情况下FPGA 的配置文件由片外专用的EPROM 来加载。这种配置方式是在FPGA 的功能相对固定的情况下采用的。如果系统设计要求更强的灵活性, 比如要实现远程FPGA 配置、基于FPGA 的可重构计算系统中FPGA 的配置等,就需要以在系统编程ISP 的方式实现FPGA 的配置。本文介绍在一个具有FPGA 的可重构计算系统中,通过系统中基于ARM 的微控制器以JTAG的ISP方式配置FPGA 的设计和实现。
ISP 与JTAG原理
在系统编程( In System Programming , ISP) 是指需要编程的器件无须通过外部的编程器而直接在系统中由控制器实现。控制器可以是MCU ,DSP 或专用的硬件。以ISP 的方式实现FPGA 的配置具有很多优点:可以免去专用的EPROM而节省成本、简化硬件的设计;可以实现远程配置而方便升级维护,延长产品的生存周期;可以实现功能分时复用的可重构计算,使得系统更集成化、更具有灵活性等。
边界扫描(Joint Test Action Group ,J TAG) 起初是一个负责开发板级分立器件整合和互连小组开发的一种测试标准。后来随着在实际中的应用其定义和功能逐渐得到完善和扩展并形成了IEEE 1149. 1 (或1532) 标准。现在J TAG已经成为可以深入芯片测试、调试和进行ISP 编程的一种工业标准。J TAG的结构是在芯片内部电路和输入输出管脚之间增加了具有开关和锁存功能的边界扫描单元(Boundary Scan Cell ,BSC) 。每个BSC 单元通过一条遍及所有管脚的链串行连接起来。具体结构包括TAP 控制器、指令寄存器、指令译码器、边界扫描寄存器和旁路寄存器等。具有J TAG结构的芯片对外只有一个TAP( Test Access Port) 总线端口,五线制的总线信号包括测试数据输入TDI、测试数据输出TDO、测试模式选择TMS、测试时钟TCK和测试逻辑复位TRST。
以ISP 的方式配置FPGA 还可以有其他几种具体的配置模式,如从串和从并的模式。J TAG的模式是一种适用更加广泛的模式, 不仅可以用来配置FPGA , 还可以用来配置CPLD 和配置FPGA 的专用EPROM。
系统实现流程
MCU 配置FPGA 可以灵活地实现对配置文件的存储、管理和下载,比如多个不同功能的配置文件可以同时预先存储在MCU 的存储器中,系统运行时可以由MCU 根据系统设计的要求实现对多个配置文件的调用管理和下载。MCU 以J TAG的模式配置FPGA 的系统实现流程如图1 所示。
由图1 可见,配置FPGA 的位流文件需要先转换成SVF(Serial Vector Format) 格式文件。SVF 格式是IEEE 1149. 1标准中描述J TAG 总线操作的高级语言语法规范,可以由FPGA 的设计工具转换生成。由于SVF 格式文件是ASCII码表示的,文件很大,需要压缩成XSVF 位流文件。XSVF 文件虽然也是二进制的位流文件,但是内容却和SVF 相同。然后需要将XSVF 格式转换成MCS 或HEX 格式来编程MCU的ROM 或FLASH。系统运行时,由MCU 执行J TAG的驱动算法调用解释XSVF 文件,通过MCU 的通用I/ O 管脚驱动J TAG的TAP 总线来完成对FPGA 的配置。
硬件电路设计
本文的硬件设计是一个具有FPGA 的可重构计算系统中硬件设计的一部分。相关的硬件设计原理图部分如图2 所示,图中只画出了与配置电路相关部分的信号。
系统中MCU 采用ATMEL 基于32 位ARM7TDMI 核心的AT91FR4081 ,芯片工作在3. 0V 和40MHz 的情况下可以达到36MIPS 的性能,具有很好的性能功耗比。该芯片内部还集成了136KBytes 的SRAM 和1MBytes 的Flash(AT49LV8011) 。其中128KBytes 的SRAM 在取消模拟ROM 的写保护后可以直接作为程序运行的存储器使用,一块芯片几乎就是一个嵌入式的计算机系统了,集成度非常高。此外,该芯片还具有MCU 应该具有的一些标准的硬件单元和接口,比如32 个通用的I/ O、可编程的扩展外部存储器接口EBI、中断控制器、USART 和J TAG接口等。
系统中FPGA 采用的是Xilinx Spartan2 系列中的XC2S150PQ208 ,具有15 万系统门资源和103Kbits 的内部RAM。以J TAG模式配置时,配置模式选择信号M0∶M1∶M2的电平设置为1∶0∶0 。由图2 可见,配置的硬件电路只是用MCU 的通用I/ O管脚P0~ P3 分别连接FPGA 的TAP 总线信号TMS , TCK,TDI 和TDO ,电路很简单。但需要注意MCU 驱动TAP 的电平标准,MCU 的驱动电平不能低于TAP 的工作电平,本文设计中均为3. 3V。
JTAG驱动算法实现
JTAG驱动算法是MCU 以JTAG模式配置FPGA 的关键。算法调用SVF 配置文件,解释其中的语法规范,生成严格的TAP 总线时序,驱动MCU 的通用I/ O 管脚来完成对FPGA 的配置。其中TAP 时序是算法设计和实现调试的一个主要方面,时序关系如图3 所示。
TAP 时序中TMS 和TDI 信号在TCK的上升沿有效,在TCK的下降沿更新。TDO 信号的下一个值出现在TCK的下降沿之后,并延迟一个足够的间隔TDOV 后选通TDO 信号。
JTAG驱动算法的实现需要根据具体的MCU 型号定制四个读取SVF 配置文件和驱动MCU 通用I/ O 的接口函数set Port () ,readByte ( ) ,readTDOBit ( ) 和Wait Time ( ) 。本文基于AT91FR4081 来定制这四个函数。下面给出这四个函数的源代码以供参考。
void set Port (short p , short val)
{
if (p == TMS) out-word. tms = !val ;
if (p == TDI) out-word. tdi = !val ;
if (p == TCK)
{out-word. tck = !val ;
at91-pio-write ( &PIO-DESC ,FPGA- TMS ,out-word. tms) ;
at91-pio-write ( &PIO-DESC ,FPGA- TDI ,out-word. tdi) ;
at91-pio-write ( &PIO-DESC ,FPGA- TCK,out-word. tck) ;}
}
void readByte (unsigned char 3 data)
{
* data = * mark ;
/ * mark is a pointer holding the data start address * /
mark ++ ;
}
unsigned char readTDOBit ()
{
if ( (at91-pio- read( &PIO-DESC) & FPGA- TDO)== FPGA- TDO)
{in-word. tdo = (short) 1 ;
}
else
in-word. tdo = (short) 0 ;
}
void wait Time (long microsec)
{
static long tckCyclesPerMicrosec = (long) 33 ;
/ * system CL K is 33MHz * /
long tckCycles = microsec * tckCyclesPerMicrosec ;
long i ;
for (i = 0 ;i < tckCycles ;++ i ) ;
{pulseClock() ;}
}
测试结果
AT91FR4081 工作频率是33MHz ,用HP16702B 逻辑分析仪测试TCK 信号的频率为15KHz , 配置完成XC2S150PQ208 的时间是40 秒左右。这个时间和MCU 的工作频率、TCK的频率、算法中等待函数的参数设置、FPGA 配置文件的内容和JTAG驱动算法本身的复杂度等有关。应该可以通过进一步优化设计来缩短配置的时间。
结语
本文介绍了基于ARM 内核的AT91FR4081 微控制器以J TAG的ISP 方式配置XC2S150PQ208 FPGA 的实现过程。这种配置FPGA的方法充分利用了MCU 的灵活性,既节省了配置专用的EPROM,又可以满足一些特殊的系统设计要求,比如在系统地测试调试、远程配置、不同功能的分时复用等,是进行高集成度、高灵活性嵌入式计算系统设计时的一个重要方法。