摘要:主要讨论了FPGA在多单片机串行读数系统中的应用,在该系统中单片机通过异步串行通信读取外部设备中的数据,经FPGA缓冲后再送到USB单片机,终上传到计算机。文中重点介绍了利用FPGA内部双口RAM构建的FIFO在该系统中的具体应用以及FPGA如何协调各单片机的工作。
O 引言
本文所设计的读数系统主要为解决上传数据慢的问题,具体的背景如下:目前已设计一小型弹载记录器,采用单片机+FLASH的结构,FLASH容量为lGB,为了限度地减少记录器的外部接口数据线的数量,采用异步串行通信方式上报数据。单片机选用了Silabs公司混成集成芯片C8051F060,该单片机UARTl波特率可以达到系统时钟的一半,也即如果晶体振荡器采用14MHz,那么波特率理论值可以达到7Mbps,有效数据传输速率可达700kbps,但由于记录器需要从FLASH读取数据,而每读出一页的数据需要等待约20us的时间,所以上传数据为非连续性的传输,经实际测试发现,波特率为7Mbps时实际的数据上传速率仅为300kbps左右,如果上传1GB的数据就需要至少56分钟的时间,如果需要上传数套记录器数据的时候,就显得尤为浪费时间。为了解决这个问题,本文设计了一个读数系统,该系统通过增加每次上传的记录器的数量来提高读数系统的资源利用率,以5套记录器同时上传来计算,56分钟内可以上传5GB的数据,平均每套的上传时问仅为12分钟,提高了数据上传效率。系统框图见图1。
其中USB接口控制器选用CYPRESS公司的CY7C68013A,该芯片是Cypress公司推出的新一代高速EZ—USB FX2系列芯片;单片机部分选用C8051F060芯片;主控FPGA选用XILINX公司SPARTAN—IIE系列芯片XC2S100E一PQ208。
FPGA作为主控制中心,主要负责接收68013发送的状态指令,并将状态下发到各单片机及相应的外部设备,五个单片机分别负责通过串口接收外部设备的串行数据,并将其并行写入FPGA,68013除了从FPGA中读取数据外,还需要将计算机下发的控制命令发送到FPGA。
1 FPGA内部FIF0设计
由于本项目所用FPGA芯片内部RAM共有40Kbit,所以可构成1KB×5的FIF0结构,即可构成5个深度分别为1KB的FIFO,分别作为5个单片机上传时的数据缓冲,具体逻辑框图见图2。CPU模块主要负责五个FIF0之间的切换,5个FIFO采用相同的结构,限于篇幅,本文不详细介绍FIF0的具体设计,只给出5个FIF0与CPU模块之间的逻辑关系。5个FIFO分别给出两个状态信号,一个是OK,该信号表示FIFO已经准备好数据,可以进行读取操作,另一个信号为Req,该信号通知单片机该FIFO已经几乎空,可以向该FIF0写入数据,其中几个关键信号的具体用途如下表1所示:
2 FIF0切换
GPIF接口是EZ—USB FX2系列单片机提供的一个可由用户编程的接口,具有高速、灵活等特点,可方便地实现与各种外设之间的无缝连接。GPIF的是一个可编程的状态机,通过对其进行编程可以实现多种协议,功能非常强大。
本设计中68013与FPGA之间的接口即采用GPIF模式,基本的运行模式为:68013每启动GPIF读波形,便从FPGA中读取512个字节的数据,然后FPGA自动切换FIFO号。在程序设计时可以在GPIF中断函数中设置一个标志,这样CPU模块在检测到这个标志后表明对该FIF0的操作已完成,应该切换FIF0了,该标志信号使用PA4引脚来发出,具体说明见见表1。
5个FIFO的具体操作如下:系统上电后先复位各FIFO,并使各FIFO处于关闭状态,然后判断是否为读状态,如果不是则循环判断,如果为读状态,则使能各FIFO;由于默认操作在FIF0l,所以判断FIF01的0K信号是有效,如果有效,则判断PA4引脚是否为‘0’,如果为‘0’则置RDYO为l,68013判断到此信号后启动GPIF波形读取512字节的数据,并在读完后将PA4置1,表示数据已经读取完毕,CPU模块在判断到PA4为1后将RDYO置O,然后将操作对象切换至FIF02,接着判断FIF02的OK信号是否有效,具体操作同FIF01,具体流程见图3。
注意:为了保证数据读取时的畅通无阻,在判断四个FIF0的OK信号时,应该采取轮循的判断方式,即当FIF01 的OK信号无效时应该转去判断FIF02的0K信号,而不能死等FIF01的0K信号有效,这样可以有效防止因某个单片机或某个外部设备的故障而出现的读数停滞现象。
3 结束语
经过长时间的工作表明,该读数系统能稳定地进行数据的上传,满足实际需要。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。