1、EDA课程设计简易信号发生器的设计实现小组成员:XXXXXXXXXXX专业: XXXXX学院: 机电与信息工程学院指导老师:XXXXXX完成日期:XX年XX月XX日目录引言3一、课程设计内容及要求31、设计内容32、设计要求3二、设计方案及原理31、设计原理32、设计方案4(1)设计思想4(2)设计方案43、系统设计5(1)正弦波产生模块5(2)三角波产生模块6(3)锯齿波产生模块6(4)方波产生模块6(5)波形选择模块6(6)频率控制模块6(7)幅度控制模块6(8)顶层设计模块7三、仿真结果分析7波形仿真结果71、正弦波仿真结果72、三角波仿真结果83、锯齿波仿真结果84、方波仿真结果85、
2、波形选择仿真结果96、频率控制仿真结果9四、总结与体会10五、参考文献10六、附录11简易信号发生器引言信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广范的应用。它能够产生多种波形,如正弦波、三角波、方波、锯齿波等,在电路实验和设备检验中有着十分广范的应用。本次课程设计采用FPGA来设计多功能信号发生器。一、 课程设计内容及要求1、 设计内容设计一个多功能简易信号发生器2、 设计要求(1) 完成电路板上DAC的匹配电阻选择、焊接与调试,确保其能够正常工作。(2) 根据直接数字频率合成(DDFS)原理设计正弦信号发生器,频率步进1Hz,最高输出频率不限,在波形不产生失真(从输出1KHz
3、正弦转换为输出最高频率正弦时,幅度衰减不得大于10%)的情况下越高越好。频率字可以由串口设定,也可以 由按键控制,数码管上显示频率傎。(3) 可以控制改变输出波形类型,在正弦波、三角波、锯齿波、方波之间切换。(4) 输出波形幅度可调,最小幅度步进为100mV。二、 设计方案及原理1、 设计原理(1) 简易信号发生器原理图如下2、 设计方案(1) 设计思想本设计基于VHDL编程,采用模块化电路进行整合。系统各模块所需工作时钟信号由输入系统时钟信号经分频后得到,系统时钟输入端应满足输入脉冲信号的要求。组合波形信号经显示模块输出。具备幅度和频率可调功能,幅度可通过电位器调整,频率控制模块则是一个简易
4、的计数器,控制步径为100HZ的可调频率,最终送至脉冲发生模块输出脉冲信号,达到设计课题所要求的输出波形频率可调及幅度可调功能。幅度可调功能由于比较简单,可以在FPGA外部利用硬件电路实现。控制电路正弦波、方波、三角波信号产生模块输出电路波形组合选择模块滤波电路幅度控制/电位器100HZ1KHZ频率控制模块/计数器模块1KHZFPGA图1 总体设计框图(2) 设计方案采用DDS(直接数字频率合成器)来设计,设计总体框图如图2所示。DDS器件采用高速数字电路和高速D/A转换技术,具有频率转换时间短、频率分辨率高、频率稳定度高、输出信号频率和相位可快速程控切换等优点,所以,我们可以利用DDS具有很
5、好的相位控制和幅度控制功能,另外其数据采样功能也是极具精确和完善的,它可以产生较为精确的任何有规则波形信号,可以实现对信号进行全数字式调制。用FPGA和DDS实现信号调制,既克服了传统的方法实现带来的缺点,若采用它来编程设计,必定会事半功倍,且使设计趋于理想状态。DDS的主要参数间的关系如下:频率分辨率=系统时钟频率/212;频率控制字(FTW)=f*212/T;图2 DDS系统结构框图3、 系统设计(1) 正弦波产生模块正弦波产生模块由相位累加器和查找表组成,相位累加器用于实现相位的累加并存储其累加结果;查找表由ROM生成,其存储的数据是每一个相位所对应的二进制数字正弦幅傎,在每一个时钟周期
6、内,相位累加器输出序列的高n位对其进行寻址,最后输出为该相位对应的二进制正弦幅傎序列。ROM及查找表为如下ROM为: 查找表为:(2) 三角波产生模块 (3) 锯齿波产生模块 (4) 方波产生模块 以上几个波形的产生也是基于ROM查找表,ROM的六位地址为输入端,输出端是八位,到时钟脉冲的上升沿到来时依次从地址中读出数据,得到相应的波形。(5) 波形选择模块这一模块主要原理是根据一个四选一多路选择器来选择输出四种不同的波形,然后通过一个按键对波形进行循环选择,按下确认按钮后进行波形的调用。(6) 频率控制模块本模块要求频率步进1Hz,最高输出频率不限,在本设计中由20MHz的信号源经分频后得到
7、,根据用户需要的频率,通过编程把频率控制数值传送给各个模块,从而实现频率的控制。(7) 幅度控制模块本模块要求输出波形幅度可调,在0-3.3V之间变动,最小幅度步进100mV。通过一个乘法电路和一个除法电路实现。(8) 顶层设计模块三、 仿真结果及分析1、正弦波仿真波形分析:clk :输入的时钟信号;dout :上升沿到来时,输出正弦波取样点的数值;示波器显示为2、三角波仿真波形分析:Clk :输入的时钟信号;Dout:上升沿到来时,输出三角波的取样值;示波器显示为3、锯齿波仿真波形分析:clk: 输入的时钟信号;dout: 上升沿到来时,输出锯齿波的取样值;示波器显示为4、 方波仿真波形分析
8、:clk:输入的时钟信号;dout: 上升沿到来时,输出方波的取样值;示波器显示为5、 波形选择仿真波形分析:reset:复位键,可使系统恢复初始状态;a:按键的次数,累加循环;d1:输入对应的是正弦波,可连接到正弦波输出端;d2:输入对应的是方波,可连接到方波输出端;d3:输入对应的是锯齿波,可连接到锯齿波输出端;d4:输入对应的是三角波,可连接到三角波输出端;q:输出选择后的波形;6、 频率控制(分频)仿真波形分析:ffclk:晶振的频率;cp:分频后的频率;四、 总结及体会通过此次课程设计,让我们深切的体会到自己所学知识的浅薄。众所周知,EDA技术正在成为现代电子设计技术的核心,利用ED
9、A技术进行电路设计已经成为不可阻挡的趋势。本设计使用了基于Alter 公司的FPGA系列,采用由Alter公司提供的系统开发工具Quartus软件进行系统的设计和仿真。数字信号发生器在实验及工业场所都有着重要的应用,本次实验设计的能够输出四种波形的简易多功能信号发生器,其仿真结果表明本次设计是正确有效的,但由于设计者能力有限,本次设计仍有许多值得改进的地方。在设计过程当中,遇到了软件操作不熟练,程序编写不规范等诸多问题,通过对问题的总结分析得出,应用软件的主要功能必须熟练操作,才能提高工作效率,需要规范操作的地方必须严格按照使用说明操作,避免由于软件使用不当造成的错误产生。程序的编写格式必须规
10、范,模块、端口以及信号变量的命名应当反映实际意义,缩进格式工整明了,方便阅读理解,这样有利于程序的编写,有利于分析调试,也有利于程序的重复使用。总的来说,在这次课程设计过程中我们学到了很多,既复习了以前学过的Quartus软件,算是对以前学过知识的查缺补漏,又锻炼了我们遇到问题、分析并解决问题的能力,能够有针对性地查找资料,然后加以吸收利用,以提高自己的应用能力,而且还能增长自己见识,补充最新的专业知识。相信通过此次设计的锻炼,我们对专业知识和技能的掌握将更加牢靠,在今后的工作和学习中,必将使我们受益匪浅,取得应有的优势。五、 参考文献1潘松、黄继业,EDA技术实用教程M,北京:科学出版社,2
11、010.05,338344.2黄仁欣,EDA技术实用教程M,北京:清华大学出版社,2006.09,199200.3蒋小燕、俞伟钧,EDA技术及VHDLM,南京:东南大学出版社,2008.12,230236.六、 附录1、 正弦波程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned;entity singt isport(clk:in std_logic; dout:out integer range 255 downto 0);end;architecture dacc of singt issignal
12、q :integer range 63 downto 0;signal d :integer range 255 downto 0;signal d1:integer range 255 downto 0;begin process(clk)begin if clkevent and clk=1 thenif q63 then q=q+1;else q d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d
13、d d dnull;end case;if clkevent and clk=1 then d1=d; end if;end process;dout=d1;end;2、 三角波程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned;entity sanjiaogt isport(clk:in std_logic; dout:out integer range 255 downto 0);end;architecture dacc of sanjiaogt issignal q :integer range
14、63 downto 0;signal d :integer range 255 downto 0;signal d1:integer range 255 downto 0;begin process(clk)begin if clkevent and clk=1 thenif q63 then q=q+1;else q d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d dnull;end cas
15、e;if clkevent and clk=1 then d1=d; end if;end process;dout=d1;end;3、 锯齿波程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned;entity juchigt isport(clk:in std_logic; dout:out integer range 255 downto 0);end;architecture dacc of juchigt issignal q :integer range 63 downto 0;signal d
16、:integer range 255 downto 0;signal d1:integer range 255 downto 0;begin process(clk)begin if clkevent and clk=1 thenif q63 then q=q+1;else q d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d dnull;end case;if clkevent and clk
17、=1 then d1=d; end if;end process;dout=d1;end;4、 方波程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned;entity fanggt isport(clk:in std_logic; dout:out integer range 255 downto 0);end;architecture dacc of fanggt issignal q :integer range 63 downto 0;signal d :integer range 255 downt
18、o 0;signal d1:integer range 255 downto 0;begin process(clk)begin if clkevent and clk=1 thenif q63 then q=q+1;else q d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d dnull;end case;if clkevent and clk=1 then d1=d; end if;end
19、 process;dout=d1;end;5、 波形选择程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity wav_sel isport( a:in std_logic; reset:in std_logic; d1,d2,d3,d4:in integer range 255 downto 0; q:out integer range 255 downto 0);end wav_sel;architecture behav o
20、f wav_sel issignal k:integer range 3 downto 0:=0;begin process(a,reset)beginif reset=0 then q=d1;else if aevent and a=1 then if k3 then k=k+1;else k q q q q=d4;end case;end process;end behav; 6、 频率控制程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin isport(ffclk
21、:in std_logic; cp:out std_logic);end;architecture str of fenpin issignal count:integer range 0 to 500;signal clk_data:std_logic;beginprocess(ffclk,count)begin if ffclkevent and ffclk=1 then if count=50 then count=0; clk_data=not clk_data; else count=count+1; end if;end if;cp=clk_data;end process;end
22、 str;7、 幅度控制程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity fudugt isport (d:in integer range 255 downto 0; temp,reset:in std_logic; fout:out integer range 65535 downto 0);end;architecture behav of fudugt issignal d1:integer range 65535
23、downto 0;signal k:integer range 255 downto 0:=1;beginprocess(temp)beginif reset=0 then d1=0;elseif tempevent and temp=1 then k=k+1; end if;end if;d1=d*k; end process;fout=d1;end;8、 数码管显示程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;entity display isport(cp1:in std_logic; k
24、:in std_logic_vector(5 downto 0); m:in std_logic_vector(4 downto 0); show:out std_logic_vector(7 downto 0); sel:out std_logic_vector(3 downto 0) );end display;architecture behavior of display is signal count:integer range 0 to 3;signal sel_1:std_logic_vector(3 downto 0);signal p0,p1,p2,p3:integer ra
25、nge 0 to 9;signal show1:std_logic_vector(7 downto 0); begin process(cp1) begin if(cp1event and cp1=1)then if count=3 then count=0; else countp0=0;p1p0=1;p1p0=2;p1p0=3;p1p0=4;p1p0=5;p1p0=6;p1p0=7;p1p0=8;p1p0=9;p1p0=0;p1p0=1;p1p0=2;p1p0=3;p1p0=4;p1p0=5;p1p0=6;p1p0=7;p1p0=8;p1p0=9;p1p0=0;p1p0=1;p1p0=2;p1p0=3;p1p0=4;p1p0=5;p1p0=6;p1p0=7;p1p0=8;p1p0=9;p1p0=0;p1p0=1;p1p0=2;p1p0=3;p1p0=4;p1p0=5;p1p0=6;p1p0=7;p1p0=8;p1p0=9;p1p0=0;p1p0=1;p1p0=2;p1p0=3;p1p0=4;p1p0=5;p1p0=6;p1p0=7;p1p0=8;p1p0=9;p1p0=0;p1p0=1;p1p0=2;p1p0=3;p1p0=4;p1p0=5;p1p0=6;p1p0=7;p1p0=8;p1p0=9;p1=5; whe