在数据采集系统中有许多算法,包括数据的采集、预处理、变换还有基本参数的测量都可以在FPGA内完成,特别是对采集数据的多种变换,如快速傅里叶变换和小波变换等直接提高了系统的性能和分析能力。但是由于系统中要用的算法太多,但是FPGA的容量是有限的,因此在我们的系统中对FPGA使用了比较灵活的配置方式,既有用来调试的JTAG方式,又有固定的AS方式,还有可以重新配置的PS方式。在ARM的SDRAM中放置多个配置文件,既可以达到一个系统多样的功能。
FPGA配置方式简介
配置是对FPGA的内容进行编程的过程。对于SRAM结构的FPGA来说,每次掉电都需要重新进行配置,这是SRAM工艺FPGA的一个特点也是一个缺点。在FPGA内部有许多可编程的多路器、逻辑、互连线结点和RAM初始化内容等,都需要配置数据来控制。FPGA中的配置寄存器RAM就起到这样一个存放配置数据的作用[4]。
根据FPGA在配置电路中的角色,配置数据可以使用三种方式载入到目标器件中:
1.FPGA主动(Active)方式
2.FPGA被动(Passive)方式
3.JTAG方式
在主动方式下,目标FPGA来主动输出控制和同步信号给Altera专用的一种串行配置芯片,如EPCS1和EPCS4,在配置芯片收到命令后,就把配置数据发给FPGA,完成配置过程。由于设计中选用的FPGA容量比较大,所以设计中使用EPCS16来配置EP3C25。
在被动方式下,由系统中的其他设备发起并控制配置过程。这些设备可以是Altera的配置芯片,或者是微处理器、CPLD等智能设备。FPGA在配置的过程中完全处于被动地位,只是输出一些状态信号来配合配置过程。本设计就是使用外围的ARM处理器来配置FPGA。
JTAG是IEEE 1149.1边界扫描测试协议的标准接口。绝大多数的FPGA都支持使用JTAG口进行配置。从JTAG接口进行配置可以使用Altera的下载电缆,通过Quartusii工具下载,也可以使用智能主机,如微处理器来模拟JTAG时序进行配置。
相比较上述三种配置方式,我们设计中跟倾向与使用被动方式来配置FPGA,它与主动方式相比有以下几个优点:
1.降低硬件成本。省去了FPGA专用EPROM的成本,而几乎不增加其他成本。以Altera的EP3C25为例,板上至少要配一片以上的EPCS16,每片 EPCS16的价格要二十多元,容量16M。EP3C25的配置文件为5.8Mbits,而提供5.8Mb的存储空间,对于大部分单板来说(如ARM系统的单板的SDRAM为256M),是不需要增加硬件的。即使增加16Mb存储空间,通用存储器也会比FPGA专用EPROM便宜很多。
2.实现真正"现场可编程"--FPGA的特点就是"现场可编程",只有使用CPU对FPGA编程才能体现这一特点。如果设计周全的话,单板上的FPGA可以做到在线升级。
PS配置流程
在FPGA正常工作时,配置数据存储在配置寄存器中,由于SRAM是易失性存储器,在FPGA重新上电之后,外部电路需要将配置数据重新载入片内的配置RAM中。在芯片配置完成之后,内部的寄存器以及I/O管脚必须初始化。等到初始化完成以后,芯片才按照用户设计的功能正常工作,即进入用户模式。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" /> 在PS方式下,FPGA处于完全被动的地位,我们可以使用DCLK(配置时钟)、DATA0(配置数据)、nCONFIG(配置命令)、nSTATUS(状态信号)和CONF_DONE(配置完成指示)来完成配置过程。FPGA接收配置时钟、配置命令和配置数据,给出配置的状态信号以及配置完成指示信号,具体的PS配置时序图如下图4-10所示:
图1 PS配置时序图
nCONFIG:配置控制状态输入。低电平时使器件复位,由低到高上升沿跳变时FPGA启动配置程序。
nSTATUS:器件状态位输出。FPGA配置时先将此引脚拉低,然后在5μs内释放。nSTATUS经10k的电阻上拉,该信号拉低时表示配置过程中发生错误,需要重新配置。
CONF_DONF:器件状态位输出。双向漏极开路,在配置前和配置期间为状态输出,配置过程中FPGA将其拉低。所有配置数据无错误接收并且初始化时钟周期开始后,FPGA将其拉高,表示配置成功。
DCLK:配置时钟,一般为外部数据源提供的时钟。
DATA0:数据输入,在DATA0引脚上配置数据一位位输入FPGA。
整个配置周期由三种阶段组成:复位阶段、配置阶段和初始化阶段。
1.复位阶段:
当nSTATUS和nCONFIG被拉低时,FPGA处于复位模式。当nCONFIG拉高,nSTATUS也被释放后就表示FPGA随时接收来至于外部存储器的配置数据并开始配置阶段。
2.配置阶段:
在nSTATUS拉高后,外部处理器将配置数据一位一位逐一的送到DATA0脚上。当配置文件选择rbf、hex或者ttf格式时,数据首先发送最低有效位,例如:rbf文件包含字符串02 1B EE 01 FA,应该以0100-0000 1101-1000 0111-0111 1000-000 0101-1111的顺序发送数据。
FPGA在DCLK上升沿时接收来自于DATA0的配置数据。数据按时钟顺序配置到FPGA,直到CONF_DONE引脚被拉高。FPGA接收配置数据成功后,开漏极的CONF_DONE引脚被FPGA拉高。CONF_DONE的上升沿跳变表示配置结束,器件初始化阶段开始。
3.初始化阶段:
初始化时钟的默认时钟是内部时钟。如果使用内部时钟,器件可以给正确的初始化提供时钟周期,可以将配置文件完整的传入器件,保证器件配置和初始化正确。在初始化阶段并不需要提供额外的外部时钟周期。配置完成后驱动DCLK不要影响到器件工作。当完成初始化过程后,FPGA正式进入用户模式。
ARM配置FPGA的实现
设计中使用S3C2410来配置EP3C25,S3C2410核心板内存高达256M,工作频率达到203M,I/O资源丰富,完全适合配置FPGA的条件。下图2为使用ARM处理器配置FPGA的结构框图,被动串行配置的主要配置引脚有:nSTATUS、nCONFIG、DCLK、CONF_DONE和DATA0。
图2 使用ARM配置FPGA
依照上节所示的配置过程,ARM配置FPGA的操作流程图如下图3所示:
图3 ARM配置FPGA程序流程图
ARM配置FPGA的具体程序如下:
void ps_config(void)
{
U8 dat;
unsigned int i,j;
rGPECON = 0x55555555; //GPE全部设置为输出
rGPGCON = 0xff55579a; //GPG11为输出(nCONFIG).GPG5为输出(DLCK)
rGPGDAT=rGPGDAT&0xf7df; //nCONFIG拉低,DCLK拉低
rGPEDAT=rGPEDAT&0xfff2; //GPE0.2.3拉低(DATA0,CONF_DONE,nSTATUS)
delay1us(1);
rGPGDAT=rGPGDAT|0x800; //nCONFIG拉高
delay1us(50);
rGPEDAT=rGPEDAT|0x8; //nSTATUS拉高
delay1us(230);
for(i=0;i<(sizeof(fpga)/sizeof(U8));i++)
{
dat=fpga;
for(j=0;j<8;j++)
{
rGPGDAT=rGPGDAT|0x20; //GPG5为高(DCLK为高)
rGPEDAT=(rGPEDAT&0xfffe)|(dat&0x01);//发送配置数据
rGPGDAT=rGPGDAT&0xffdf; //GPG5为低(DCLK为低)
dat=dat>>1;
}
}
rGPEDAT=rGPEDAT|0x4; //CONF_DONE拉高
}
实验时将FPGA中的程序编写综合之后,使用quartus生成二进制的ttf文件,以数组的形式放到程序的头文件中。经过实验验证,ARM配置FPGA大约需要10s,如果希望在更短的时间内配置成功,可以使用并行被动配置,系统选用Cycloneiii代FPGA支持FPP配置(Fast Passive Parallel),唯一的区别就是数据发送由一位变为了八位。
文章评论(0条评论)
登录后参与讨论