基于FPGA的测量数据存储交换技术
现场可编程门阵列(FPGA)采用基于芯片的设计方法,具有稳定可靠、抗干扰能力强、可以反复编程、易于修改等特点,极大地增强了设计的灵活性,提高了设计的实现速度;大容量串行flash存储芯片价格低,管脚少,结构简单,使用SPI对数据进行访问,方便了硬件规划,增强了系统可靠性,减少了转换噪声,缩小了封装尺寸,也节省了大量的FPGA的I/O口。两者的有效结合可以使得大量数据的存储交换更加高效稳定可靠。
1 设计背景
在笔者的多通道工频场强环境监测仪项目中,需要在无人监控的情况下,长期定时采集高压架空线和变电站周围的电磁场强度及温湿度数据,并及时进行存储处理,随时供上位机通过UART访问分析。这必然涉及到大量测量数据的存储交换。本设计选用ALTRERA公司的Cyclone系列芯片EP1C3T144C8作为主控芯片,实现对数据的采集和交换,选用ATMEL公司的串行flash—AT45DB041B,用以对测量数据的存储。本文以实际项目为例,阐述利用FPGA和大容量串行flash存储芯片的优点,有效解决大量测量数据存储交换问题的方法。
2 芯片介绍
2.1 EP1C3T144C8
EP1C3T144C8采用了基于全层铜SRAM工艺,支持多种I/O标准,2 910个LEs,1个内部PLL,13个M4K RAM块,59 904个RAM位,104个可供使用的I/O。
2.2 AT45DB041B
2.2.1 基本原理
该存储器主要由主存储器和两个264B的缓存构成,主存储器容量约为4Mbit,分为2 048页,每页也为264B。
AT45DB041B具有多种封装形式,图1是SOIC-8封装下的管脚图。其各管脚的定义与功能如下:
1脚:SI,串行数据输入端;
2脚:SCK,串行时钟信号。数据在SCK上升沿输入,下降沿输出;
3脚:复位信号,低电平有效。由于芯片内部有上电复位电路,不用时此管脚可直接接高电平;
4脚:片选信号,低电平有效;
5脚:写保护信号,低电平有效。若此脚为低,则主存储区前256页不能被擦写编程,如果不用此功能,可直接接高电平;
6脚:VCC,电源输入端;
7脚:GND,电源地;
8脚:SO,串行数据输出端。
2.2.2 器件操作
AT45DB041B的操作命令分为读命令、编程和擦写命令以及附加命令,其具体的指令和读写操作方式很多文章和资料已有介绍,限于篇幅,本文只将要用到的命令作简要的介绍。
(1)读主存储区
不经过缓冲区读主存储区任一页,缓冲区内容不会改变。指令格式后续的SCK信号将使数据依次从SO端输出。如果读到了指定页的最后字节,将自动跳回到页首起始位置,循环读取。整个过程中,/CS必须保持为低电平,/CS从低到高的跳变将中止读操作,并三态SO引脚。
(2)连续读主存储区
不经过缓冲区直接读任意存储单元的内容,缓冲区内容也不会改变。指令格式后续的SCK时钟信号将使数据依次从SO端输出。如果读到了整个主存储区的最后字节,将自动跳回主存储区起始位置,循环读取,页与页之间及主存储区首尾之间没有延时。整个过程中,/CS必须保持为低电平,/CS从低到高的跳变将中止读操作,并三态SO引脚。
(3)写缓冲区
数据能够通过SI端被写入任意一个缓冲区。当写到缓冲区结尾后仍有数据写入时,数据将从缓冲区起始字节依次写入。只要/CS保持为低,在SCK时钟信号配合下,数据将一直循环写入,/CS从低到高的跳变将中止写操作。
(4)缓冲区写入主存储页(带擦除)
事先写入缓冲区的数据可通过编程写到主存储页中。当指令写完后,/CS由0变为1时,芯片首先擦除待写入页,然后再将指定缓冲区内的数据写入主存储页。页擦除和写入操作由内置时钟控制,最长时间为tEP。
2.2.3 时序
AT45DB041B的命令、地址、附加位和数据都是通过SI、SO引脚以位的形式输入和输出的,因此要采用FPGA产生读写时序时除正确理解其操作过程外,另一个关键点在于正确理解位的发送和接收时序,也就是数据如何按位移入或移出AT45DB041B。工作于SPI的inactive clock polarity high模式的时序如图2所示。
3 实际应用
3.1 硬件接线
硬件电路如图3所示。EP1C3T144C8的I/O和AT45DB041B的SI、SO、SCK、/RST、/CS引脚相连,/WP接高电平,实现对串行flash的读写操作;再由TXD、RXD通过MAX232和9芯串口与上位机实现UART通信,完成数据的交换工作。
3.2 软件设计
一般的串行flash存储芯片提供了许多操作命令,可以根据不同的设计目的选择不同的操作命令组合,实现对串行flash存储芯片的不同操作,满足不同的设计要求。
在本设计中,要定时地采集高压架空线和变电站周围的电磁场强度及温湿度数据,每次12个字节,并进行及时的存储处理,随时供上位机通过UART读取。
在Quartus II中用VHDL编写FPGA与AT45DB041B的接口程序,其程序框图如图4所示。
写操作使用了写缓冲区和缓冲区写入主存储页(带擦除)两个命令。写信号到时将规定写入的数据写入缓冲区后,立即将缓冲区写入主存储页;写完之后,再将当前的位置信息(主存储区页地址和页内行地址)通过缓冲区写到主存储区的最后一页,供每次程序启动时读取来恢复存储器的状态,之后就进入idle状态。
读操作使用了读主存储区和连续读主存储区命令。读存储区是为了恢复每次写入的位置信息,以便在程序复位后继续接着写入数据或读取数据;读信号到即发送连续读主存储区命令,每读完一个字节便通过串口发送到上位机,接到串口发送完当前字节信号后,再继续读下一字节。当读完写操作时记录的主存储区当前页或上位机给出发送出错信号时,结束读操作。
程序的实现采用了VHDL中的状态机(state machine),它是描述一系列状态转换的时序电路,它能够很好地完成本设计中各状态的条件的判断和转换。在程序设计过程中要特别注意几个问题:
(1)程序刚启动时的延时:这是为了使芯片工作在inactive clock polarity high模式,保证芯片的正常运行;
(2)读过程中的延时:由于对flash访问的时钟(AT45DB041B可达20MHz)和用于UART发送的波特率(本设计中为9 600b/s)速度不匹配,而如果不作延时处理,直接给一个周期的UART发送使能,发送模块就可能在自身时钟的边沿捕捉不到发送使能信号,为了保证正常发送,必须对发送使能信号进行延时;
(3)写过程中的延时:由于擦除主存储区并将缓冲区写入所需的最长时间为tEP,为了确保每次都将数据成功写入,必须延时一段时间tEP再转入其他状态。
VHDL实现的基于RS232标准的UART简单稳定可靠,有很多文献资料可供参考,这里不再赘述。
本文采用FPGA结合VHDL编程来模拟SPI接口时序的方法实现了对大容量串行存储器的访问,在UART的配合下完成了对大量测量数据的存储交换工作,并在笔者设计的仪表中成功地应用,运行稳定可靠高效。这里虽然是以ATMEL公司的AT45DB041B为例,但使用相同的方法,对一系列其他类型的串行存储芯片如Megawin公司的flash存储器MM36SBO10等,也可以进行类似的操作,对以后解决此类问题具有一定的参考价值。
评论