《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 业界动态 > 基于FPGA的数据采集分析系统设计

基于FPGA的数据采集分析系统设计

2009-06-10
作者:肖祖胜,程 明

    摘  要: FPGA是一种高密度逻辑器件。与通用的MCU相比, FPGA具有并行数据处理特性。利用该特性,能够实现对高速A/D采样控制;同样, 使用FPGA对采样数据进行频谱分析,能够达到比DSP芯片更高的数据处理速度。 

    关键词: 采样;MCU;FPGA

 

    在计算机控制系统中,常常需要采集各种模拟量信号,并对它们进行模数转换,将外部输入的模拟信号转换成数字信号,以便计算机进行加工处理。在很多情况下,计算机应用系统中常用普通MCU(如51系列单片机或控制型DSP)完成系统任务。由于MCU一般均采用指令处理结构,要想达到高的处理速度相当困难,一般速率不会超过MHz级。而FPGA具有高速并行处理的特性,采用FPGA控制数据采集可以达到很高的采样速率。 

    数字信号处理的方式一般有两种:一种是使用单片机或DSP等MCU,通过软件编程实现;另外一种是利用专用逻辑电路或可编程逻辑器件实现。用软件编程来实现,虽然有很大的灵活性,但受DSP或单片机性能及程序指令顺序执行的限制,难以实现高速、大规模运算;而专用集成电路芯片或FPGA却可以实现很高的运算速度,非常适合高速信号处理系统的应用。 

    鉴于此,可以采用FPGA来完成一个模拟信号的采集分析系统。现在用FPGA做信号处理使用的大多是比较高端的片子,价格都比较贵,像ALTERA的Stratix系列、XILINIX的Virtex系列等。考虑到成本,在本设计中尝试使用ALTERA的低端FPGA来完成设计。 

    尽管ALTERA提供了很多关于数字信号处理的IPCORE,但使用是需要收费的,而且费用较高。通过自己编程实现信号处理可以节省大量的成本,本设计就是采用这一方法。 

1 器件选择 

    采用的FPGA是ALTERA的EP1C6T144C8,EP1C6T144C8有144个引脚,最多可使用98个I/O口,支持JTAG调试,AS、PS下载,内有5 980个LES,总的RAM位数是92 160 bit,内嵌有两个锁相环,四个全局时钟,内核电压为1.5 V,输出I/O口驱动电压为3.3 V,支持LVDS、TTL、CMOS等电平传输。采用的配置芯片为EPCS1。这是一款低端的FPGA芯片,具有较高的性价比。 

    A/D采样芯片是TLC5510,这是一款高速A/D采样芯片,它是一种采用CMOS工艺制造的8位高阻抗并行A/D芯片,能提供的最大采样率为20 MS/s。由于TLC5510采用了半闪速结构及CMOS工艺,因而大大减少了器件中比较器的数量,而且在高速转换的同时能够保持较低的功耗。 

2 FPGA内部电路 

    FPGA内部电路分为两大模块。 

    (1)采样控制:TLC5510的采样控制引脚只有两个,一个是时钟端CLOCK,一个是输出使能端(低电有效)。根据TLC5510采样控制的时序电路,芯片CLOCLK的下降沿采样,经过2.5个周期的延迟后,得到采样结果,这时如果使能端有效,则数据送到输出端,所以控制起来比较简单。但是要注意的是采样时钟和FFT时钟之间的匹配。 

    根据TLC5510的采样时序特点,在设计采样控制模块时可以只控制采样时钟,而输出始终使能,就能够完成采样控制。 

    控制FPGA内部RAM的写入时钟,当完成一次采样后,将TLC5510数据端的数据取走,这样就完成了采样到写入的过程。 

    分频模块将时钟分到和系统时序相适合的时钟。采样控制电路将采样结果由八位变为十六位,存入RAM中。 

    (2)FFT模块:设计中的FFT模块实现的是256点的定点FFT运算,采用基-2频率抽选法,图1为8位算法的流程示意图,256点算法与其类似。 

 

 

    FFT模块主要包括四个单元:蝶形变换单元,地址发生单元,RAM块选择单元(其中包括旋转因子表),时钟控制单元。图2为整体电路结构。 

 

 

    ①蝶形变换单元:在蝶形变换电路中,最为核心的就是乘法器和加法器,可以通过对QUARTUS的宏单元的调用,实现乘法运算,也可以自己编写乘法器,利用Verilog的for语句实现16×16无符号乘法器的部分原码如下: 

    always@(data1,data2) 

      begin 

      data_out=32′d0;//初始赋0 

    for(a=5′d0;a<=5′d15;a=a+5′d1) 

        if(data2[a]==1) 

        data_out=data_out+(data1<

      end 

    蝶形变换的输出写入RAM作为下一级变换的输入。 

    图3为蝶形变换单元电路。 

 

 

图3  蝶形变换单元电路图

 

    ②地址发生单元:这个单元的编写具有一定的灵活性,在编程过程中采用的编写方法不同,综合出来的电路使用寄存器数量也不一样。地址发生单元总共有八级地址。第二级地址发生单元的部分原码如下(图4为第二级地址发生单元仿真结果): 

 

 

    always@(posedge clk) 

    begin 

      if(a3==1′d1) 

        begin 

          a3=1′d0;//参数a3控制RAM数据和旋转因子表数据时序配合 

          case(a2)//地址分为两大块块,分别为前后128个数,参数a2控制这两块的启动 

          1′d0:begin 

            if(a1==8′d63) 

            begin a1=8′d128;a2=a2+1′d1;addr1=a1;addr2=7′d0;end 

            else 

              begin a1=a1+8′d1;addr1=a1;addr2=addr2+7′d2;end 

            end 

          1′d1:begin 

            if(a1==8′d191) 

              begin a1=8′d0;a2=1′d0;addr1=8′d0;addr2=7′d0;end 

              else 

              begin a1=a1+8′d1;addr1=a1;addr2=addr2+7′d2;end 

            end 

          endcase 

          end 

    else 

      begin a3=a3+1′d1;addr1=addr1+8′d64;end 

    end 

    ③RAM块选择单元:FPGA上含有4KB RAM块,可以使用三组RAM块实现流水线(这里命名为RAM1,RAM2,RAM3)。时序开始时控制单元将采样结果写入RAM1,FFT单元运算RAM2中数据,输出控制单元将上一次的FFT运算结果输出。当整个电路完成一次采集分析后,启动RAM选择模块,三组RAM的控制单元进行轮换,采样电路将采样结果写入RAM3,FFT运算电路则使用RAM1,对采样数据进行运算,而数据输出电路控制RAM2将FFT的结果输出。如此往复循环,实现流水线作业。下面是其中RAM选择单元的部分代码: 

    always@(posedge f or posedge star)//f上升沿表示一次FFT完成 

      begin//开始启动信号和FFT完成信号共同控制选择转换参数 

        if(star) 

        a2=2′d1; 

      else 

        if(a2==2′d2) 

        a2=2′d0; 

      else 

        a2=a2+2′d1; 

      end 

    //下为控制转换参数控制选择 

assign data_out1=(a2==2′d0)?data1:((a2==2′d1)?17′d0:((a2==2′d2)?data3:17′d0)); 

assign data_out2=(a2==2′d0)?17′d0:((a2==2′d1)?data3:((a2==2′d2)?data1:17′d0)); 

assign data_out3=(a2==2′'d0)?data3:((a2==2′d1)?data1:((a2==2′d2)?17′d0:17′d0)); 

assign q_out1=(a2==2′d0)?q1:((a2==2′d1)?q3:((a2==2′d2)?q2:17′d0)); 

assign q_out2=(a2==2′d0)?q2:((a2==2′d1)?q1:((a2==2′d2)?q3:17′d0)); 

    ④时钟控制单元:这个单元主要是一些时钟分频电路,控制整个电路的时序,不同模块单元之间启动的时序不一样,时钟频率也不相同。在编写时钟控制单元时,最主要是实现各模块时序配合,以防止出现竞争冒险。 

    除了上述几个主要的模块单元外,还需要生成一个旋转因子表。旋转因子表可以有多种生成方法,考虑到芯片资源,本设计选择使用MATLAB生成旋转因子表,通过调用兆函数,将生成的旋转因子表固化到FPGA的ROM中。 

    当整个FFT模块数据处理完之后,就可以逆序输出。 

    设计完成后,可以在RAM块中初始化数据得到仿真结果,对设计进行初步检验,图4(b)是在RAM中初始化一个数据表后的FFT模块仿真结果(q1实部,q2虚部)。 

    图5为MATLAB仿真,与QUARTUS仿真结果相比较,可以看到结果吻合地相当好。 

 

 

3 速度分析 

    系统采用单乘法器结构,使用锁相环倍频时钟作为总时钟输出,当总时钟为200 MHz时,完成一次FFT处理的时间为21.4 μs,4 278个时钟信号,在流水线作业下,可以完成A/D采样速率高达12 MHz的数据处理。 

    本设计使用芯片逻辑资源的的77%,近4 600个逻辑单元,还使用了约39 000 bit的RAM。实验证明,用低端的FPGA产品实现高速采样控制和FFT处理是可行的。在实现过程中只要采用较好的设计思路,控制好寄存器的数目,便可以在芯片允许的资源范围内达到所需要的信号处理目的,实现设计要求。 

参考文献 

[1] 吴继华.Altera FPGA/CPLD设计(高级篇).北京:人民邮电出版社,2005. 

[2] 程佩青.数字信号处理教程[M].北京:清华大学出版社,2001. 

[3] 夏宇闻.Verilog数字系统设计教程.北京:北京航空航天大学出版社,2003.

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。