1、EDA课程设计大作业设计题目: 函数信号发生器设计 学生姓名: 学 号: 专业班级: 20012年 05月 28日函数信号发生器1设计背景和设计方案1.1 设计背景在电子工程、通信工程、自动控制、遥测控制、测量仪器、仪表和计算机等技术领域,经常需要用到各种各样的信号波形发生器。随着集成电路的迅速发展,用集成电路可很方便地构成各种信号波形发生器。用集成电路实现的信号波形发生器与其它信号波形发生器相比,其波形质量、幅度和频率稳定性等性能指标,都有了很大的提高。函数信号发生器是一种在科研和生产中经常用到的基本波形发生器,随着大规模集成电路的迅速发展,多功能信号发生器已被制作成专用集成电路,例如ICL
2、8038单片函数波形发生器,可以产生精度较高的正弦波、方波、矩形波、锯齿波等多种信号。 1.2 设计方案及实现函数信号发生器由递增斜波(zeng),递减斜波产生模块(jian),方波产生模块(square),三角波产生模块(san),正弦波产生模块(sin)和输出波形选择模块(choice)组成。总体设计框图如图所示,图中输出q需要接到外部D/A转换的数据输入端,将数字信号转换为模拟信号,在D/A转换器的输出端即可得到各种不同的函数信号波形。如果输出脉冲波形边沿跳变不理想,可加低通滤波器来加以完善。将各个模块分开来设计,先设计各个模块的程序,让后将程序生成对应的元件,然后再将这些元件链接到一起
3、组成完整的硬件电路1.3各模块程序及生成模块1.3.1 递减斜波产生模块模块程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jian isport(clk,reset:in std_logic; /定义输入输出端口q:out std_logic_vector(7 downto 0); /定义波形输出端口end jian;architecture jian_arc of jian isbeginprocess(clk,reset) /模块进程variable tmp:std_
4、logic_vector(7 downto 0); /定义7位逻辑位变量beginif reset=0 then /复位有效 tmp:=11111111; /为变量赋值全1 elsif clkevent and clk=1 then /时钟有效时 if tmp=00000000 then /当前变量值为全0时 tmp:=11111111; /为变量赋值为全1 else tmp:=tmp-1; /不为全0时,当前变量值减1 end if;end if;q=tmp; /变量值赋给qend process;end jian_arc;生成的元件图:1.3.2 递增斜波产生模块模块程序如下:librar
5、y ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity zeng isport(clk,reset:in std_logic; /定义时钟,复位端口q:out std_logic_vector(7 downto 0); /定义波形输出端口end zeng;architecture zeng_arc of zeng is beginprocess(clk,reset) /模块进程variable tmp:std_logic_vector(7 downto 0); /定义7位逻辑位变量beginif res
6、et=0 then /复位有效 tmp:=00000000; /为变量赋值为全0 elsif clkevent and clk=1 then /时钟有效 if tmp=11111111 then /当前为全1时 tmp:=00000000; /为变量赋值为全0 else tmp:=tmp+1; /若不为全1,变量加1 end if;end if;q=tmp; /将变量值付给qend process;end zeng_arc生成的元件图:1.3.3 三角波产生模块模块程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_
7、unsigned.all;entity san is port(clk,reset:in std_logic; /定义时钟,复位端口 q:out std_logic_vector(7 downto 0); /定义七位波形输出端口end san;architecture san_arc of san is beginprocess(clk,reset) /模块进程variable tmp:std_logic_vector(7 downto 0); /定义7位逻辑位变量variable a:std_logic; /定义1位逻辑位变量beginif reset=0 then /复位有效 tmp:=0
8、0000000; /当前变量赋值为全0 elsif clkevent and clk=1 then /时钟有效 if a=0 then /当a为0时 if tmp=11111110 then /判断当前变量值是否为指定值 tmp:=11111111; /若为指定值变量赋值为全1 a:=1; /a赋值为1 else tmp:=tmp-1; /若不为指定值变量值减1 end if;else if tmp=00000001then /判断当前变量值是否为指定值 tmp:=00000000; /若为指定值变量赋值为全0 a:=0; /a赋值为0 else tmp:=tmp-1; /若不为变量值变量值减
9、1end if;end if;end if;q=tmp; /将变量值付给qend process;end san_arc;生成的元件图:1.3.4 方波产生模块模块程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity square is port(clk,clr:in std_logic; /定义时钟,清除端口 q:out integer range 0 to 255); /定义整型输出端口,范围为0-255end square;architecture square_arc o
10、f square issignal a:bit; /定义信号位abeginprocess(clk,clr) /模块进程variable cnt:integer range 0 to 63; /定义整型变量cnt,范围为0-63beginif clr=0then /判断清除端是否为0a=0; /若为0,a赋值为0elsif clkevent and clk =1then /时钟有效if cnt63 then /判断cnt是否小于63 cnt:=cnt+1; /若小于63,则变量加1elsecnt:=0; /否则变量赋值为0a=not a; /a取反再赋给aend if;end if;end pr
11、ocess;Process(clk,a)begin if clkevent and clk=1then /时钟有效 if a=1 then /判断a是否为1q=255; /若为1,q赋值为255elseq=0; /不为1,q赋值为0end if; end if; end process; end square_arc;生成的元件图:1.3.5 正弦波产生模块模块程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sin is port(clk,clr:in std_logic;
12、 /定义时钟,清除端口 d:out integer range 0 to 255); /定义整型输出端口,范围为0-255end sin;architecture sin_arc of sin isbeginprocess(clk,clr) /模块进程variable tmp:integer range 0 to 63; /定义整型变量,范围为0-63beginif clr=0then /清除端有效 dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddnull;end case; end if; end proces
13、s; end sin_arc;生成的元件图:1.3.6 波形选择模块模块程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity choice is port (sel:in std_logic_vector(2 downto 0); /定义三位选择码 d0,d1,d2,d3,d4:in std_logic_vector(7 downto 0); /定义波形输入端口 q:out std_logic_vector(7 downto 0); /定义波形输出端口end choice;arc
14、hitecture choice_arc of choice isbeginprocess(sel) /定义选择进程begincase sel iswhen000=qqqqqnull;end case;end process;end choice_arc;生成的元件图:2方案实施reset为复位信号,clk为时钟信号,sel波形选择信号输入口。具体的实现效果为当信号reset为低电平时,既复位端无效。当sel信号为000时选择递减斜波产生模块,波形由选择模块choice上的q7.0输出,数字信号波形如图1所示。图1 递减斜波当sel信号为001时选择递增斜波产生模块,波形由选择模块choice
15、上的q7.0输出,数字信号波形如图2所示。图 2递增斜波当sel信号为010时选择三角波信号产生模块,波形由选择模块choice上的q7.0输出,数字信号波形如图3所示。图 3三角波当sel信号为011时选择方波信号产生模块,波形由选择模块choice上的q7.0输出,数字信号波形如图4所示。图4方波当sel信号为100时选择正弦波信号产生模块,波形由选择模块choice上的q7.0输出,数字信号波形如图2.5所示。图5 正弦波3结果与结论 仿真结果,经过多次调试达到预期效果。本次设计采用了模块化的设计方法,将各个模块分开来设计,设计并仿真好一个模块的电路后再设计另外一个模块,这样便于检查错误和定位修改错误,为最后模块之间的组成提供方便。程序设计值归结于软件的仿真结果,系统的搭建和实物的构造可以借鉴,不能完全照搬!11