查看完整版本: 大容量串行e-Flash的FPGA配置方案

liyf 发表于 2014-10-5 10:15:27

大容量串行e-Flash的FPGA配置方案

大容量串行e-Flash的FPGA配置方案


引 言
   现场可编程门阵列FPGA(Field Programmable Gate Array)是一种集通用性强、设计灵活、集成度高和编程方便等诸多优点于一身的现场可编程ASIC。自1985年美国的Xilinx公司推出FPGA产品并取得成功以后,FPGA发展迅猛,门数不断提升,达到数百万门的规模;产品种类日益丰富,性能不断完善,在军事、通信、医疗、消费类电子等各领域发挥了巨大的作用。
Xilinx公司的FPGA具有很高的性价比,其集成开发环境ISE和Webpack效率高、界面友好,因此在业界有着广泛的应用。通常对Xilinx公司的FPGA配置采用专用的配置芯片,速度较快,其价格也正逐步降低。笔者为配合某电力测量仪表的开发,对Xilinx公司的SpartanII系列FPGA的配置方案进行了探索,总结出一套成本低廉、接口简单、便于移植的方法。该方法采用Megawin公司的1Mb大容量串行e-Flash存储器MM36SB010存放FPGA配置文件,通过MCU在被动串行模式下完成了对XC2S30的在线配置。

1 Spartanll配置简介
    Xilinx公司的SpartanII系列FPGA产品成熟。该系列是采用0.18 μ m工艺的2.5V低电压FPGA芯片,功耗低,可无限次编程。XC2S30是该系列FPGA中的一款,总门数达3万门,可以实现电力测量仪表中采样数据的串行编码和多CPU间的数据交换的功能。
    XC2S30采用CMOS SRAM工艺。由于SRAM的易失性,断电后配置信息消失,因此上电时必须对该芯片重新配置才能使其正常工作。本节将详细介绍XC2S30的配置方式。该配置方式对SpartanlI系列的其它FPGA同样适用。
1.1 配置模式
    XC2S30支持4种配置模式:被动串行模式(slave serialmode)、主动串行模式(master serial mode)、被动并行模式(slave parallel mode)和边界扫描模式(boundary-scanmode)。在每次芯片上电初始化完毕后,芯片将采样模式引脚M以决定配置模式。配置引脚状态和配置模式的关系如表1所列。(X代表任意状态。)


    根据不同的应用场合,用户可以选择不同的配置方式。在XC2S30内部逻辑设计阶段,可采用边界扫描模式进行配置。配置文件可通过Xilinx公司的下载电缆(如Xilinx并行下载电缆)下载到芯片,便于在线调试。但是在产品成品阶段,已经设计好的配置文件必须存储于EEPROM或者Flash等非易失的存储器中。在系统上电时,外围器件通过FPGA配置引脚将配置文件传送至FPGA中,从而使其正常工作。根据用户的需要,可以选择主动串行模式、被动串行模式和被动并行模式。其中串行的两种模式需要的I/O口资源较少,但速度较慢;被动并行模式需要的I/O口资源较多,速度也较快。根据本系统的设计要求,选择了占用I/0口资源较少的被动串行模式对XC2$30进行配置。
1.2 被动串行模式下的配置引脚
    在被动串行模式下,所用到的配置引脚为模式选择M、配置时钟CCLK、配置复位PROGRAM、配置完成DONE、配置数据串行输入DIN和初始化状态INIT。
1.3 被动串行模式下的配置步骤及时序
    XC2S30上电后,当内核和I/O口电源引脚电压达到高电平或者用户将PROGRAM引脚置低时,芯片便进入初始化状态。此后芯片将INIT引脚置低,代表芯片正在清空配置存储器,清空完成后INIT引脚将被置高,代表清空完毕。在INIT的上升沿,模式选择引脚M被采样,以决定配置模式,若为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=read one byte();                                    //读取数据
for(i=1;i<count;i++){                                       //连续读取数据
send_one_byte(RMEC);                                       //送RMEC指令
buf=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仅需数秒,可以应用在对设备开机时间要求不高的场合。本方案已经应用在某电力测量设备中,效果理想,运行可靠。

李小路 发表于 2021-6-23 14:52:29

谢谢分享!:D
页: [1]
查看完整版本: 大容量串行e-Flash的FPGA配置方案