多功能信号发生器的设计_毕业设计(15页).doc
-多功能信号发生器的设计_毕业设计-第 14 页多功能信号发生器的设计目 录0引言21设计意义32设计说明42.1设计任务42.1.1设计要求42.1.2 设计目的:43设计过程53.1系统顶层框图53.1.1信号发生器结构图53.1.2信号发生器的内部构成53.1.3系统流程图63.2设计步骤63.3系统设计74代码及仿真结果84.1各个模块的实现84.2顶层模块165小结及体会196参考文献200 引言信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。它能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波等,在电路实验和设备检测中具有十分广泛的用途。例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频)、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。在工业、农业、生物医学等领域内,如高频感应加热、熔炼、淬火、超声诊断、核磁共振成像等,都需要功率或大或小、频率或高或低的信号发生器。本设计采用FPGA来设计制作多功能信号发生器。该信号发生器可以产生正弦波、方波、三角波、锯齿波等波形。 1 设计意义本次课设要求设计一个函数信号发生器。它能产生四种波形:正弦波、方波、三角波、锯齿波。同时能在不同的频率下显示。这次设计主要是练习了分频电路的设计,ROM的设计,计数器的设计、选择电路的设计和数码显示的设计。加强了对when语句,if语句等语句的理解。拓展了对VHDL语言的应用。平时练习与考试都是设计一个简单的电路,本次课设综合了好几个电路的设计。同时我也增强了对分模块设计电路的应用。对我以后的电路设计生涯都是有所帮助的!函数信号发生器是应用了VHDL语言,通过数模转换来显示波形,实现了数模转换的应用。在工作中,我们常常会用到信号发生器,它是使用频度很高的电子仪器。信号发生器是指产生所需参数的电测试信号的仪器。按信号波形可分为正弦信号、函数(波形)信号、脉冲信号和随机信号发生器等四大类。信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。各种波形曲线均可以用三角函数方程式来表示。能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波的电路被称为函数信号发生器。信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。凡是产生测试信号的仪器,统称为信号源,也称为信号发生器,它用于产生被测电路所需特定参数的电测试信号。信号源主要给被测电路提供所需要的已知信号(各种波形),然后用其它仪表测量感兴趣的参数。可见信号源在电子实验和测试处理中,并不测量任何参数,而是根据使用者的要求,仿真各种测试信号,提供给被测电路,以达到测试的需要。它能够产生多种波形,如三角波、矩形波(含方波)、正弦波等,在电路实验和设备检测中具有十分广泛的用途。例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频)、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。在工业、农业、生物医学等领域内,如高频感应加热、熔炼、淬火、超声诊断、核磁共振成像等,都需要功率或大或小、频率或高或低的信号发生器。 本设计采用EDA来设计制作多功能信号发生器。该信号发生器可以产生正弦波、方波、三角波、锯齿波等波形。2设计说明2.1设计任务2.1.1设计要求:基于VHDL语言,通过给定的仪器(EDA6000试验箱)设计一个多功能信号发生器, (1)能产生周期性正弦波、方波、三角波、锯齿波以及用户自己编辑的特定波形;(2)输出信号的频率范围为100Hz200KHz,且输出频率可以调节;(3)具有显示输出波形、频率的功能。2.1.2 设计目的:1) 掌握使用EDA工具设计信号发生器系统的设计思路和设计方法,体会使用EDA综合过程中电路设计方法和设计思路的不同,理解层次化设计理念。2) 熟悉在Quartus II环境中,用文本输入方式与原理图输入方式完成电路的设计,同时掌握使用这两种方式相结合的EDA设计思路。3) 通过这一部分的学习,对VHDL语言的设计方法进行进一步的学习,对其相关语言设计规范进行更深层次的掌握,能够更加熟练的做一些编程设计。3 设计过程3.1系统顶层框图 3.1.1信号发生器结构图由于FPGA/CPLD只能直接输出数字信号,而多功能信号发生器输出的各种波形均为模拟信号,因此设计信号发生器时,需将FPGA/CPLD输出的信号通过D/A转换电路将数字信号转换成模拟信号。多功能信号发生器可由信号产生电路,波形选择电路和D/A转换电路构成,如下图所示: 时钟信号信号产生电路波形选择电路D/A转换波形输出选择信号3.1.2信号发生器的内部构成数控分频器三角波波形数据正弦波波形数据方波波形数据任意波形数据数据选择器波形选择关时钟预置分频数(0-255)复位信号8位数据图1 原理框图在原理框图中,正(余)弦查找表由ROM构成,内部存有一个完整周期正(余)弦波的数字幅度信息,每个查找表的地址对应正(余)弦波幅度信号,同时输出到数模转换器(DAC)输入端,DAC输出的模拟信号经过低通滤波器(LPF),可以得到一个频谱纯净的正(余)弦波。3.1.3系统流程图 当输入端有时钟信号输入时,各个信号发生器模块独立运行,独立存在,发出各种信号,这些信号作为数据选择器的输入信号,在数据选择器的作用下,波形切换到相应的模块输出,再通过数模转换器(D/A),将通过示波器显示出相应的波形图,其程序流程图如下图所示:输入信号各个信号发生器模块开始输出信号数模转换器(D/A)四选一数据选择器复位3.2设计步骤 用VHDL语言结合原理图设计实现一个函数信号发生器,输出正弦波、方波和三角波三种波形。将频率控制、分频、三角波、正弦波、方波发生邓各个模块分别用VHDL语言编程为一个子程序,并把每一个模块转换成图形文件,然后在原理图编辑框调用这些图形模块,连接电路如上图系统顶层框图所示。通过按键1到按键8控制频率调节f7.0,用按键6、按键7、按键8控制dlt、sin、sqr波形选通,最后把八位输出接DAC0832通过D/A转换,从示波器上就能看到波形输出。按下不同的按键输出不同的波形及频率。3.3系统设计 (1)数控分频器模块在时钟的作用下,通过预置分频数DIN,来改变输出频率。假如分频系数为N,波形存储模块存储一个周期的波形,实验里按照一个周期波形采样64个点存储在波形存储模块里。则输出频率(2)数据存储模块 (存储波形数据)数据存储模块主要存的是正弦波、三角波、锯齿波等一个周期的采样点。三角波模块可设计一个可逆计数器实现,设计时设置一变量作为工作状态标志,在此变量为0时,当检测到时钟的上升沿进行加同一个数操作;为1时,进行减同一个数操作。DA转换采用的DA0832,输入有8个数据端,范围是0到255;而且设置64个时钟周期为一个三角波周期,所有每次加、减为1。锯齿波的存储数据与三角波类似。方波可以通过交替输出全0和全1,并给以32个周期的延时来实现。正弦波可以通过波形变换实现把 变换成的形式进行采样,然后变换成8位二进制码,存储在波形存储器里。(3)数据选择器模块在波形开关的控制下,选择相应的波形输出。可以用3个按键来控制波形选择4 代码及仿真结果4.1各个模块的实现4.1.1数控分频器的实现其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin is port(d_mode:in std_logic_vector(3 downto 0); clk:in std_logic; d_out:out std_logic);end fenpin;architecture behav of fenpin is signal full:std_logic; begin p_reg: process(clk) variable cnt8:std_logic_vector(3 downto 0); begin if clk'event and clk='1' then if cnt8="1111" then cnt8:=d_mode; full<='1' else cnt8:=cnt8+1; full<='0' end if; end if; end process p_reg;p_div:process(full) variable cnt2:std_logic; begin if full'event and full='1' then cnt2:=not cnt2; if cnt2='1' then d_out<='1' ; else d_out<='0' end if; end if;end process p_div;end behav; 频率为1MHz的分频波形图:其生成元器件如图2所示:图2 数控分频器器件生成图4.1.2方波的实现产生方波,是通过交替送出全0和全1实现,每32个时钟翻转一次。其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;entity square is port(clk,clr:in std_logic; q:out integer range 0 to 255); end square;architecture one of square issignal a:bit:='0' begin process(clk,clr) variable cnt:integer range 0 to 31; begin if clr='0' then a<='0' elsif clk'event and clk='1' then if cnt<31 then cnt:=cnt+1; else cnt:=0; a<=not a; end if; end if; end process; process(clk,a) begin if clk'event and clk='1' then if a='1' then q<=255; else q<=0; end if; end if; end process;end one;其仿真波形如图3所示:图3 方波仿真图其生成元器件如图4所示:图4 方波元器件生成图4.1.3三角波的实现该模块产生的三角波以64个时钟为一个周期,输出q每次加减8。其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity delta is port(clk,reset:in std_logic; q:out std_logic_vector(7 downto 0); end delta;architecture delta_arc of delta isbegin process(clk,reset) variable tmp:std_logic_vector(7 downto 0); variable a:std_logic; begin if reset='0' then tmp:="00000000" elsif clk'event and clk='1' 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<=tmp; end process;end delta_arc;其仿真波形如图5所示:图5 三角波仿真图其生成元器件如图6所示:图6 三角波元器件生成图4.1.4正弦波的实现该模块产生以64个时钟为一个周期的正弦波。其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sin is port(clk,clr:in std_logic; d:out integer range 0 to 255);end sin;architecture sin_arc of sin isbegin process(clk,clr) variable tmp:integer range 0 to 63; begin if clr='0' then d<=0; elsif clk'event and clk='1' then if tmp=63 then tmp:=0; else tmp:=tmp+1; end if; case tmp is when 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; when 20=>d<=75; when 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; when 53=>d<=197; when 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 sin_arc;其仿真波形如图7所示:图7 正弦波仿真图其生成元器件如图8所示:图8 正弦波元器件生成图4.1.5锯齿波的实现改变该模块递增的常数,可以改变锯齿的个数。其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ladder is port(clk,reset:in std_logic; q:out std_logic_vector(7 downto 0);end ladder;architecture ladder_arc of ladder isbegin process(clk,reset) variable tmp:std_logic_vector(7 downto 0); begin if reset='0' then tmp:="00000000"elsif clk'event and clk='1' then if tmp="11111111" then tmp:="00000000" else tmp:=tmp+16; -锯齿常数为16,可修改 end if; end if; q<=tmp; end process;end ladder_arc;其仿真波形如图9所示:图9 锯齿波仿真图其生成元器件如图10所示:图10 锯齿波元器件生成图4.1.6四选一输出波形选择模块的实现根据外部的开关状态可以选择输出的波形。其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;entity select4_1 is port(sel:in std_logic_vector(1 downto 0); d0,d1,d2,d3:in std_logic_vector(7 downto 0); q:out std_logic_vector(7 downto 0);end select4_1;architecture one of select4_1 isbegin process(sel) begin case sel is when "00"=>q<=d0; when "01"=>q<=d1; when "10"=>q<=d2; when "11"=>q<=d3; end case; end process;end one;其波形仿真如图11所示:图11 四选一信号选择仿真图其生成元器件如图12所示:图12 4选1信号选择元器件生成图4.2顶层模块4.2.1代码实现VHDL代码如下,利用元件例化实现:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity li is port(d_mode:in std_logic_vector(3 downto 0);q:out std_logic_vector(7 downto 0); clk:in std_logic; resel:out std_logic);end li;architecture behav of li iscomponent fenpin is port(d_mode:in std_logic_vector(3 downto 0); clk:in std_logic; d_out:out std_logic);end component fenpin;component square is port(clk,clr:in std_logic; q:out integer range 0 to 255); end component square;component delta is port(clk,reset:in std_logic; q:out std_logic_vector(7 downto 0); end component delta;component sin is port(clk,clr:in std_logic; d:out integer range 0 to 255);end component sin;component ladder is port(clk,reset:in std_logic; q:out std_logic_vector(7 downto 0);end component ladder;component select4_1 is port(sel:in std_logic_vector(1 downto 0); d0,d1,d2,d3:in std_logic_vector(7 downto 0); q:out std_logic_vector(7 downto 0);end component select4_1;signal square :std_logic;signal delta :std_logic;signal sin :std_logic;signal ladder :std_logic;signal d0 :std_logic_vector(7 downto 0);signal d1 :std_logic_vector(7 downto 0);signal d2 :std_logic_vector(7 downto 0);signal d3 :std_logic_vector(7 downto 0);beginwen1: fenpin port map(d_mode=>d_mode,clk=>clk, d_out=>square,d_out=> delta, d_out=> sin, d_out=> ladder);wen2: square port map(clr=>resel,clk=> square, q=> d0);wen3: delta port map(resel =>resel,clk=> delta, q=> d1);wen4: sin port map(clr=>resel,clk=> sin, q=> d2);wen5: ladder port map(resel =>resel,clk=> ladder, q=> d3);wen6: select4_1 port map(sel => sel, d0=> d0, d1=> d1, d2=> d2,d3=>d3,q=>q);end behav;4.2.2生成整体RTL:新建一工程,加载上述模块,利用顶层模块法生成整体多波形信号发生器。整体RTL图如图13所示:图13 整体多波形信号发生器RTL图4.2.3整体仿真图整体多波形信号发生器仿真如图14所示:图14 整体多波形信号发生器仿真图其中,d_mode【3.0】为数控分频输入端,接四个开关用来产生预制分频数,分频后得到不同频率的脉冲,sel【1.0】为数据选择器的选择输入端,接两个开关,输入不同数据,选择四种波形中的一种输出,clk是原始脉冲输入端,reset为复位端,接一按键,按下时产生复位,回到初始状态;q【7.0】是数据选择器的输出端,输出被选中的波形送至DA转换器。5 小结及体会通过这次课程设计,我全面熟悉、掌握VHDL语言的基本知识,掌握利用VHDL语言对信号发生器的编程和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高动手能力,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。同时通过此次实验,使我对Quartus II软件的使用有了更深刻的了解。在设计的过程中,也遇到了很多问题,在同学和指导老师的帮助下,都一一得到了解决。从选题到定稿,从了解到熟悉,用了大概一个星期的时间,在这段时间内,苦恼、思考、喜悦、收获,感受颇多。当然此次设计也体现出我平时学习中有许多不足和欠缺之处,此后需通过学习来查漏补缺。6 参考文献1李翠华. 信号发生器的设计J. 科技广场, 20092申彦春, 王欢, 梁延贵. 基于FPGA的信号发生器的设计J. 唐山学院学报, 20083刘皖, 何道军, 谭明. FPGA设计与应用M. 北京清华大学出版社, 20064赵雅兴. FPGA原理设计与应用M. 天津大学出版社, 19995余勇, 郑小林.基于FPGA的DDS正弦信号发生器的设计与实现J.电子器件, 20056田耘,徐文波. Xilinx FPGA开发实用教程M. 北京: 清华大学出版社, 2008