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