人人范文网 范文大全

基于单片机设计的简易信号发生器资料

发布时间:2020-03-03 17:48:34 来源:范文大全 收藏本文 下载本文 手机版

辽东学院信息技术学院

《可编程逻辑器件原理及应用》教学实习报告

简易信号发生器

学生姓名: 杨刚 学 号: 0915110619 班 级: B1106 专 业: 电子信息工程 指导教师: 张俊芳

2014年07月

辽东学院EDA教学实习报告

简易信号发生器

1引言

信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。它能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波等,在电路实验和设备检测中具有十分广泛的用途。例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频)、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。在工业、农业、生物医学等领域内,如高频感应加热、熔炼、淬火、超声诊断、核磁共振成像等,都需要功率或大或小、频率或高或低的信号发生器。

本设计采用FPGA来设计制作多功能信号发生器。该信号发生器可以产生锯齿波、三角波、方波等波形。

2 FPGA简介

FPGA(Field-Programmable 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也存在缺点,FPGA中,每个可编程的点都有电阻和电容。电阻和电容的使用

辽东学院EDA教学实习报告

减慢了信号的传输速度,所以FPGA的速度比传统门阵列要低,而且,FPGA中互联延迟是不可预测的。

FPGA的基本特点主要有:

一、采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。

二、FPGA可做其它全定制或半定制ASIC电路的中试样片。

三、FPGA内部有丰富的触发器和I/O引脚。

四、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作为微处理器的外设,由微处理器对其编程。

3 VHDL & 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器件中去,从而

辽东学院EDA教学实习报告

实现可编程的专用集成电路(ASIC)的设计。

Verilog也是一种流行的硬件描述语言,他是由工业界开发的,1984年,Verilog作为一种私用的硬件描述语言,由Gateway Design Automation公司给出,1988年,Synopsis公司为Verilog开发了综合工具。1995年,Verilog成为IEEE的一个标准。Verilog 适合算法级,寄存器级,逻辑级,门级和版图级等各个层次的设计和描述。

VHDL的语法是基于ADA语言的,而Verilog的语法是基于C语言的。由于是基于C语言,所以它更容易掌握,但是VHDL语言在设计和描述大型系统时具有突出优势。目前两种语言各占一半市场份额,两种语言都可以满足数字系统设计者的需求。

本设计中采用VHDL语言进行设计。

4 设计工具简介

本次设计是基于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的片上可编程系统开发,集系统级设计、嵌入式软件设计、可编程逻辑设计于一体,是一种综性的开发平台。

5 系统设计

基于VHDL语言设计一个多功能信号发生器,通过选择输入信号,可以输出递增锯齿波、递减锯齿波、三角波、方波等四种信号。信号发生器的控制模块可以选用数据选择器实现,4种信号的数据选择可以使用4选1数据选择器实现。

辽东学院EDA教学实习报告

5.1 VHDL程序语言基本设计

一个VHDL语言的设计程序描述的是一个电路单元,这个电路单元可以是一个门电路,或者是一个计数器,也可以是一个CPU,一般情况下,一个完整的VHDL语言程序至少包括实体、结构体和程序包三个部分。实体给出电路单元的外部输入输出接口信号和引用信息,结构体给出了电路单元的内部结构和信号的行为特点,程序包定义在设计结构体和实体中将用到的常数、数据类型、子程序和设计好的电路单元等。

第一部分是程序包,程序包是用VHDL语言编写的共享文件,定义在设计结构体和实体中将要用到的常数、数据类型、子程序和设计好的电路单元等,放在文件目录名称为IEEE的程序包库中。

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 IS PORT(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 is BEGIN

s

辽东学院EDA教学实习报告

END fulladder 上面程序段中结构体的描述方式属于程序流描述方式。 以上三段程序是一个完整的VHDL程序段,实现的功能是一位全加器。

5.2 波形发生器设计

采用DDS技术可以很方便地产生各种高质量的波形。DDS技术是从相位概念出发之结合成所需要波形的一种频率合成技术。以正弦波为例,首先要按照一定的采样点数将正弦波形一个周期的数据信息存于ROM表中,表中包含着一个周期正弦波的数字幅度信息,每个地址对应正弦波中0到360度范围内的一个相位点的幅度值,查找表时即是把输入的地址相位信息映射成正弦波幅度的数字量信号,通过设置的输出端口输出。在实物设计中,可以使用D/A接口来实现波形信号的输出。

为简化设计过程,本设计并未采用DDS技术,而是采用描点输出的方式,实现波形发生器的设计。程序中设置一个波形的起始点,经过比较、计算得出波形的其他数值,将这些点依次连续输出,从而实现波形的仿真。以递增锯齿波为例,首先定义初始点为

tmp=“00000000”;在时钟上升沿到来时,执行tmp

tmp=“11111111”;时,将tmp值清零,执行下一个循环。

在本设计中,采用QuartusII软件仿真,所以可以通过波形文件直观的反映出输出的数字量的变化情况,以达到波形输出的仿真。

设计中分别对四种波形进行编程,编译无误后,封装生成模块文件,以供在后面的顶层电路设计中使用。

inst3triangleclkresetq[7..0]squareclkresetq[7..0]sawtooth_adderclkresetq[7..0]sawtooth_minusclkresetq[7..0]instinst16

inst2辽东学院EDA教学实习报告

图5-1 四种波形封装图块

本设计中设置了四种波形,分别是递增锯齿波、递减锯齿波、三角波、方波。四种波形通过一个4选1数据选择器来实现选择性输出。

5.3 四选一数据选择器设计

可以采用集成四选一数据选择器CT54153/CT74153,也可以使用软件编程生成模块的方式实现数据四选一的功能。在本设计中采用后者,程序中,为每一种波形分配一个通道,并为之赋予一唯一的代码,当在sel端输入不同的代码时,被选中的通道打开,响应的波形发生模块产生波形。

entity mux41 is port(sel:in std_logic_vector(2 downto 0);--定义输入端口sel d1,d2,d3,d4: in std_logic_vector(7 downto 0);--定义输入端口d1,d2,d3,d4 q: out std_logic_vector(7 downto 0));--定义输出端口 end mux41; architecture behav of mux41 is begin proce(sel) begin

case sel is when \"001\"=>q

mux41when \"010\"=>qqqnull; end case;

sel[2..0]d1[7..0]d2[7..0]d3[7..0]d4[7..0]inst4q[7..0]end proce;

图5-2四选一数据选择器封装图块 end behav; 以上为四选一数据选择器程序段,其中sel端口为外部输入选择信号,d1,d2,d3,d4分

辽东学院EDA教学实习报告

别连接四个波形发生模块,以二进制形式给sel幅值,选择相应的通道。q为输出端口,将波形信息的数字代码输出。

5.4 程序设计

递增锯齿波递减锯齿波12开始波形选择(

1、

2、

3、4)43三角波方波波形输出结束图5-3 系统流程图

5.5 主要函数语句分析

在程序设计中,主要使用的函数语句有两种:If-else语句和case-when语句。这两种语句也是VHDL程序设计中常用的语句。二者都属于流程控制语句。流程控制语句通过条件控制开关决定是否执行一条或几条语句或重复执行一条或几条语句或跳过一条或几条语句 。

IF语句是一种条件语句,它根据语句中所设置的一种或多种条件,有选择地执行指定的顺序语句。IF语句的语句结构有以下三种:

IF 条件句 Then

-- 第一种IF语句结构

顺序语句

END IF

辽东学院EDA教学实习报告

IF 条件句 Then

-- 第二种IF语句结构

顺序语句

ELSE

顺序语句

END IF

IF 条件句 Then

-- 第三种IF语句结构

顺序语句

ELSIF 条件句 Then

顺序语句

ELSE

END IF

...

顺序语句

CASE语句根据满足的条件直接选择多项顺序语句中的一项执行,CASE语句的结构如下:

CASE 表达式 IS When 选择值 => 顺序语句 When 选择值 => 顺序语句

...END CASE

当执行到CASE语句时,首先计算表达式的值,然后根据条件句中与之相同的选择值。执行对应的顺序语句,最后结束 CASE语句。表达式可以是一个整数类型或枚举类型的值,

也可以是由这些数据类型的值构成的数组。

5.6 系统顶层文件

将上述5个模块(递增锯齿波sawtooth_adder、递减锯齿波sawtooth_minus、三角波triangle、方波square、4选1数据选择器mux41)封装成为模块文件,供顶层电路调用。可以得到以下顶层文件电路:

sel[2..0]sawtooth_adderclkINPUTVCCINPUTVCCINPUTVCCclkresetq[7..0]resetinst1sawtooth_minuel[2..0]辽东学院EDA教学实习报告

clkresetq[7..0]mux41sel[2..0]d1[7..0]d2[7..0]d3[7..0]d4[7..0]q[7..0]OUTPUTq[7..0]图5-4 系统顶层电路图

inst2triangleclkresetq[7..0]

instinst4squareclkresetq[7..0]

inst3 10

辽东学院EDA教学实习报告

6系统仿真

通过选择不同的sel值,可以实现不同的波形输出。仿真中reset复位信号一直置高电平,即没有仿真复位情况。

输入的选择信号为1时,信号发生器顶层电路的仿真输出波形为递增锯齿波。输出的波形线性递增。

图6-1 递增锯齿波仿真波形

输入的选择信号为2时,信号发生器顶层电路的仿真输出波形为递减锯齿波。输出的波形线性递减。

图6-2 递减锯齿波仿真波形

输入的选择信号为3时,信号发生器顶层电路的仿真输出波形为三角波。输出的波形线性减小到最小值0后,再线性增加。

图6-3 三角波仿真波形

辽东学院EDA教学实习报告

输入的选择信号为4时,信号发生器顶层电路的仿真输出波形为方波。输出的波形为周期性的全0或全1。(在仿真中,只有将CLK信号频率取得很高的时候,才可以清晰地看出仿真效果。)

图6-4 方波仿真波形

7 设计总结

7.1 小结

FPGA是当前数字系统设计领域比较火热的一种工具,它可以大大缩短设计需要的时间,降低成本的同时也提高了系统的稳定性。使用VHDL语言描述硬件系统使得FPGA技术有了更广阔的应用领域。本设计使用了基于Altera公司的FPGA系列,采用Altera公司提供的系统开发工具Quartus II软件进行了系统的设计和仿真。数字信号发生器在实验室以及工业场所都被大量使用着,本系统即实现了可以输出四种波形的简易多功能波形发生器,仿真结果证明,该设计正确有效,可以作为制作实物的理论依据。但由于设计者能力有限,本系统仍然有着很多可改进的地方,比如可以升级为输出频率、幅值可调的波形,或者输出任意波形以更贴近实际情况。

7.2 心得体会

对FPGA一直都有着浓厚的兴趣,借做课设的机会,认真的研究了一下这门科学。发现FPGA技术比我想象中的要有很大的难度。里面有很多的思想来源于信息电子技术里面的基本知识,包括门电路的概念以及寄存器传送的基本知识。VHDL语言与C语言有很大的不同,但是C语言的编程思想也可以移植到VHDL语言中,尤其是一些逻辑算法的设计,需要有很强的C语言编程功底。学习一门知识要从最基本的体系架构开始,倘若一开始就从

辽东学院EDA教学实习报告

顶层设计入手,就会造成很多基本原理、基本概念上的偏差,甚至会拖延学习设计的时间,事倍功半。虽然课设完成了,但是我意识到,我对FPGA技术仅仅只是停留在入门的阶段,想要有更大的发展,更深入的研究,还需要更多的努力与实践。

辽东学院EDA教学实习报告

参考文献

[1] 蒋小燕,俞伟钧.EDA技术及VHDL.南京:东南大学出版社.2008年12月.[2] 李国丽,朱维勇.EDA与数字系统设计.北京:机械工业出版.2005年3月.[3] 江国强.EDA技术与实验.北京:电子工业出版社.2005年1月.[4] 欧伟明.基于MCU、FPGA、RTOS的电子系统设计方法与实例.北京:北京航空航天大学出版社.2007年4月 .[5] Charles H.Roth,Jr、Lizy Kurian John著,金明录译.数字系统设计与VHDL.北京:电子工业出版社.2008年8月

辽东学院EDA教学实习报告

附录

附录一:递增锯齿波程序

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity sawtooth_adder is port(clk,reset:in std_logic;

q:out std_logic_vector(7 downto 0)); end sawtooth_adder;

architecture behav of sawtooth_adder is begin proce(clk,reset)

variable tmp:std_logic_vector(7 downto 0);

begin

if reset=\'0\'then

tmp:=\"00000000\";

elsif rising_edge(clk) then

if tmp=\"11111111\"then

tmp:=\"00000000\";

else

tmp:=tmp+1;

end if;

end if; q

end proce;

end behav;

附录二:递减锯齿波程序

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity sawtooth_minus is port(clk,reset:in std_logic;

q:out std_logic_vector(7 downto 0)); end sawtooth_minus; architecture behav of sawtooth_minus is begin proce(clk,reset) variable tmp:std_logic_vector(7 downto 0); begin

if reset=\'0\'then

tmp:=\"11111111\";

elsif rising_edge(clk) then

--程序包

--定义clk、reset为输入信号 --定义q为输出信号 --实体

--定义进程

--定义变量,8位

--如果复位信号为0,tmp为0 --捕捉时钟上升沿

--如果tmp递增至最大,增归零

--否则,tmp继续递增

--q等于变量tmp --进程结束

--结构体结束

辽东学院EDA教学实习报告

if tmp=\"00000000\"then

tmp:=\"11111111\";

else

tmp:=tmp-1;

end if;

end if; q

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity triangle is

port(clk,reset:in std_logic;

q:out std_logic_vector(7 downto 0)); end triangle; architecture behav of triangle is

begin proce(clk,reset)

variable tmp:std_logic_vector(7 downto 0);

variable a:std_logic; begin

if reset=\'0\'then

tmp:=\"00000000\";

elsif rising_edge(clk) then

if a=\'0\'then

if tmp=\"11111110\"then

tmp:=\"11111111\";

a:=\'1\';

else

tmp:=tmp+1;

end if;

else

if tmp=\"00000001\"then

tmp:=\"00000000\";

a:=\'0\';

else

tmp:=tmp-1;

end if;

end if;

end if; q

end proce; end behav;

--程序包

--定义三角波实体

--定义三角波结构体 --进程开始

--定义中间变量tmp、a

--复位信号设置

--捕捉时钟信号上升沿

--a=0时依次输出三角波上升沿--a=1时依次输出三角波下降沿--输出信号q=tmp --结构体结束

辽东学院EDA教学实习报告

附录四:方波程序

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity square is port(clk,reset: in std_logic;

q:out std_logic_vector(7 downto 0)); end square; architecture behav of square is signal a:std_logic; begin proce(clk,reset)

variable tmp:std_logic_vector(7 downto 0);

begin

if reset=\'0\'then

a

elsif rising_edge(clk) then

if tmp=\"11111111\"then

tmp:=\"00000000\";

else tmp:=tmp+1;

end if;

if tmp

a

else

a

end if;

end if; end proce; proce(clk,a)

begin

if rising_edge(clk)then

if a=\'1\' then

q

else

q

end if;

end if; end proce; end behav; 附录五:四选一数据选择器程序

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity mux41 is

port(sel:in std_logic_vector(2 downto 0);

--程序包

--定义实体

--信号选择端口sel

辽东学院EDA教学实习报告

d1,d2,d3,d4: in std_logic_vector(7 downto 0);

--d1d2d3d4分别连接四个波形发生模块

q: out std_logic_vector(7 downto 0)); end mux41; architecture behav of mux41 is

begin

proce(sel)

begin

case sel is

when \"001\"=>q

when \"010\"=>q

when \"011\"=>q

when \"100\"=>q

when others=>null;

end case; end proce;

end behav;

--定义输出信号端口

--结构体

--case when语句进行信号位的选择

--进程结束

--结构体结束

简易信号发生器设计

简易函数信号发生器

简易正弦信号发生器的设计

简易函数信号发生器设计.doc

基于51单片机函数信号发生器设计.

基于51单片机函数信号发生器设计

单片机课程设计——中低频信号发生器设计

51单片机设计多功能低频函数信号发生器

函数信号发生器设计

信号发生器设计(推荐)

基于单片机设计的简易信号发生器资料
《基于单片机设计的简易信号发生器资料.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档