在电气测控系统中,常常需要采集各种模拟量信号、数字量信号,并对它们进行相应的处理。一般情况下,测控系统中用普通MCU(如51、196等单片机或控制型DSP)是可以完成系统任务的。但当系统中要采集的信号量特别多时(特别是各种信号量、状态量),仅仅靠用普通MCU的资源就往往难以完成任务。此时,一般只能采取多MCU联机处理模式,或者靠其它芯片扩展系统资源来完成系统的监测任务。这样做不仅增加了大量的外部电路和系统成本,而且大大增加了系统的复杂性,因而系统的可靠性就会受一定的影响,这显然不是设计者所愿意看到的。本文所提出的一种基于FPGA技术的模拟量、数字量采集与处理系统,利用FPGA的I/O端口多,且可以自由编程支配、定义其功能的特点,配以VHDL编写的FPGA内部执行软件,能很好地解决采集的信号路数多的问题。因为用VHDL编写的执行软件内部对各组数字量是按并行处理的,而且FPGA硬件的速度是ns级的,这是当前任何MCU都难以达到的速度,因此本系统比其它系统更能实时地、快速地监测信号量的变化。所以在状态量特别多的监测系统中,本系统将更能发挥出自身的优势。
本系统中的外围电路设计相对简单、可靠,且鉴于FPGA和VHDL语言自身的特点,系统具有较好的扩展性,在监测和控制系统中也具有一定的通用性。系统主要包括:FPGA芯片区、多路选择与A/D采样电路、交流信号调理电路、光耦隔离驱动电路、时钟电源区、PROM代码下载电路等几部分。结构示意如图1所示。
图1 基于FPGA技术的多路模拟量、数字量采集与处理系统框图
1 FPGA芯片特点分析及资源分配
本系统中的FPGA是采用Xilinx公司的Spantan-II系理XC2S100-5 PQ208。该系列的内核采用2.5V供电,工作频率最高可达200 MHz;I/O端口供电电压为3.3V,可以承受5V的输入高电平。
Spartan-II系列具有丰富的I/O口资源,I/O口输出缓冲器呆以接收高达24mA的拉电流和48mA的灌电流。缺省时,I/O输出口的驱动能力的12mA,也可以设置成2、4、6、8、16或24mA。
FPGA内部资源划分为四大部分,如图2所示。
①FPGA逻辑运算中心。用来接收其它各部分的数据,并按照程序中设定的方案对所收到的数据进行相应的分析和处理。包括:对从MCU接收来的数据指令进行分析,并按其指令要求进行相应操作;接收A/D采样来的数据,对数据进行各种处理,如求其有效值,进行FFT分析等;接收来自数字量的各种信息数据,按设定的模式对其进行判断处理,并负责按接收的CPU指令输出相应的数字量。
②A/D控制单元。主要负责控制外部A/D芯片和多路开关的选通时序,以及实现对A/D采要过程的合理控制。因为,在FPGA芯片内部,不像在MCU内部那样有丰富的外设控制资源供用户使用,要用FPGA来控制A/D采样过程的动作,必须用软件来模拟实现各种A/D控制资源。利用这些自设定的A/D控制管理资源,配以合理的软件控制时序,才能保证采样过程的顺利进行。
③数字量监测控制单元。负责所有要监视和控制的数字量的状态数据的采集和控制命令的输出。这一部分同样也需要用软件来模拟实现各种对数字量的管理控制,只有配备较完备的外设控制管理单元,整个数字量的管理控制才能正确合理地进行。
④FPGA接口逻辑控制单元。在FPGA内部设计了FPGA模块与外界MCU的接口单元,这虽然占去了一定的内部资源,但是考虑到在一般的工程系统中不仅仅包括对各种信息的采集控制,还往往包括通信、显示以及进行一些复杂算术运行等等。FPGA虽然有其显著的长处,但是在这些方面实现起来就往往不如普通MCU来得容易,因此考虑到本系统的通用性,在设计上增加了FPGA模块与外界MCU的接口单元。
2 交流模拟量采集的控制与管理
在交流模拟量采集外围电路中,A/D芯片采用的是BB公司的ADS774。多路交流量是通过4051的多路开关后输入到ADS774芯片的。交流信号在进入ADS774之前要经过信号调量电路,调理成ADS774认可的模拟信号。
FPGA实现的交流量采样处理控制软件由五部分组成:
第一部分为设定的3个与A/D采样有关的16位指令寄存器组:A/D参数寄存器(ADPR)、输出控制寄存器(ADOR)、A/D控制寄存器(ADCR)。
ADPR(XXXXXXXXX XXXXX XX)的各位定义如下:位1、位0选择每周波采样的点数(00表示每周波采16个点,01表示每周波采32个点,10表示每周波采64个点,11表示每周波采128个点)。位6~位2用来表示FPGA的时钟频率,00001表示时钟频率为1MHz,11111表示时钟频率为31MHz,00000表示时钟频率为32MHz。位15~位7表示所采样信号的频率,这9位表示的范围为1Hz~512Hz。
ADOR是与FPGA输出有关的寄存器。该寄存器的作用是:当MCU要读取某通道信号的信息时,FPGA应该输出该信号的哪次谐波电压。如为FFFFH,表示DSP读到的是该通道信号的有效值;如果ADOR的值为0010H,那么,DSP读到的是该通道信号的2次谐波电压。
ADCR寄存器控制A/D采样的通道数的选择以及与A/D采样有关的寄存器的复位控制等,这也是考虑到系统的通用性而设计的:如000C表示采样第11路交流模拟量电压;0011则表示同时采样前六路信号等等。
第二部分为设计产生A/D与CD4051芯片的控制信号。如在图2中,在采样12路交流模拟量的情况下,FPGA需要产生7路控制信号,这7路控制信号应该满足一定的时序要求。图3给出了同时采样前六路信号时FPGA的控制信号时序。
Abcs2[0,1,2]总线信号实际上是多路开关通道选择的3个控制信号selA、selB、selC。需要说明的是,因为要进行修正,在对6路交流信号采样的同时,也对4051的+5V和AGND进行了采样,所以实际上测量的通道数为8路。
从图3可看出,abcs2[0,1,2]总线信号每19.531 25μs加1,每156.25μs重新循环一次,满足8路交流同步采样的要求。
从25μs时刻的局部放大图可以看出,当(23.6μs时刻)4051选择通道1时,ADS774的CS和R/C信号同时为低,延时0.5μs左右CE端出现上升沿(24.1μs),启动A/D转换,这符合ADS774的A/D转换时序。需要指出,如果CE端直接接高电平,那么,R/C的下降沿将直接启动A/D转换。之所以用两个信号来启动A/D转换,是为了减少A/D的误触发。考虑到4051的导通延时,所以在通道切换0,5μs后才启动A/D转换。图3中没有画出4051的INH信号,在采样前6路交流信号时,该信号一直为低。如果同时采样12路信号,那么,abcs2[0,1,2]总线信号每9.765 625μs加1,每78.125μs重新循环1次;INH信号每78.125μs电平变化1次,用来选择哪个4051导通。
第三部分为A/D输入数据缓冲区和数字滤波模块。A/D转换完成后,ADS774的引脚STS给FPGA输出转换完成信号(低电平)。FPGA接收这一信号后,将产生读ADS774的时序,把12位的A/D转换数据读入到数据缓冲区的二维数组datain(abcv)(sampn)中。Abcv为通道号,sampn表示周波信号中所采样的第几个点。将一个周期的12路信号采样完后,置标志ADFLAG为1,进行数据的滤波处理。首先,对datain(abcv)(sampn)的值进行修正;给定sampn,对前6路信号来说,datain(7)(sampn)存储的是AGND的A/D转换值,将datain(i)(sampn)减去datain(7)(sampn)的值存储在datamid(i)(sampn)中(i=1,…,6)。与此类似,后六路的采样值datain(i)(sampn)减去datain(15)(sampn)的值存储在datamid(i)(sampn)(i=8,…,14)。然后,给定abcv,对datamid(abcv)(j)(j=0,…,15)这16个点的数据进行FIR滤波,将FIR滤波后的数据存储在datamd(abcv)(sampn)数组中。
第四部分是均方根有效值计量和FFT谐波分析模块。输入的数据经过处理后,首先进行均方根有效值的计算。给定abcv,先求出datamd(abcv)(j)(j=0,…,15)这16个点的平方和,将其存储到datarsult(abcv)中。为了防止溢出,dataresult(abcv)定义28位的位矢量。然后把dataresult(abcv)中的数据进行平方的运算,结果存储在douts(i)中。开平方是利用函数sqt(a:std_logic_vector;b:integer)return std_logic_vector来实现的。a为要开方的全矢量数据;整数b用来定义输出位矢量的长度。该函数被封装成一个包(package),符合自顶向下(TopDown)的HDL语言设计思想。douts(i)是信号量,由赋值语句douts(i)<=sqt(dataresult (i);16)(i=0,…,15)可以分别求出12路信号的有效值。电压有效值和谐波分析完成以后,清ADFLAG为0。
第五部分为输出缓冲器单元。当DSP对FPGA产生读时序(FPGACS为低电平且RD下降沿来到时),FPGA根据DSP的低五位地址线A0~A4的值(对应于FPGA的chansel:std_logic_vector(4 downto 0)信号量),以及ADOR寄存器中的值,将相应的数据送到数据总线上。比如,若chansel为(00010)2,ADOR中的值为FFFFH,那么,FPGA就会将通道2的有效值douts(2送到数据总线上。
图3 FPGA的A/D控制信号时序图
3 对数字量的控制与管理
在图2系统中,假定要对16个负载进行管理,每个负载包括1个控制输出量和2个状态返回量,因此共有16路的数字量输出,32路的数字量输入。
FPGA对数字量的管理软件结构:
FPGA对数字量的控制管理也设置了三个16位的指令寄存器组。这三个指令寄存器的内部地址为03H、04H和05H.03H为开关量输出允许寄存器(KGER);04H为跳闸闭合寄存器(KGCR);05H为开关量开闭寄存器(KGIR)。
来自负载的总共32个状态反馈信号(DIN00、DIN01……DIN31)分成16组,分别接到FPGA的16个信号量dini上(i=1,2,…,15)。dini是长度为2的位矢量std_logic_vector(1 downto 0),分别对应于1个负载的两个状态反馈位。FPGA用16个进程process(din1)、process(din1)……process(din15)来对输入数字量敏感。当dini的载位电平发生变化时,进程启动,FPGA结合MCU发送的控制指令,判断负载的状态,并记录在输出数据缓冲区中。输出数据缓冲区包括16个数据存储器,这16个数据存储器在FPGA内部的地址从(10000)2到(11111)2。(100000)2单元存储的是第1个负载的状态,以此类推,(10000)2单元存储的是第16个负载的状态。每个16位数据存储器的8位固定为5AH,接下来的5位为(00000)2,只有最后3位才是负载的状态位。
当MCU读FPGA时,process(rd)进程启动。这时,如果MCU地址线A4的电平(对应于FPGA的chansel:std_logic_vector(4 downto 0)信号量的第四位)为“1”,FPGA就根据chanse1(3 downto 0)的值,将对应的数据存储器的值发送到数据总线上。MCU读回数据存储器的值后,如果前13位不是(0101101000000)2,说明产生了读错误,MCU重新再读一次。必须指出,在FPGA控制A/D采样时,读哪个通道信息也是通过A0~A3地址线区分的,但是,A4的电平为低。
MCU根据系统处于不同的状态给负载发送接通/断开指令,这是通过写FPGA的寄存器KGIR实现的。KGIR的16位依次代表16个负载,“1”为接通,“0”为断开,复位值是0000H.寄存器KGER是数字量输出的总开关,复位后为0000H,不允许数字量输出;MCU对其写入FFFFH后,允许数字量输出。FPGA给负载发去接通/断开指令后,负载将会有两个状态信号返回。FPGA结合寄存器KGIR的控制指令值,可以判定负载处于何种状态之一。如果反馈的信息为跳闸,FPGA将根据寄存器KGCR的值作出相应的处理。如果为其它信息,FPGA将不做处理,只是将状态信息存储在数据缓冲区中等待发送给权限高的MCU来决定。KGCR的复全值是0001H,表示跳闸发生后,FPGA将自动再发一次接通指令。程序运行的过程中,MCU根据任务的紧急和系统的布局,可以修改KGCR的值。如果KGCR的值为0003H,表示第一次跳闸发生后,FPGA可以重复发三次接通指令。
因为FPGA是基于RAM工艺的,在掉电后本身不能保存信息,因此需要一个外置存储芯片来保存其信息,这里采用一次可编程的PROM:XC17S100APD8I(OTP)。该PROM与Spartan-II芯片的接口只需要一个I/O;复位引脚的极性可编程(高有效或低有效);供电电压为3.3V。
XC17S100A的DONE、INIT、CCLK信号来自FPGA芯片XC2S100。系统刚一上电,FPGA首先初始化,置INIT、DONE为低。INIT为低后复位PROM,此时由于PROM的CE为低,因此PROM被选中,从而将数据流从DATA脚输入到FPGA的DIN脚。配置完成后,FPGA将DONE接高,PROM处于低功耗的待机模式,并将DATA脚置为高阻态。
在硬件调试和在线修改过程中,选用FPGA的CCLK、DONE、DIN、PROG引脚用做硬件调试编程。将下载电缆接在计算机并口上,选择恰当的下载方式就会将Xilinx开发软件生成的位流文件下载到FPGA的内部配置存储器中。配置下载流程可以分为3个阶段:初始化、清除配置内存、下载数据。清除内存在所有配置模式中都是一样的,下载数据却随着配置方式的不同而不同。
实际应用中,一般都需要将数据流文件烧入到Xilinx PROM中,每次上电伊始,由PROM将数据流下载到FPGA中,下载完毕,FPGA开始工作。
4 结论
针对监测系统监测信号一般较多的特点,本文提出了一种基于FPGA技术的多路模拟量、数字量采集与处理系统,设计了相应的外围硬件电路和系统处理软件。在仿真和综合调试成功的基础上,本系统成功用于某航空重点预研项目的电气负载管理系统试验中。试验结果表明,本系统成功地完成了对多路模拟量、数字量的采集处理任务,因此,在电气测控系统中有较好的应用前景。