根据不同的应用场合,用户可以选择不同的配置方式。在XC2S30内部逻辑设计阶段,可采用边界扫描模式进行配置。配置文件可通过Xilinx公司的下载电缆(如Xilinx并行下载电缆)下载到芯片,便于在线调试。但是在产品成品阶段,已经设计好的配置文件必须存储于EEPROM或者Flash等非易失的存储器中。在系统上电时,外围器件通过FPGA配置引脚将配置文件传送至FPGA中,从而使其正常工作。根据用户的需要,可以选择主动串行模式、被动串行模式和被动并行模式。其中串行的两种模式需要的I/O口资源较少,但速度较慢;被动并行模式需要的I/O口资源较多,速度也较快。根据本系统的设计要求,选择了占用I/0口资源较少的被动串行模式对XC2$30进行配置。
1.2 被动串行模式下的配置引脚
在被动串行模式下,所用到的配置引脚为模式选择M[2:0]、配置时钟CCLK、配置复位PROGRAM、配置完成DONE、配置数据串行输入DIN和初始化状态INIT。
1.3 被动串行模式下的配置步骤及时序
XC2S30上电后,当内核和I/O口电源引脚电压达到高电平或者用户将PROGRAM引脚置低时,芯片便进入初始化状态。此后芯片将INIT引脚置低,代表芯片正在清空配置存储器,清空完成后INIT引脚将被置高,代表清空完毕。在INIT的上升沿,模式选择引脚M[2:0]被采样,以决定配置模式,若为11x则采用被动串行模式。此后配置文件信息可以通过CCLK和DIN两个配置引脚输入至XC2S30中。配置数据在CCLK的上升沿采样。在配置期间芯片会自动进行CRC错误检验。若发生了CRC校验错误,INIT引脚将被置低,用户可以检测该引脚判断配置过程中是否出现错误。当配置文件成功输入至芯片中,芯片置DONE引脚为高,用户可检测该引脚判断配置是否成功。此后芯片进入正常工作状态。配置流程如图1所示。
2 MM36SB010的读写方式
MM36SB010是Megawin公司生产的大容量SPI串行e-F1ash存储器。该芯片具有低功耗(小于4mA)、宽电压(2.4~5.5V)、高速(8MHz工作频率)、大容量(1Mb)和小页面(每页128B)、低成本等诸多优点,特别适合于消费电子、通信、工业控制等领域的应用。该芯片可工作在2线或者3线串行总线方式。本方案使用该芯片存储FPGA配置文件,读写接口简单,速度快。
MM36SB010的容量为1Mb,共分1024页,每页128B。芯片内部有1个128B的缓冲区,可以对读写数据进行暂存,内部结构如图2所示。
MM36SB010可工作在2线或者3线串行总线方式,工作方式通过SMC(串行模式控制)引脚来选择。当SMC为高电平时,为2线方式;当SMC为低电平时,为3线方式。本方案采用3线方式,串行数据输入和输出引脚分开,数据输入引脚为SDl0,数据输出引脚为SDO。MM36SB010的状态可通过引脚BUSY来检测,也可以通过访问状态寄存器进行查询。3线工作方式的电路示意如图3所示。
MCU可通过SCLK和SDIO引脚向MM36SB010发送控制命令,实现MM36SB010的软件复位、Flash存储器或缓冲区数据的读写和状态查询等功能。常用的命令有软件复位(SRC)、读状态寄存器(RSE)、读F1ash存储器数据(RME、RMEC)、写缓冲区(WEB、WEBC)、带预擦除功能的写缓冲区数据至Flash存储器(WBMEP)。所有的命令、地址和数据都从最低位(LSB)开始发送。
在MM36SB010上电后需执行一次软件复位指令,等待20ms后芯片即可正常工作。数据可从Flash存储器中用RME和RMEC:指令直接读取,但写数据至Flash存储器前必须用WEB和WEBC命令将数据送入缓冲区内,再用WBMEP或者WBMP命令将缓冲区内的数据送入Flash存储器。
虽然MM36SB010的时钟SCLK的频率最高可达8MHz,但是由于每次从Flash读写一个字节数据前必须先送入控制命令,因此实际的读写速度小于4MHz。
3 配置方案
Xilinx公司针对各款FPGA都设计了专用的配置芯片,如在系统可编程18VXX系列和串行一次性可编程PROM-XCl7V00系列。目前18Vxx系列价格正逐步降低,但是由于其专用性,该ROM很难被系统中其它部分共享;XCl7V00系列虽然价格较低,但只能一次性烧写,只适用于成品阶段。本方案中XC2S30的配置文件存储于MM36SB010,并由MCU完成其读写功能,配置文件通过RS232串口下载。当配置文件下载完毕后,由MCU从MM36SB010中读取并对XC2S30进行配置。MM36SB010中其余存储空间可供其它程序模块使用。
3.1 硬件框图
MCU通过SCLK、SDIO、SDO完成对MM36SB010的读写,同时MCU通过CCLK、DIN、INIT、PROGRAM、DONE引脚完成对XC2S30的配置。硬件框图如图4所示。
3.2 MCU程序
本方案的MCU内部程序主要完成三部分功能:与PC机的串口通信、读写MM36SB010和配置XC2S30。MCU工作在两种状态,在上电时MCU从MM36SB010中读取配置文件并对XC2S30进行配置,完成配置后等待PC机从串口发出的下载命令。接收到该命令后,MCU开始接收配置文件并写入MM36SB010。程序流程如图5所示。
对XC2S30配置的程序部分主要完成被动串行模式的配置时序,配置时序如图6所示。
配置部分程序代码如下:
//函数定义
//从e-Flash中读取配置文件数据void ReadFlashData(unsigned int p_addr,unsigned char b_addr,unsigned char count,unsigned char*buf)
//p_addr为页地址,b_addr为页内地址,buf为MCU内部存储 //器指针{
unsigned int i,temp=0:
send_one_byte(0x9C); //送RME指令
send_one byte(b_addr); //送页内地址
send_one_byte((unsigned char)(P_addr & 0x00FF)); //送页低字节地址
send_one_byte((unsigned char)p_addr&0xFF00)); //送页高字节地址
buf[0]=read one byte(); //读取数据
for(i=1;i<count;i++){ //连续读取数据
send_one_byte(RMEC); //送RMEC指令
buf[i]=read_one_byte();
}
}
//向SpartanlI发送配置数据
void SendConfigData(unsigned char count,unsigned char*configdata)
{
unsigned chari,j,temp;
CCLK=0;
for(i=count;i>0;i--){
temp=*configdata++;
for(j=0;j<8;j++){
if((temp&0x80)==0
DIN=O;
else
DIN=1:
tem0=temp<<1;
}
CCLK=I;
CCLK=0;
}
} //主程序……
…… //程序初始化部分
length=FILESIZE; //配置文件长度
INIT=1;
PROGRAM=0; //清空配置存储器
Delay(); //延时
PROGRAM=1;
while(INIT==0); //等待存储器清空
while(1){
ReadFlashData(page_addr,bit_addr,128,databuf);
//从MM36SB010中读取128字节配置文件数据
SendConfigData(128,databuf); //发送配置文件数据至XC2S30
length-=128;
if(1ength<128)
break;
}
void ReadFlashData(page_addr,bit_addr,length,databuf);
SendConfigData(Iength,databu);
if(DONE==1)…… //配置成功
else…… //配置失败
结语
本方案提出了一种基于大容量串行e-Flash的XilinxSpartanlI系列FPGA在线配置的方法。该方案适用于采用MCU的嵌入式系统中,占用MCU的I/O口资源少,且可以实现ROM的共享。MCU程序采用C语言编写,便于在单片机、ARM等MCU间的移植。经过实际测试,配置XC2S30仅需数秒,可以应用在对设备开机时间要求不高的场合。本方案已经应用在某电力测量设备中,效果理想,运行可靠。