资源描述
课程设计基于 FPGA 和 Quartus II 设计的智能函数发生器题 目 基于基于 FPGA 和和 Quartus II 设计的智能函数发生设计的智能函数发生器器 所在院 (系) 物理与电信工程学院 基于 FPGA 和 Quartus II 设计的智能函数发生器基于基于 FPGAFPGA 和和 QuartusQuartus IIII 设计的智能函数发生器设计的智能函数发生器摘要 信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。它能够产生多种波形,如三角波、锯齿波、矩形波(含方波) 、正弦波等,在电路实验和设备检测中具有十分广泛的用途。例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频) 、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。在工业、农业、生物医学等领域内,如高频感应加热、熔炼、淬火、超声诊断、核磁共振成像等,都需要功率或大或小、频率或高或低的信号发生器。本设计采用 FPGA 来设计制作多功能信号发生器。该信号发生器可以产生锯齿波、三角波、方波等波形。 关键词 信号发生器;VHDL;FPGA;三角波;方波;锯齿波。目录目录基于 FPGA 和 Quartus II 设计的智能函数发生器1.引言 12.FPGA 简介12.1 VHDL 和 VERILOG简介32.2 设计工具简介33.系统设计 33.1 VHDL 程序语言基本设计33.2波形发生器设计43.3 程序设计原理框图44 系统的软件设计与仿真 64.1 系统仿真时序图64.2 RTL 仿真硬件图75 总结体会与展望 8参考文献 9附录 A 设计原理图 10附录 B 系统仿真图11附录 C 源程序清单13基于 FPGA 和 Quartus II 设计的智能函数发生器第 1 页 1.1.引言引言20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法。电子设计自动化(EDA)工具给电子设计带来了巨大的变革,特别是可编程逻辑器件和硬件描述语言的出现和发展,解决了用传统的方法设计较大系统工程时的诸多不便,成为电子电路设计人员最得力的助手。随着计算机和EDA技术的发展,基于FPGA的电子设计则是目前发展较为迅速的一个领域,而且广泛应用于计算机、通信等各个领域。因此,本文主要利用VHDL,设计制作一个多功能波形发生器。采用传统的模拟振荡电路构成的波形发生器产生的信号频率精度低,不仅成本高,外围电路复杂,易受外界干扰,而且调试困难,不便于调控,实现的性能指标也不理想。对此采用具有良好性能的专用集成芯片就能达到本题的目的要求。但采用该方法所需的外围电路模块多且较为复杂,不利于控制和问题的检查。而纯单片机的方法虽便于控制但又难以达到题目的要求。 现如今是信息时代,人们对使用计算机获取信息、处理信息的依赖性也越来越高。因此,利用FPGA采用DDS的方式来设计的波形发生器前景十分可观。随着电子技术的飞速发展,VHDL作为标准化的硬件描述语言获得了广泛的应用。无论是采用传统的模拟振荡电路还是专用的集成芯片所作的波形发生器已不能满足需要。因此,对波形发生器的设计势在必行。本文主要利用VHDL语言,设计制作一个多功能波形发生器,能实现多种波形的输出及组合,并进行仿真。2.2.FPGAFPGA 简介简介FPGA(FieldProgrammable Gate Array)即现场可编程门阵列,它是在 PAL、GAL、CPLD 等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。与传统们阵列和掩模可编程门阵列(MPGA)相比,FPGA 具有很多的优点,传统门阵列可以用来设计任何电路,但是只能在工厂中一次性编程,而且还需要针对该电路的特定的掩模。FPGA 是标准通用器件。使用其代替 MPGA,可以将设计时间由几个月缩短至几小时,并且使设计更加简单,从而减少了错误修改和设计指标变更的花费。FPGA 器件在结构上,由逻辑功能块排列为阵列,它的结构可以分为三个部分:可编程快CLB(Configurable Logic Blocks) 、可编程 I/O 模块 IOB(Input Block)和可编程内部连线PI(Programmable Interconnect) 。CLB 在器件中排列为阵列,周围有环形内部连线,IOB 分布在四周的管脚上。基于 FPGA 和 Quartus II 设计的智能函数发生器第 2 页 FPGA 也存在缺点,FPGA 中,每个可编程的点都有电阻和电容。电阻和电容的使用减慢了信号的传输速度,所以 FPGA 的速度比传统门阵列要低,而且,FPGA 中互联延迟是不可预测的。 FPGA 的基本特点主要有: 一、采用 FPGA 设计 ASIC 电路,用户不需要投片生产,就能得到合用的芯片。 二、FPGA 可做其它全定制或半定制 ASIC 电路的中试样片。 三、FPGA 内部有丰富的触发器和 IO 引脚。 四、FPGA 是 ASIC 电路中设计周期最短、开发费用最低、风险最小的器件之一。 五、FPGA 采用高速 CHMOS 工艺,功耗低,可以与 CMOS、TTL 电平兼容。 使用 FPGA 时,可以根据不同的配置模式,采用不同的编程方式。加电时,FPGA 芯片将 EPROM 中数据读入片内编程 RAM 中,配置完成后,FPGA 进入工作状态。掉电后,FPGA 恢复成白片,内部逻辑关系消失,因此,FPGA 能够反复使用。FPGA 的编程无须专用的 FPGA 编程器,只须用通用的EPROM、PROM 编程器即可。当需要修改 FPGA 功能时,只需换一片 EPROM 即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA 的使用非常灵活。FPGA 有多种配置模式:并行主模式为一片 FPGA 加一片 EPROM 的方式;主从模式可以支持一片 PROM 编程多片FPGA;串行模式可以采用串行 PROM 编程 FPGA;外设模式可以将 FPGA 作为微处理器的外设,由微处理器对其编程。2.12.1 VHDL&VerilogVHDL&Verilog 简介简介 VHDL(Very High Speed Integrated Circuit Hardware Description Language,超高速集成电路硬件描述语言)是一种用来描述数字系统行为和结构的硬件描述语言,被广泛的运用于描述和仿真各种数字系统,小到几个门,大到许多复杂集成电路相连的系统。VHDL 诞生于 1982 年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(The Institute of Electrical and Electronics Engineers)的一种工业标准硬件描述语言。相比传统的电路系统的设计方法,VHDL 具有多层次描述系统硬件功能的能力,支持自顶向下(Top to Down)和基于库(Library Based)的设计的特点,因此设计者可以不必了解硬件结构。从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用 VHDL 对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的 FPGA 器件中去,从而实现可编程的专用集成电路(ASIC)的设计。基于 FPGA 和 Quartus II 设计的智能函数发生器第 3 页 Verilog 也是一种流行的硬件描述语言,他是由工业界开发的,1984 年,Verilog 作为一种私用的硬件描述语言,由 Gateway Design Automation 公司给出,1988 年,Synopsis 公司为Verilog 开发了综合工具。1995 年,Verilog 成为 IEEE 的一个标准。Verilog 适合算法级,寄存器级,逻辑级,门级和版图级等各个层次的设计和描述。VHDL 的语法是基于 ADA 语言的,而 Verilog 的语法是基于 C 语言的。由于是基于 C 语言,所以它更容易掌握,但是 VHDL 语言在设计和描述大型系统时具有突出优势。目前两种语言各占一半市场份额,两种语言都可以满足数字系统设计者的需求。本设计中采用 VHDL 语言进行设计。2.22.2 设计工具简介设计工具简介本次设计是基于 Altera 公司的 QuartusII 软件。Quartus II 是 Altera 公司的综合性 PLD 开发软件,支持原理图、VHDL、VerilogHDL 以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整 PLD 设计流程。 QuartusII 支持 Altera 的 IP 核,包含了 LPM/MegaFuction 宏功能模块库,使用它,可以简化设计的复杂性,加快设计速度。QuartusII 平台支持一个工作组环境下的设计要求,其中包括支持基于 Internet 的协作设计。此外,QuartusII 通过和 DSP Builder 工具与 Matlab/SIMULINK 相结合,可以方便地实现各种 DSP 应用系统;支持 Altera 的片上可编程系统开发,集系统级设计、嵌入式软件设计、可编程逻辑设计于一体,是一种综性的开发平台。 3 3 系统设计系统设计3.13.1 VHDLVHDL 程序语言基本设计程序语言基本设计一个 VHDL 语言的设计程序描述的是一个电路单元,这个电路单元可以是一个门电路,或者是一个计数器,也可以是一个 CPU,一般情况下,一个完整的 VHDL 语言程序至少包括实体、结构体和程序包三个部分。实体给出电路单元的外部输入输出接口信号和引用信息,结构体给出了电路单元的内部结构和信号的行为特点,程序包定义在设计结构体和实体中将用到的常数、数据类型、子程序和设计好的电路单元等。第一部分是程序包,程序包是用 VHDL 语言编写的共享文件,定义在设计结构体和实体中将要用到的常数、数据类型、子程序和设计好的电路单元等,放在文件目录名称为 IEEE 的程序包库中。基于 FPGA 和 Quartus II 设计的智能函数发生器第 4 页 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;第二部分是程序的实体,定义电路单元的输入/输出引脚名称。程序的实体名称可以任意取,但必须与 VHDL 程序的文件名称相同。实体的标示符是 ENTITY,实体以 ENTITY 开头,以 END 结束。ENTITY fulladder ISPORT(a,b,Ci:in std_logic;Co,s: out std_logic_vector(7 downto 0);END fulladder;其中,定义了 a,b, Ci 为输入信号引脚,定义 Co,s 为输出信号引脚。第三部分是程序的结构体,具体描述电路的内部结构和逻辑功能。结构体有三种描述方式,分别是行为(BEHAVIOR)描述方式、数据流(DATAFLOW)描述方式和结构描述方式。其中数据流描述方式又被称为寄存器(RTL)描述方式。结构体以表示 ARCHITECHTURE 开头,以 END 结尾。结构体的名称可以任取。architecture behav of fulladder isBEGINs=a xor b xor Ci;Co=(a and b)or(a and Ci)or(b and Ci);END fulladder上面程序段中结构体的描述方式属于程序流描述方式。以上三段程序是一个完整的 VHDL 程序段,实现的功能是一位全加器。3.23.2 波形设计波形设计采用 DDS 技术可以很方便地产生各种高质量的波形。DDS 技术是从相位概念出发之结合成所需要波形的一种频率合成技术。以正弦波为例,首先要按照一定的采样点数将正弦波形一个周期的数据信息存于 ROM 表中,表中包含着一个周期正弦波的数字幅度信息,每个地址对应正弦波中 0 到基于 FPGA 和 Quartus II 设计的智能函数发生器第 5 页 360 度范围内的一个相位点的幅度值,查找表时即是把输入的地址相位信息映射成正弦波幅度的数字量信号,通过设置的输出端口输出。在实物设计中,可以使用 D/A 接口来实现波形信号的输出。为简化设计过程,本设计并未采用 DDS 技术,而是采用描点输出的方式,实现波形发生器的设计。程序中设置一个波形的起始点,经过比较、计算得出波形的其他数值,将这些点依次连续输出,从而实现波形的仿真。以递增锯齿波为例,首先定义初始点为 tmp=“00000000” ;在时钟上升沿到来时,执行 tmpclk,reset=reset,q0=y0); u1: jian port map(clk=clk,reset=reset,q1=y1); u2: sanjiao port map(clk=clk,reset=reset,q2=y2); u3: fangbo port map(clk=clk,clr=reset,q3=y3); u4: xuan_4 port map(sel=sel,d0=y0,d1=y1,d2=y2,d3=y3,q=q);end boxin_arc;-*-*递增锯齿波的设计程序*-*library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity zeng is port (clk,reset: in std_logic; q0: out std_logic_vector(7 downto 0);end entity;architecture zeng_arc of zeng issignal m0:integer range 0 to 7;signal tmp0:std_logic_vector(7 downto 0);begin process(clk,reset)-敏感信号基于 FPGA 和 Quartus II 设计的智能函数发生器第 15 页 beginif reset=0 then m0=0; elsif clkevent and clk=1 then if m0=7 then m0=0;-定义 8 分频,实际时增大数字,减小分频系数,因为 FPGA 系统的时钟为50MH 的。 if tmp0=11111111 then tmp0=00000000;-产生锯齿波 else tmp0=tmp0+1;-递增 end if; else m0=m0+1; end if;end if; q0=tmp0;end process;end zeng_arc;-*-递减锯齿波的产生-*library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jian is port (clk,reset: in std_logic; q1: out std_logic_vector(7 downto 0);end entity;architecture jian_arc of jian issignal m1:integer range 7 to 0;signal tmp1:std_logic_vector(7 downto 0);begin基于 FPGA 和 Quartus II 设计的智能函数发生器第 16 页 process(clk,reset)-敏感信号 beginif reset=0 then m1=7; elsif clkevent and clk=1 then if m1=0 then m1=7;-定义 8 分频,实际时增大数字,减小分频系数,因为 FPGA 系统的时钟为50MH 的。 if tmp1=00000000 then tmp1=11111111;-产生锯齿波 else tmp1=tmp1-1;-递减 end if; else m1=m1-1; end if;end if; q1=tmp1;end process;end jian_arc;-*-*三角波*-*library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sanjiao isport ( clk,reset: in std_logic;q2: out std_logic_vector(7 downto 0);end entity;architecture sanjiao_arc of sanjiao issignal m2:integer range 0 to 7;signal tmp2:std_logic_vector(7 downto 0);beginprocess(clk,reset)-敏感信号variable a: std_logic:=0; beginif reset=0 then m2=0; elsif clkevent and clk=1 then if m2=7 then m2=0;-定义 8 分频,实际时增大数字,减小分频系数,因为 FPGA 系统的时钟为基于 FPGA 和 Quartus II 设计的智能函数发生器第 17 页 50MH 的。 if a=0 then if tmp2=11111110 then tmp2=11111111;-向上的锯齿波 a:=1; else tmp2=tmp2+1; end if; else if tmp2=00000001 then-向下锯齿波 tmp2=00000000; a:=0; else tmp2=tmp2-1; end if; end if; else m2=m2+1;-分频自加 end if;-分频 if 结束end if;-复位信号 if 结束 q2=tmp2;end process;end sanjiao_arc;-*-*方波*-*library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fangbo isport( clk,clr: in std_logic; q3: out std_logic_vector(7 downto 0);end entity;architecture fangbo_arc of fangbo issignal t: bit;beginprocess(clk,clr)-敏感信号variable cnt: integer range 0 to 63; beginif clr=0 then t=0; elsif clkevent and clk=1 then if cnt63 then cnt:=cnt+1;-定义 64 分频,实际时增大数字,减小分频系数,因为 FPGA 系统的时钟基于 FPGA 和 Quartus II 设计的智能函数发生器第 18 页 为 50MH 的。 else cnt:=0; t=not t; end if; end if;end process;process(clk,t) begin if clkevent and clk=1 then if t=1 then q3=11111111; else q3qqqqnull; end case; end process;end xuan_4_arc; 基于 FPGA 和 Quartus II 设计的智能函数发生器第 19 页 /* 名称:基于 Verilog 编程的智能函数发生器设计程序*/module Sin(f_clk,p,choose,data);/端口设定input 5:0 p; /频率控制字input1:0 choose; /波形选择input f_clk; /内置晶振output 7:0 data;wire 7:0data;reg 5:0 addr,address;reg 5:0 i;reg f_out;initial begin i=0; addr=0; f_out=0; endalways (posedge f_clk) /利用计数器实现任意分频begin基于 FPGA 和 Quartus II 设计的智能函数发生器第 20 页 if(i=p) /设定频率控制字 pbegin i=0;f_out=f_out;end elsei=i+1;endfunction 7:0 romout; /ROM 的设定 input5:0 address;case(address) /各波形初值的预装入0 : romout = 10; /正弦波初值1 : romout = 17;2 : romout = 15;3 : romout = 17;4 : romout = 10;5 : romout = 3;6 : romout = 5;7 : romout = 3;8 : romout = 3; /方波初值9 : romout = 3;10: romout = 3;11: romout = 3;12: romout = 1;基于 FPGA 和 Quartus II 设计的智能函数发生器第 21 页 13: romout = 1;14: romout = 1;15: romout = 1;16 : romout = 0; /正三角波初值17 : romout = 5;18 : romout = 10;19 : romout = 15;20 : romout = 20;21 : romout = 25;22 : romout = 30;23 : romout = 35;24 : romout = 35; /反三角波初值25 : romout = 30;26 : romout = 25;27 : romout = 20;28 : romout = 15;29 : romout = 10;30 : romout = 5;31 : romout = 0; default : romout = 10hxx;endcaseendfunctionalways(posedge f_out) begin基于 FPGA 和 Quartus II 设计的智能函数发生器第 22 页 if(addr=8) /波形数据切换 addr=0; else addr=addr+1; case(choose) /波形选择开关设定 0: address=addr; 1: address=addr+8; 2: address=addr+16; 3: address=addr+24; endcase end assign data = romout(address);/将 ROM 中对应数据传递输出端口 data 输出endmodule
展开阅读全文