EDA设计实验题目:函数信号发生器作者:所在学院:信息科学与工程学院专业年级:指导教师:职称:2011 年12 月11 日函数信号发生器摘要:函数信号发生器在生产实践和科技领域有着广泛的应用。
本设计是采用了EDA技术设计的函数信号发生器。
此函数信号发生器的实现是基于VHDL语言描述各个波形产生模块,然后在QuartusⅡ软件上实现波形的编译,仿真和下载到Cyclone 芯片上。
整个系统由波形产生模块和波形选择模块两个部分组成。
最后经过QuartusⅡ软件仿真,证明此次设计可以输出正弦波、方波、三角波,锯齿波,阶梯波等规定波形,并能根据波形选择模块的设定来选择波形输出。
关键字:函数信号发生器;Cyclone;VHDL;QuartusⅡ引言:函数信号发生器即通常所说的信号发生器是一种常用的信号源,广泛应用于通信,雷达,测控,电子对抗以及现代化仪器仪表等领域,是一种为电子测量工作提供符合严格要求的电信号设备是最普通、最基本也是应用最广泛的电子仪器之一,几乎所有电参量的测量都要用到波形发生器。
随着现代电子技术的飞速发展,现代电子测量工作对函数信号信号发生器的性能提出了更高的要求,不仅要求能产生正弦波、方波等标准波形,还能根据需要产生任意波性,且操作方便,输出波形质量好,输出频率范围宽,输出频率稳定度、准确度、及分辨率高等。
本文基于EDA设计函数信号发生器,并产生稳定的正弦波、方波、锯齿波、三角波、阶梯波。
正文:1、Quartus II软件简介1)Quartus II软件介绍Quartus II 是Alera公司推出的一款功能强大,兼容性最好的EDA工具软件。
该软件界面友好、使用便捷、功能强大,是一个完全集成化的可编程逻辑设计环境,具有开放性、与结构无关、多平台完全集成化丰富的设计库、模块化工具、支持多种硬件描述语言及有多种高级编程语言接口等特点。
Quartus II是Altera公司推出的CPLD/FPGA开发工具,Quartus II提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,包括:可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;芯片平面布局连线编辑;功能强大的逻辑综合工具;完备的电路功能仿真与时序逻辑仿真工具;定时/时序分析与关键路径延时分析;可使用SignalTap II逻辑分析工具进行嵌入式的逻辑分析;支持软件源文件的添加和创建,并将它们链接起来生成编程文件;使用组合编译方式可一次完成整体设计流程;自动定位编译错误;高效的期间编程与验证工具;可读入标准的EDIF网表文件、VHDL网表文件和Verilog网表文件;能生成第三方EDA软件使用的VHDL网表文件和Verilog网表文件。
2)Quartus II软件设计流程(1)打开Quartus II软件。
(2)选择路径。
注意:工作目录名不能有中文。
(3)添加设计文件。
(4)选择FPGA器件。
Family选择Cyclone,240,8。
(5)建立原理图或用VHDL语言描述设计电路。
(6)对原理图或用VHDL语言进行编译,无误后进行添加信号。
(7)对上述电路进行仿真。
(8)进行管脚分配。
(9)全局编译。
(10)采用JTAG或AS模式进行下载测试。
图1Quartus II软件运行界面2、设计主要任务及要求:a)波形选择:通过对拨码开关状态的设置选择不同的输出波形。
b)波形发生:通过软件实现各类波形的产生(数字量)。
c)波形清零:通过拨码开关状态的改变,输出直流波。
d)波形的观测:实现波形的数/模转换,便于直接在示波器上观察输出波形。
3、设计方案、原理、过程、调试(1)总体方案本论文设计的函数信号发生器主要由波形选择部分,波形发生部分和输出部分组成,其硬件结构图如图1所。
其中波形选择部分是数据选择器电路;波形发生部分包括递增斜波产生电路,递减斜波产生电路,三角波产生电路,斜梯波产生电路,正弦波产生电路和方波产生电路;输出部分是数/模转换电路。
其中数/模转换模块是通过硬件实现的,其它都是依靠软件实现的。
根据实验箱的硬件资源,本次设计选用ALTERA公司MAX7000S系列的EPM7128SLC84-15作为主控芯片。
它是一种基于乘积项结构的复杂可编程逻辑器件,它的基本逻辑单元是由一些与、或阵列加上触发器构成,其中与或阵列完成组合逻辑功能,触发器完成时序逻辑。
它的逻辑控制灵活,可反复编程,有利于系统的扩展和修改,而且其集成度高,保密性好。
在实际应用中,它体积小、功耗低、价格便宜,维护和升级都十分方便,具有较好的应用前景。
图2 硬件结构图数模转换器原理D/A转换器输入的是数字量,经转换后输出的是模拟量。
有关D/A转换器的技术性能很多,例如分辨率、建立时间、接口形式、偏移量误差以及线形度等等。
分辨率是D/A转换器对输入量变化敏感程度的描述,与输入数字量的位数有关。
数字量位数越多,分辨率也就越高。
建立时间是描述D/A转换速度快慢的一个参数,指从输入数字量变化到输出并达到终值误差正负(1/2)LSB(最低有效位)时所需时间。
通常以建立时间来表示转换速度。
D/A转换器与微机借口方便与否,主要决定于转换器本身是否带数据锁存器。
总的来说有两类D/A转换器,一类是不带锁存器的,另一类是带锁存器的。
带锁存器的D/A转换器,可以把它看作一个输出口,因此可直接在数据总线上,而不是另加锁存器。
偏移量误差是指输入数据量为0的时候,输出模拟量对0的偏移量。
这种误差可以通过DAC的外接VREF和电位计加以调整。
线形度是指DAC的实际转换特性曲线和理想直线之间的最大偏差。
D/A转换器有2大类:一类是在电子线路中使用,不能使能控制端口,只有数字量输入和模拟量输出;另一类带有使能控制端口,可以与微机直接连接。
此实验中采用后者的LM358,以实现数字信号到模拟信号的转换。
LM358转换模块8位D/A,I/O口定义如下:D0~D7:数据总线,输入口;/CE:转换允许,低电平有效;/CS:片选,低电平有效;有两种输出方式。
第一种,将短路子接在左侧的两个铜柱上,D/A转换输出到D/A OUT区域的第六个孔输出;第二种,将短路子接在右侧的两个铜柱上,D/A转换输出接到LM358的同相输入端。
LM358单电源二运放。
与AD558配合,将AD558的输出接到LM358的同相输入端,作为他的同相输入信号;在LM358的右上脚,有TEST IN模块,他的信号可作为LM358的反相输入端。
(2)单元电路的设计递增锯齿波信号产生模块a)代码:L IBRARY IEEE;--锯齿波递增USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY juchibo_add ISPORT (clk,reset:in std_logic;q:out std_logic_vector(7 downto 0));END;ARCHITECTURE behave OF juchibo_add ISBEGINPROCESS(clk,reset)VARIABLE tmp: std_logic_vector(7 downto 0);BEGINIF reset='0' THENtmp:="00000000";ELSIF clk' event and clk='1' THENIF tmp="11111111" THENtmp:="00000000";ELSEtmp:=tmp+1;END IF;END IF;q<=tmp;END PROCESS;END;b)递增锯齿波仿真波形:图3递增锯齿波仿真波形c)递增锯齿波信号产生模块元件图:图4递增锯齿波元件图递减锯齿波信号产生模块a)代码:LIBRARY IEEE;--锯齿波递减USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY juchibo_jie ISPORT ( clk,reset:in std_logic;q:out std_logic_vector(7 downto 0));END;ARCHITECTURE behave OF juchibo_jie ISBEGINPROCESS(clk,reset)VARIABLE tmp: std_logic_vector(7 downto 0);BEGINIF reset='0' THENtmp:="11111111";ELSIF clk'event and clk='1' THENIF tmp="00000000" THENtmp:="11111111";ELSEtmp:=tmp-1;END IF;END IF;q<=tmp;END PROCESS;END;b)递减锯齿波仿真波形:图5递减锯齿波原件图c)递减锯齿波信号产生模块元件图:图6递减锯齿波元件图三角波信号产生模块a)代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sanjiaobo isport(reset:in std_logic;clk:in std_logic;q:out std_logic_vector(7 downto 0));end;architecture behave of sanjiaobo isbeginprocess(clk,reset)variable tmp:std_logic_vector(7 downto 0); variable a:std_logic;beginif reset='0' then q<="00000000";elsif clk'event and clk='1' thenif a='0' thenif tmp="11111110" thentmp:="11111111";a:='1';else tmp:=tmp+1;end if;elseif tmp="00000001" thentmp:="00000000";a:='0';else tmp:=tmp-1;end if;end if;end if;q<=tmp;end process;end;b)三角波仿真波形:图7三角波仿真波形c)三角波信号产生模块元件图:图8三角波元件图阶梯波信号产生模块a)代码:library ieee;--阶梯波use ieee.std_logic_1164.all;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jietibo ISPORT (clk,reset:in std_logic;q:out std_logic_vector(7 downto 0));END;ARCHITECTURE behave OF jietibo ISBEGINPROCESS(clk,reset)VARIABLE tmp: std_logic_vector(7 downto 0);BEGINIF reset='0' THENtmp:="00000000";ELSIF clk 'event and clk='1' THENIF tmp="11111111" THENtmp:="00000000";ELSEtmp:=tmp+16;END IF;END IF;q<=tmp;END PROCESS;END;b)阶梯波仿真波形:图9阶梯波仿真波形c)阶梯波信号产生模块元件图:图10阶梯波元件图方波信号产生模块a)代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fangbo isport(clk,reset:in std_logic;q:out std_logic_vector(7 downto 0));end;architecture behave of fangbo issignal a:std_logic;beginprocess(clk,reset)variable tmp:std_logic_vector(7 downto 0);beginif reset='0' thena<='0';elsif clk'event and clk='1' thenif tmp="11111111" thentmp:="00000000";elsetmp:=tmp+1;end if;if tmp<="10000000" thena<='1';elsea<='0';end if;end if;end process;process(clk,a) --信号输出beginif clk'event and clk='1' thenif a='1' thenq<="11111111";elseq<="00000000";end if;end if;end process;end;b)方波仿真波形:图11方波仿真波形c)方波信号产生模块元件图:图12方波元件图正弦波信号产生模块正弦波产生模块Zhengxianbo:a)代码:library ieee; --正弦波use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity Zhengxianbo isport(clk,clr:in std_logic;d:out integer range 0 to 255);end;architecture behave of Zhengxianbo isbeginprocess(clk,clr)variable tmp:integer range 0 to 63;beginif clr='0' thend<=0;elsif clk'event and clk='1' thenif tmp=63 thentmp:=0;elsetmp:=tmp+1;end if;case tmp iswhen 00=>d<=255; when 01=>d<=254; when 02=>d<=252;when 03=>d<=249; when 04=>d<=245; when 05=>d<=239;when 06=>d<=233; when 07=>d<=225; when 08=>d<=217;when 09=>d<=207; when 10=>d<=197; when 11=>d<=186;when 12=>d<=174; when 13=>d<=162; when 14=>d<=150;when 15=>d<=137; when 16=>d<=124; when 17=>d<=112;when 18=>d<=99; when 19=>d<=87; whenwhen 21=>d<=64; when 22=>d<=53; when 23=>d<=43;when 24=>d<=34; when 25=>d<=26; when 26=>d<=19;when 27=>d<=13; when 28=>d<=8; when 29=>d<=4;when 30=>d<=1; when 31=>d<=0; when 32=>d<=0;when 33=>d<=1; when 34=>d<=4; when 35=>d<=8;when 36=>d<=13; when 37=>d<=19; when 38=>d<=26;when 39=>d<=34; when 40=>d<=43; when 41=>d<=53;when 42=>d<=64; when 43=>d<=75; when 44=>d<=87;when 45=>d<=99; when 46=>d<=112; when 47=>d<=124;when 48=>d<=137; when 49=>d<=150; when 50=>d<=162;when 51=>d<=174; when 52=>d<=186; whenwhen 54=>d<=207; when 55=>d<=217; when 56=>d<=225;when 57=>d<=233; when 58=>d<=239; when 59=>d<=245;when 60=>d<=249; when 61=>d<=252; when 62=>d<=254;when 63=>d<=255; when others=>null;end case;end if;end process;end;b)正弦波仿真波形:图13正弦波仿真波形c)正弦波信号产生模块元件图:图14正弦波元件图波形输出选择器模块a)代码:LIBRARY IEEE;--选择器USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY Xuanzeqi ISPORT ( sel: in std_logic_vector(2 downto 0);d1,d2,d3,d4,d5,d6:in std_logic_vector(7 downto 0);q:out std_logic_vector(7 downto 0));END;ARCHITECTURE behave OF Xuanzeqi isBEGINPROCESS(sel)BEGINCASE sel ISWHEN "001"=>q<=d1;--锯齿波递增WHEN "010"=>q<=d2; --锯齿波递减WHEN "011"=>q<=d3; --三角波WHEN "100"=>q<=d4; --阶梯波WHEN "101"=>q<=d5; --方波WHEN "110"=>q<=d6; --正弦波WHEN OTHERS=>null;END CASE;END PROCESS;END;b)选择器仿真波形:图15选择器波形图c)选择器信号产生模块元件图:图16选择器元件图函数发生器的顶层设计(1)将上述模块生成符号,供顶层电路调用。