highspeedlogic算法仿真---数字滤波技术

数字滤波器是输入数字序列变为输出数字序列的数字信号处理器,是语音与图形处理,模式识别和谱分析等应用中的一种基本的处理部件。如上文所说,数字处理具有灵活性强,精度高,处理成本低以及对环境没有特殊要求等特点,它不仅能完成模拟处理的大部分功能,满足滤波器对幅度和相位特性的严格要求,而且还能避免模拟滤波器所无法克服的电压漂移,温度漂移和噪声等问题,模拟处理由于成本可靠性等原因而无法实现的功能。

数字滤波是数字信号处理理论的一部分。数字信号处理主要是研究用数字或符号的序列来表示信号波形,并用数字的方式去处理这些序列,把它们改变成在某种意义上更为有希望的形式,以便估计信号的特征参量,或削弱信号中多余分量和增强信号中的有用分量。具体来说,凡是用数字方式对信号进行滤波、变换、调制、解调、均衡、增强、压缩、估计、识别、产生等加工处理,都可以纳入数字信号处理领域[2]。

13  FPGA芯片

本设计采用Altera公司的FLEX10K系列的器件对IIR滤波器进行设计,具体采用EPF10K10LC84芯片,同时Altera提供的EPC1和EPC2是供器件配置用的EPROM(简称配置EPROM)它们是通过串行数据流来配置FLEX10K器件的。配置数据也可以从系统RAM或者通过Altera的BitBlaster下载电缆下载进来。FLEX10K器件配置好后,通过复位可以进行在线重新配置,装入新的数据[4]。

功能介绍,FLEX10K系列主要由嵌入式阵列块、逻辑阵列块、FastTrack和I/O单元四部分组成。采用PLCC的封装。其结构方框图如1.2所示。

  1. 嵌入阵列

    嵌入式阵列块是由一系列的EAB构成的,当要实现有关存储器功能时,每个EAB提供2048位用来构造RAM、ROM、FIFO、和双端RAM等功能。当EAB原来实现乘法器、委控制器和状态机以及DSP等复杂逻辑时,每个EAB贡献100到600个门。它既可以单独使用又可以组合使用。

  1. 逻辑阵列

    列是由一系列的逻辑阵列块(LAB)构成的。每个LAB包括8个LE和一些连接线,每个LE含有一个4输入查找表(LUT)、一个编程触发器、进位链、和级联链,LE的结构能有效的实现各种逻辑。

 

                 图1.2 FLEX10K器件的结构方框图

  1. 快速通道(Fast Track)

FLEX10K器件内部信号的互联和器件引脚之间的信号互联是由快速通道(Fast Track)连线提供的,它时贯穿器件长、宽快速联系通道。

  1. I/O单元

FLEX10K器件的I/O引脚是由一些IO单元(IOE)驱动的。IOE位于快速通道的行与列的末端,每个IOE有一个双向I/O缓冲器和一个既可以做输入寄存器又可以做输出寄存器的触发器。当IOE作为专业时钟引脚时,这些寄存器提供特殊的功能。

FPGA(现场可编程门阵列)是可编程逻辑器件,它们是在PLA,GAL等逻辑器件的基础上发展起来的。同以往的PAL,GAL比较,FPGA的规模比较大,它可以替代几十甚至几千块通用IC芯片。这样的FPGA实际上是子系统部件。这种部件受到世界范围内电子工程设计人员的广泛关注和普遍欢迎[12]。

随着VLSI(Very Large Scale IC,超大规模集成电路)工艺的不断提高,单一芯片内部可以容纳上百万个晶体管,FPGA芯片的规模也越来越大,其单片逻辑门数已经达到上百万门,它所能实现的功能也越来越强,同时也可以实现系统集成。FPGA芯片在出厂之前都做过百分之百的测试,不需要技术人员承担投片风险和费用,设计人员只需在自己的实验室里就可以通过相关的软硬件环境来完成芯片的最终功能设计。所以FPGA的资金投入少,节省了许多潜在的花费[8]。用户可以反复的编程、擦除。使用或者在外围电路不动的情况下用不同软件就可以实现不同的功能。所以,用FPGA使试验、制作样片,能以最快的速度占领市场。

综合上诉内容,数字滤波器灵活性强,精度高,本课题将讨论符合设计要求的IIR数字滤波器的实现结构,以及合适的设计方法和算法,充分利用FPGA的大规模,高速度和可编程的优点,让FPGA工作在它最高时钟频率,发挥它的最大效能[13]。

1.4  VHDL简介

1.4.1简介

VHDL是VHSIC(Very High Speed Integrated Circuit)Descriptions Language

的缩写,既超高速集成电路的硬件描述语言。VHDL能够描述硬件电路的结构、行为与功能。虽然其硬件的相关语法与形式类似与一般语言,但是涉及许多与硬件相关的语法构造。VHDL设计的层次性,既自上而下的设计方法,适合大型设计工程的分工合作。VHDL的最大特点是描述能力极强,可覆盖逻辑设计的诸多领域和层次,并支持众多的硬件模型。VHDL的特点包括如下几个方面。

  1. 可以分层次设计。
  2. 每个设计单元,既有定义好的接口(以便连接其他元件时使用)又有明确的行为规范(原来仿真)
  3. 用算法或者实际硬件结构来定义一个元件操作的行为规范。
  4. 并发性:以硬件描述语言所描述的实际系统,其许多操作时并发执行的。
  5. 逻辑操作和设计的时序行为都能够仿真。

因此VHDL作为一种文件和模块语言,允许明确的指定和仿真数字逻辑系统的行为。

1.4.2  设计流程

    在使用VHDL设计之前,有必要先了解整体VHDL的设计过程。在VHDL的基本设计过程中,有几个步骤通常叫做设计流程。这些步骤适合于任何一个硬件描述语言的基本设计过程,用框图表示于图1.3中。

 

图1.3  VHDL设计流程

整体设计流程分为“前期”工程和“后期”工程两步。所谓“前期”步骤开始于提出基本方法和建立在框图层次上的模块。大型的逻辑设计通常是分层次的。VHDL有好用的框架来定义模块及其接口,还有随后填加的实体细节,和它们的内部结构体细节。

第二步是真正为模块编写VHDL程序,包括接口,内部细节。使用专业的VHDL文本编辑器使这一步工作更容易些。这样的编辑器有自动高亮、VHDL关键字、自动缩进等,对常用的程序结构内部模块的语法进行检查,单击进入编译等功能。

如果数字系统的设计者写出一些程序就想编译,这样做当然没错。VHDL编译器为了检查语法错误并检查与其它相关模块的相容性,它也创建内部信息,这是后来设计进程中的仿真所需要的。没必要把所有的程序编完了才进行编译,尤其是工程较大时,一次编译一个模块可以避免增生语法错误,名称不一致问题,等等。

第三步是仿真/验证。在没有安装具体电路的情况下,VHDL仿真器对设计进行仿真,并观察其输出波形。除了能观察到输出波形外,仿真/验证更重要的作用是分析电路是否能按期望的那样工作,在大的工程中,大量的努力都花在这一步中,在这一阶段发现设计错误具有很高的价值,如果错误发现得迟了,可能“后期”步骤都要返工。

在VHDL的函数声明里,我们在研究电路和逻辑操作时不考虑延时,即认为门的延时参数是零。而在仿真的延时验证中,我们研究包括估计延迟时间的电路的操作,并检验上升时间,保持时间,和其它延时是否满足要求。由于延时可能会过于依赖综合和适配的结果,前期工作的延时检验是有限的。我们可以做一些初步的延时检验获得适合总体设计的方法,但是延时检验的细节必须到最后才能得到。

仿真/验证之后,进行“后期”阶段的工作,“后期”阶段分为三个步骤:逻辑综合、装配与布局/布线、延时分析。

在逻辑综合阶段,综合器所要做的工作是检查VHDL程序的语法是否正确,再根据厂商提供的器件库,将VHDL源程序转换成各种器件的组合。并依据设计者所给出的命令,在各器件之间做适当的布线。可见合成时的几个要点有:VHDL源程序、厂商提供的库以及用户所执行的命令,我们称之为约束条件,如面积、速度、功耗、可测性;支持工艺库,如TTL库,CMOS库等。最后一步是进行延时分析,延时分析主要是将做完布局/布线的结果再做一次验证,如验证前级输出信号到本级信号的建立时间及保持时间是否足够,延时限制条件是否满足等。如果时序上有错误就要寻找问题的根源,返回设计中的某个步骤改写设计,这些都是要做延时分析时才能知道[9]。

 

4.2 IIR 数字滤波器的 VHDL 实现

    IIR滤波器的实现是由以下几个模块组成的,时钟模块,寄存器模块,乘法器模块,加法器模块,各模块程序见以下的描述。

4.2.1  寄存器模块

在滤波器的运算中关键是滤波器的输出的反馈寄存和乘累加器两个模块,因此要使得滤波器的反馈能够精确,寄存器是一个数据一个数据的延迟的,共需要寄存器6个,输入为8位数据输出也是8位数据,寄存的输入为乘累加器的反馈,下面

是滤波器中寄存器模块的源程序:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity ram is

    Port (clk:in std_logic;

          reset:in std_logic;

          xout:out std_logic_vector(7 downto 0);

          xin:in std_logic_vector(7 downto 0)

          );

end ram;

 

architecture Behavioral of ram is          

begin

process(clk)

begin

 

if reset='1' then

       xout<="00000000";

     else   

   if (clk'event and clk='1') then

                xout<=xin;

    end if;

end if;

end process;

end Behavioral;

在初始状态下令输出信号在reset的高电平的控制下为0,当时钟上升沿来临时,进行信号输入,并开始信号的寄存,寄存过程仅仅需要一点点的时钟。仿真波形如下:

 

4.2.2  乘累加器模块

由上面滤波器转移函数(4.3),(4.4)式可以看出,一个二阶节的实现需要五次乘法运算、四次加法运算(采用二进制补码将减法运算变为加法运算)。两个二阶节共需要十次乘法运算。虽然现在已有上千万门的FPGA产品可供选用,但是一般应用时全部采用硬件阵列乘法器毕竟不太合适,而如果采用串行乘法器进行分时复用,其工作速度也不太理想。

所以本次的设计中采用一个折中的方法实现,即乘加单元(mac)的乘法器采用阵列乘法器,而不使用串行乘法器,以提高运算速度。需要注意的是,MAX+PLUS II的LPM库中乘法运算为无符号数的阵列乘法,所以使用时需要先将两个补码乘数转换为无符号数相乘后,再将乘积转换为补码乘积输出。每个二阶节完成一次运算共需要6个时钟周期,而且需采用各自独立的mac实现两级流水线结构,即每个数据经过两个二阶节输出只需要6个时钟周期[5]。

第一级乘累加器的源程序如下:

  package n_bit_int is

  subtype bits8 is integer range -2**7 to 2**7-1;

end n_bit_int;

 

library  work;

use work.n_bit_int.all;

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

entity mac is

    Port (clk:in std_logic;

          x0:in bits8;

          x1:in bits8;

          x2:in bits8;

          y0:in bits8;

          y1:in bits8;

          y2:out bits8

                   );

end mac;

architecture flex of mac is  

begin

process

begin

wait until clk='1';

     y2<=(113*x2-107*x1+113*x0+1618*y1-662*y0)/1024;    

end process;

end flex;

第二级乘累加器的源程序为:

package n_bit_int is

  subtype bits8 is integer range -2**7 to 2**7-1;

end n_bit_int;

library  work;

use work.n_bit_int.all;

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

entity mac2 is

    Port (clk:in std_logic;

          y0:in bits8;

          y1:in bits8;

          y2:in bits8;

          q0:in bits8;

          q1:in bits8;

          q2:out bits8

                   );

end mac2;

architecture flex of mac2 is  

begin

process

begin

wait until clk='1';

     q2<=(252*y2-436*y1+252*y0+1818*q1-913*q0)/1024;

     end process;

end flex;

乘累加器在时钟的上升沿计算,并经过一小段时间输出数据,累加器累加的结果需输入寄存器再输出,两个乘累加器只是输入信号和两级滤波器的系数不同,其余都相同,这样设计的好处是想改变滤波器的性能时,只需将滤波器的系数改变即可,比较方便[6]。

4.2.3  IIR总体模块的实现

由上面所描述的几个模块,可得出IIR滤波器的总体实现框图,利用几个模块模型,直接可以编译出IIR滤波器的VHDL实现,即将上述几个模块连接在一起即可。如下图所示,IIR滤波器由六个寄存器,两个乘累加器组成。

第一级的乘累加器输出为第二级乘累加器的一个输入,其余输入为第一级输出经过寄存器后的输出,或为反馈回来的信号,输入时钟和复位信号相同,dout1为一级乘累加器的输出,dout2为二级乘累加器的输出,也为总的输出,具体的框图如图4.3所示。

4.3系统性能测试

系统性能的测试采用单极性方波周期信号作为输入信号。信号的频率为1MHz,在采样频率为2MHz时,每个周期采样20个点,其二次谐波的数字频输入到MAX153的信号电压幅度为2.5V,则经过A/D转换后的输出为00H~FFH。由于低通滤波器的阻带截止频率选在200KHz,衰减32dB由信号理论分析可知,周期方波信号没有二次谐波,所以对三次谐波的衰减经过IIR滤波器后输出有直流分量的基波正弦信号。

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/108296070