unsigned char FpgaConfig(void)
{
unsigned int iConfigDataByteCount;
unsigned char code * pConfigDataAddress;
pConfigDataAddress = 0x2000; //FPGA 配置数据的起始地址
nCONFIG = 0;
while((nSTATUS==1) || (CONFIG_DONE == 1));
nCONFIG = 1;
while((nSTATUS==0);
iConfigDataByteCount = 0;
CFG_CS_ = 0;
while(CONFIG_DONE == 0)
{
while(RDYnBUSY == 0);
FPGA_CFG_ADDRESS = *pConfigDataAddress;
pConfigDataAddress++;
iConfigDataByteCount++;
if ((iConfigDataByteCount > 0x3A98) || ( nSTATUS==0) )
//EPF10K10ATC144-3 配置数据为0x3A98(15000)字节,升级成相同封装和引脚的
//EPF10K30ATC144-3 时,只需将0x3A98 改成0xC63E(50750)即可
{
CFG_CS_ = 1;
return ERROR;
}
}
CFG_CS_ = 1;
return SUCCESS;
}
在不更改硬件板的条件下,若更改 FPGA芯片升级系统,升级成含有 1728个逻辑单元和 12288个 RAM位的 EPF10K30ATC144-3芯片时,由于与 EPF10K10ATC144-3具有相同的封装和引脚排列[3],因此硬件上可以直接更换 FPGA芯片来升级,而软件上只需将 Block1程序中对 FPGA配置的数据大小参数 15000改成 50750(见上程序注释)。而升级芯片的配置数据,则直接通过串口 IAP将配置数据写入 Block0高地址段即可。因此,能非常方便的在线完成 FPGA内部逻辑甚至更换 FPGA芯片时的系统升级。
4.结论
本文给出了基于 SST89V564RD处理器的 FPGA被动并行异步配置的软硬件实现,该方法充分利用了 SST89V564RD的 IAP技术以及分块大容量的 Flash存储技术,能快速、方便、灵活地对对 FPGA的内部逻辑功能进行在线升级,还可以完成在升级相同封装和引脚的 FPGA芯片时,进行整个系统的在线升级。本方法也适合于其他类似的微处理器。