毕业设计(论文)-基于FPGA的FIR滤波器设计.doc_第1页
毕业设计(论文)-基于FPGA的FIR滤波器设计.doc_第2页
毕业设计(论文)-基于FPGA的FIR滤波器设计.doc_第3页
毕业设计(论文)-基于FPGA的FIR滤波器设计.doc_第4页
毕业设计(论文)-基于FPGA的FIR滤波器设计.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录 引言 .1 1软件及硬件平台 2 11 vhdl 语言特点.2 12 max plusii 开发环境3 13 可编程逻辑器件 .4 14 altera 公司 flex 10k 系列 5 2fir 滤波器基本理论.6 21 数字滤波器概述 .6 22 有限长单位冲激响应(fir)滤波器 6 221 fir 滤波器特点.6 222 fir 滤波器结构.7 23 fir 数字滤波器的实现方法8 3.基于 fpga 实现 fir 滤波器的研究 9 31 基于乘法器结构的 fir 滤波器在 fpga 上的实现结构 .9 311 基于乘累加 fir 滤波器结构9 312 基于并行乘法器直接型 fir 滤波器结构 10 32 基于分布式(da)算法的 fir 滤波器在 fpga 上实现结构 11 321 用分布式原理实现 fir 滤波器串行方式 .12 322 用分布式原理实现 fir 滤波器并行方式 .13 33 csd 码及最优化方法.14 4线性相位 fir 滤波器的设计 .16 41 fir 滤波器的设计要求.16 42 软件环境和硬件平台选择 16 43 fir 滤波器的设计方案.16 44 各模块设计 17 5仿真结果及分析 .21 51 仿真结果 21 52 仿真结果分析 22 6总结 .22 致谢 23 参考文献 23 abstract 25 1 基于基于 fpgafpga 的的 firfir 滤波器设计滤波器设计 摘要摘要:本文提出了一种采用现场可编程门阵列器件(fpga)实现 fir 数字滤波器的方案,并以 altera 公司的 fpga 器件 epf10k30 为例完成了 fir 滤波器的模块化设计过程。底层采用 vhdl 语言描述设计文件,顶层使用底层产生的模块连接组 成 fir 滤波器,并在 max+plusii 上进行了实验仿真。仿真结果表明:该设计方案可行,可为今后的数字滤波器模块化研究提 供另一种思路。 关键词关键词:vhdl;fpga;fir 滤波器;maxplus 引言 许多工程技术领域都涉及到信号,这些信号包括电的、磁的、机械的、热的、声的、光的及生物体 的等等。如何在较强的背景噪声和干扰信号下提取出真正的信号并将其用于实际工程,这正是信号处理 要研究解决的问题。20 世纪 60 年代,数字信号处理理论得到迅猛发展,理论体系和框架趋于成熟,到现 在它已经成长为一门独立的数字信号处理学科。数字滤波器在数字信号处理中占有很重要的地位,它涉 及的领域很广,如:通信系统、系统控制、生物医学工程、机械振动、遥感遥测、地质勘探、航空航天、 电力系统、故障检测、自动化仪器等。 系统数字滤波是提取有用信息非常重要而灵活的方法,是现代信号处理的重要内容。相对于模拟滤 波器,数字滤波器没有漂移,能够处理低频信号,频率响应可接近理想特性,且精度很高又容易集成。 在现代电子系统中,fir 数字滤波器以其良好的线性特性被广泛使用,属于数字信号处理的基本模块之一。 在工程实践中,往往要求对信号处理要有实时性和灵活性,而已有的一些软件和硬件实现方式则难以同 时达到这两方面的要求。 硬件描述语言(vhdl)是数字系统高层设计的核心,是实现数字系统设计新方法的关键技术之一。 随着可编程逻辑器件在速度和集成度方面的飞速发展,使用 fpga 来实现 fir 滤波器,既具有实时性,又 兼顾了一定的灵活性,越来越多的电子工程师采用 fpga 器件来实现 fir 滤波器,fir 数字滤波器在数字 信号处理系统中应用非常普遍,常被用来对原始(或输入)样本数据进行消除高频、抑制噪声等处理以 产生所需的输出。 数字滤波器的好坏对相关的众多工程技术领域影响很大,一个好的数字滤波器会有效地推动众多工 程技术领域的技术改造和科学发展。所以对数字滤波器的工作原理、硬件结构和实现方法进行研究具有 一定的意义。 本设计将采用现场可编程门阵列器件(fpga)实现 fir 数字滤波器的方案,底层采用 vhdl 语言描述设 计文件,顶层使用底层产生的模块连接组成 fir 滤波器,并在 max+plusii 上进行实验仿真。由仿真结果 判断设计的可行性。 1软件及硬件平台 2 11 vhdl语言特点 vhdl 是一种全方位的硬件描述语言,包括系统行为级、寄存器传输级和逻辑门级多个设计层次,支持 结构、数据流和行为三种描述形式的混合描述,因此 vhdl 几乎覆盖了以往各种硬件描述语言的功能,整 个自顶向下或自底向上的电路设计过程都可以用 vhdl 来完成。vhdl 还具有以下优点:(1)vhdl 的宽范围 描述能力使它成为高层次设计的核心,将设计人员的工作重心提高到了系统功能的实现与调试,而花较 少的精力于物理实现。(2)vhdl 可以用简洁明确的代码描述来进行复杂控制逻辑的设计,灵活且方便,而 且也便于设计结果的交流、保存和重用。(3)vhdl 的设计不依赖于特定的器件,方便了工艺的转换。(4) vhdl 是一个标准语言,为众多的 eda 厂商支持,因此移植性好。 vhdl 设计是行为级的设计,所带来的问题是设计者的设计思想与实际电路结构是相脱节的。设计者 主要是根据 vhdl 的语法规则,对系统目标的逻辑行为进行描述,然后通过综合工具进行电路结构的综合、 编译、优化,通过仿真工具进行逻辑功能仿真和系统延时的仿真。实际设计过程中,由于每个设计工程 师对语言规则、对电路行为的理解程度不同,每个是大相径庭。因此,即使最后综合出的电路都能实现 相同的逻辑功能,其电路的复杂程度和时延特性都会有很大的区别,甚至某些臃肿的电路还会产生难以 预料的问题。从这些问题出发,很有必要深入讨论在 vhdl 设计中如何简化电路结构,优化电路设计的问 题。 一段独立的 vhdl 代码至少包含 3 个组成部分: 库(library)声明:列出了当前设计中需要用到的所有库文件,如 ieee,std 和 work 等。 实体(entity):定义了电路的输入/输出引脚。 构造体(architecture):所包含的代码描述了电路要实现的功能。库是一些常用代码的集合,将 电路设计中经常使用的代码存放到库中有利于设计的重用和代码共享,库的典型结构如图 1-1。 代码通常以函数(function) 、过程(procedure)或元件(component)等标准形式存放在包裹 (package)中,用户可以根据需要对其进行编译使用。 库 包集 函数过程 元件常量 类型 图 1-1 一个库的基本组成部分 为了更有效的编写 vhdl 代码,必须知道哪些数据类型是可用的以及怎样说明和使用它们。表 1-1 中 总结了 vhdl 中基本的可综合的数据类型。 表 1-1 vhdl 中基本的可综合的数据类型 数据类型 可综合的数据 3 bit,bit_vector 0, 1 std_logic,std_logic_vectir x, 0, 1, z std_ulogic,std_ulogic_vector x, 0, 1, z boolean true,false natural 0 到+2147483647 integer -2147483647 到+2147483647 unsigned 0 到+2147483647 用户自定义整型 integer 的子集 用户自定义枚举类型 根据用户自定义进行编码得到 subtype 任何预定义或用户自定义类型的子集 array 任意上述单一类型数据的集合 record 任意上述多重类型数据的集合 vhdl 的语法基础的学习令人感到枯燥乏味,但只有在对数据类型、运算操作符及其属性有了深刻理 解之后,才有可能写出高质量和高效率的代码。表 1-2 总结了 vhdl 中数据类型、运算操作符及其属性。 表 1-2 vhdl 中数据类型、运算操作符及其属性 操作符类型操作符操作数类型 赋值运算 逻辑运算 算术运算 比较运算 移位运算 并置运算 not,and,nand, or,nor,xor,xno r +,-,*, /,* (mod,rem,ads) =,/=,= sll,srl,sla,sr a,rol,ror use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity inputdelay is -17 位延时寄存器 port( clk :in std_logic; -时钟 18 x_in :in std_logic_vector(8 downto 0); -输入端口 x0 :out std_logic_vector(8 downto 0); -输出端口 x_16 :out std_logic_vector(8 downto 0); x1 :out std_logic_vector(8 downto 0); x9 :out std_logic_vector(8 downto 0); x8 :out std_logic_vector(8 downto 0) ); end inputdelay; architecture a of inputdelay is signal xtap0 :std_logic_vector(8 downto 0); signal xtap1 :std_logic_vector(8 downto 0); signal xtap2 :std_logic_vector(8 downto 0); signal xtap16 :std_logic_vector(8 downto 0); begin process(clk) begin if (clkevent and clk=1) then -时钟上升沿时移一位 xtap16=xtap15; xtap15=xtap14; xtap0=x_in; end if; end process; x_16=xtap16; x_15=xtap15; x0=xtap0; end a; 19 图 4-2 输入延时模块 (2) 加法模块 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_signed.all; use ieee.std_logic_unsigned.all; entity adder2 is -9 位二进制 2 路加法器 port ( a: in std_logic_vector (8 downto 0); -9 位被加数输入 b: in std_logic_vector (8 downto 0); -9 位加数输入 result: out std_logic_vector (8 downto 0) -9 位结果输出 ); end adder2; architecture rtl of adder2 is signal pdt1_int,pdt2_int : signed (8 downto 0); signal result_int: signed (8 downto 0); begin 20 pdt1_int = signed(a) ; pdt2_int = signed(b) ; result_int = pdt1_int + pdt2_int ; result = std_logic_vector(result_int ); end rtl; 图 4-3 符号数加法模块 (3)乘法模块 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_signed.all; entity mult1 is port ( a: in std_logic_vector (8 downto 0); -9 位被乘数输入 result: out std_logic_vector (17 downto 0) ); end mult1; architecture rtl of mult1 is signal a_int: signed (8 downto 0); -用于记录被乘数 signal b_int: signed (8 downto 0); -用于记录被乘数 signal pdt_int: signed (17 downto 0); -用于记录乘积 begin a_int = signed (a); b_int = “111101110“; -输入乘法器系数 pdt_int = a_int * b_int; result = std_logic_vector(pdt_int); end rtl; 21 图 4-4 符号数乘法模块 (4)9 位加法模块模块 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_signed.all; use ieee.std_logic_unsigned.all; entity testadd_9 is -18 位二进制 9 路加法 器 port ( a1,a2,a3,a4,a5,a6,a7,a8,a9: in std_logic_vector (17 downto 0); result: out std_logic_vector (17 downto 0) ); end testadd_9; architecture rtl of testadd_9 is signal pdt1_int,pdt2_int,pdt3_int,pdt4_int,pdt5_int,pdt6_int,pdt7_int,pdt8_int,pdt9_int: signed (17 downto 0); signal result_int: signed (17 downto 0); begin pdt1_int = signed(a1) ; pdt2_int = signed(a2) ; pdt3_int = signed(a3) ; pdt4_int = signed(a4) ; pdt5_int = signed(a5) ; pdt6_int = signed(a6) ; pdt7_int = signed(a7) ; 22 pdt8_int = signed(a8) ; pdt9_int = signed(a9) ; result_int = pdt1_int + pdt2_int + pdt3_int + pdt4_int + pdt5_int + pdt6_int + pdt7_int + pdt8_int + pdt9_int; result = std_logic_vector(result_int ); end rtl; 图 4-5 符号数多路加法模块 5仿真结果及分析 51 仿真结果 图 5-1 仿真波形(a) ) (ny) 2 1 ( n h) 2 3 ( n h)2(h) 1 (h)0(h 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 z 1 z 11 23 图 5-2 仿真波形(b) 图 5-3 仿真波形(c) 52 仿真结果分析 从图 5-1 上可看出输入信号是单一输入 x(0)=1。从理论上分析它的输出 y(n)应为:y(0)= -18 y(1)=-12,y(2)=20,y(3)=24,y(4)=-22,y(5)=-49,y(6)=23,y(7)=161,y(8)=232,y(9) =161,y(10)=23, y(11)=-49,y(12)=-22,y(13)=24,y(14)=20,y(15)=-12,y(16)=-18。 从图 5-2,图 5-3 的仿真结果可以看出输出的结果与理论是一致的。 仿真结果可以看出,实际是完全可行的。系统能够运行在 5mhz 的系统时钟上。 6总结 本文以 fpga/cpld 为器件设计了一个 17 阶带通 fir 数字滤波器的硬件实现电路,输入数据宽度为 9 位,输出数据宽度为 18 位。全文的主要工作及结论如下: (1)本设计在 max+plusii 环境下采用原理图和 vhdl 语言相结合的方式编程。各模块均采用 vhdl 语言设计。顶层使用底层产生的模块连接组成 fir 滤波器。 (2)设计的输入端 2 组信号,时钟和数据,设计在时钟的上升沿采样数据。时钟的下降沿输出数据。 输出端数据宽度为 18 位,最高位为符号位,补码输出。 (3)利用 vhdl 设计,可重复配置 fpga,降低成本,开发周期较短,系统易于维护和扩展。 (4)由于该电路是基于 fpga/cpld 设计的,所以设计更改方便,可通过改变滤波器的系数来实现不 同类型的 fir 滤波器。 (5)用 vhdl 语言描述了一些硬件模块,通过编译仿真,这些模块达到了与原理图输入相同的功能。 从仿真结果可以看出,实际是完全可行的。系统能够运行在 5mhz 的系统时钟上。 ) (ny) 2 1 ( n h) 2 3 ( n h)2(h ) (ny) 2 1 ( n h) 2 3 ( n h)2(h) 1 (h)0(h 1 1 1 1 1 1 1 1 1 1 1 1 24 (6)由于硬件的问题,系统运行速度较慢。 (7)乘法器的设计不够优化,如何使乘法器的速度加快仍然是值得进一步研究的问题,可以找到一 种合理的算法来解决这一问题。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论