函数信号发生器.docx
- 文档编号:29606756
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:13
- 大小:102.62KB
函数信号发生器.docx
《函数信号发生器.docx》由会员分享,可在线阅读,更多相关《函数信号发生器.docx(13页珍藏版)》请在冰豆网上搜索。
函数信号发生器
成绩
学号
201095034039
姓名
谭升国
班级
自动化
题目
信号发生器的设计
《EDA技术》考查报告
1.系统分析
本次课设要求设计一个函数信号发生器。
它能产生三种波形:
正弦波、三角波和方波。
同时能在不同的频率下显示。
这次设计主要是练习了分频电路的设计,ROM的设计,计数器的设计、选择电路的设计和数码显示的设计。
加强了对when语句,if语句等语句的理解。
拓展了对VHDL语言的应用。
平时练习与考试都是设计一个简单的电路,本次课设综合了好几个电路的设计。
同时我也增强了对分模块设计电路的应用。
对我以后的电路设计生涯都是有所帮助的!
函数信号发生器是应用了VHDL语言,通过数模转换来显示波形,实现了数模转换的应用。
在工作中,我们常常会用到信号发生器,它是使用频度很高的电子仪器。
信号发生器是指产生所需参数的电测试信号的仪器。
按信号波形可分为正弦信号、函数(波形)信号、脉冲信号和随机信号发生器等四大类。
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。
各种波形曲线均可以用三角函数方程式来表示。
能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波的电路被称为函数信号发生器。
2.参数确定
2.1模块一
模块一是分频模块。
设计原理是设置相同频率的时钟信号clk,然后每来一个上升沿,记录一个数。
当记录到想要的数值时将输出取反。
这次设计我主要分了九个频率。
外部时钟频率为40MHz。
共分得九个频率,分别为:
250Hz,500Hz,1KHz,2.5KHz,5KHz,10KHz,50KHz,100KHz,1MHZ。
计数值分别为:
80000,40000,20000,8000,4000,2000,400,200,20。
2.2模块二
模块二是频率选择模块:
同时兼有显示频率值的功能。
运用case语句,根据输入不同的值,输出不同的频率,同时给数码管输入不同的四位矢量值,使数码管显示不同的数值。
2.3.模块三
模块三是三个波形模块:
分别为正弦波,三角波,方波发生模块。
正弦波模块原理:
声明一个数组。
其中选定了64个数为数组内容,255,254,252,249,245,239,233,225,217,207,197,186,174,162,150,137,124,112,99,87,75,64,5343,34,26,19,13,8,4,1,0,0,1,4,8,13,19,26,34,43,53,64,75,87,99,112,124,137,150,162,174,186,197,207,217,225,233,239,245,249,252,254,255这64个数正好输出的是正弦波。
每来一个时钟上升沿,就输出一个数,然后将输出的数通过模数转换器,输入到示波器,由示波器输出波形。
三角波模块原理:
每来一个时钟上升沿,输出就加8,当加到128时,输出就减8。
然后将输出的数通过模数转换器,输入到示波器,由示波器输出波形。
方波模块原理:
每来一个时钟上升沿,中间变量就加1,当中间变量小于32时,输出“11111111”。
当中间变量大于32时,输出“00000000”。
输出通过数模转换器和示波器后就输出方波。
2.4.模块四
模块三是波形选择器。
通过when语句来由不同的输入来选择输出不同的波形。
3顶层设计
将各个模块分开来设计,先设计各个模块的程序,让后将程序生成对应的元件,然后再将这些元件链接到一起组成完整的硬件电路
4底层设计
4.1递减斜波产生模块
模块程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityjianis
port(clk,reset:
instd_logic;//定义输入输出端口
q:
outstd_logic_vector(7downto0));//定义波形输出端口
endjian;
architecturejian_arcofjianis
begin
process(clk,reset)//模块进程
variabletmp:
std_logic_vector(7downto0);//定义7位逻辑位变量
begin
ifreset='0'then//复位有效
tmp:
="11111111";//为变量赋值全1
elsifclk'eventandclk='1'then//时钟有效时
iftmp="00000000"then//当前变量值为全0时
tmp:
="11111111";//为变量赋值为全1
else
tmp:
=tmp-1;//不为全0时,当前变量值减1
endif;
endif;
q<=tmp;//变量值赋给q
endprocess;
endjian_arc;
4.2递增斜波产生模块
模块程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityzengis
port(clk,reset:
instd_logic;//定义时钟,复位端口
q:
outstd_logic_vector(7downto0));//定义波形输出端口
endzeng;
architecturezeng_arcofzengis
begin
process(clk,reset)//模块进程
variabletmp:
std_logic_vector(7downto0);//定义7位逻辑位变量
begin
ifreset='0'then//复位有效
tmp:
="00000000";//为变量赋值为全0
elsifclk'eventandclk='1'then//时钟有效
iftmp="11111111"then//当前为全1时
tmp:
="00000000";//为变量赋值为全0
else
tmp:
=tmp+1;//若不为全1,变量加1
endif;
endif;
q<=tmp;//将变量值付给q
endprocess;endzeng_arc
4.3三角波产生模块
模块程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysanis
port(clk,reset:
instd_logic;//定义时钟,复位端口
q:
outstd_logic_vector(7downto0));//定义七位波形输出端口
endsan;
architecturesan_arcofsanis
begin
process(clk,reset)//模块进程
variabletmp:
std_logic_vector(7downto0);//定义7位逻辑位变量
variablea:
std_logic;//定义1位逻辑位变量
begin
ifreset='0'then//复位有效
tmp:
="00000000";//当前变量赋值为全0
elsifclk'eventandclk='1'then//时钟有效
ifa='0'then//当a为0时
iftmp="11111110"then//判断当前变量值是否为指定值
tmp:
="11111111";//若为指定值变量赋值为全1
a:
='1';//a赋值为1
else
tmp:
=tmp-1;//若不为指定值变量值减1
endif;
else
iftmp="00000001"then//判断当前变量值是否为指定值
tmp:
="00000000";//若为指定值变量赋值为全0
a:
='0';//a赋值为0
else
tmp:
=tmp-1;//若不为变量值变量值减1
endif;endif;endif;
q<=tmp;//将变量值付给q
endprocess;endsan_arc;
4.4方波产生模块
模块程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysquareis
port(clk,clr:
instd_logic;//定义时钟,清除端口
q:
outintegerrange0to255);//定义整型输出端口,范围为0-255
endsquare;
architecturesquare_arcofsquareis
signala:
bit;//定义信号位a
begin
process(clk,clr)//模块进程
variablecnt:
integerrange0to63;//定义整型变量cnt,范围为0-63
begin
ifclr='0'then//判断清除端是否为0
a<='0';//若为0,a赋值为0
elsifclk'eventandclk='1'then//时钟有效
ifcnt<63then//判断cnt是否小于63
cnt:
=cnt+1;//若小于63,则变量加1
else
cnt:
=0;//否则变量赋值为0
a<=nota;//a取反再赋给a
endif;endif;endprocess;
Process(clk,a)
begin
ifclk'eventandclk='1'then//时钟有效
ifa='1'then//判断a是否为1
q<=255;//若为1,q赋值为255
else
q<=0;//不为1,q赋值为0
endif;endif;endprocess;endsquare_arc;
4.5正弦波产生模块
模块程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysinis
port(clk,clr:
instd_logic;//定义时钟,清除端口
d:
outintegerrange0to255);//定义整型输出端口,范围为0-255
endsin;
architecturesin_arcofsinis
begin
process(clk,clr)//模块进程
variabletmp:
integerrange0to63;//定义整型变量,范围为0-63
begin
ifclr='0'then//清除端有效
d<=0;//输出赋值为0
elsifclk'eventandclk='1'then//时钟有效
iftmp=63then//判断变量值是否为63
tmp:
=0;//若为63,变量赋值为0
else
tmp:
=tmp+1;//若不为63,变量值加1
endif;
casetmpis//变量tmp的各种情况
when00=>d<=255;when01=>d<=254;when02=>d<=252;
when03=>d<=249;when04=>d<=245;when05=>d<=239;
when06=>d<=233;when07=>d<=225;when08=>d<=217;
when09=>d<=207;when10=>d<=197;when11=>d<=186;
when12=>d<=174;when13=>d<=162;when14=>d<=150;
when15=>d<=137;when16=>d<=124;when17=>d<=112;
when18=>d<=99;when19=>d<=87;when20=>d<=75;
when21=>d<=64;when22=>d<=53;when23=>d<=43;
when24=>d<=34;when25=>d<=26;when26=>d<=19;
when27=>d<=13;when28=>d<=8;when29=>d<=4;
when30=>d<=1;when31=>d<=0;when32=>d<=0;
when33=>d<=1;when34=>d<=4;when35=>d<=8;
when36=>d<=13;when37=>d<=19;when38=>d<=26;
when39=>d<=34;when40=>d<=43;when41=>d<=53;
when42=>d<=64;when43=>d<=75;when44=>d<=87;
when45=>d<=99;when46=>d<=112;when47=>d<=124;
when48=>d<=137;when49=>d<=150;when50=>d<=162;
when51=>d<=174;when52=>d<=186;when53=>d<=197;
when54=>d<=207;when55=>d<=217;when56=>d<=225;
when57=>d<=233;when58=>d<=239;when59=>d<=245;
when60=>d<=249;when61=>d<=252;when62=>d<=254;
when63=>d<=255;whenothers=>null;
endcase;endif;endprocess;endsin_arc;
4.6波形选择模块
模块程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitychoiceis
port(sel:
instd_logic_vector(2downto0);//定义三位选择码
d0,d1,d2,d3,d4:
instd_logic_vector(7downto0);//定义波形输入端口
q:
outstd_logic_vector(7downto0));//定义波形输出端口
endchoice;
architecturechoice_arcofchoiceis
begin
process(sel)//定义选择进程
begin
caseselis
when"000"=>q<=d0;//选择递减斜波模块
when"001"=>q<=d1;//选择递增斜波模块
when"010"=>q<=d2;//选择三角波模块
when"011"=>q<=d3;//选择方波模块
when"100"=>q<=d4;//选择正弦波模块
whenothers=>null;
endcase;
endprocess;
endchoice_arc;
5设计验证
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正弦波
6.结果与结论
仿真结果,经过多次调试达到预期效果。
本次设计采用了模块化的设计方法,将各个模块分开来设计,设计并仿真好一个模块的电路后再设计另外一个模块,这样便于检查错误和定位修改错误,为最后模块之间的组成提供方便。
程序设计值归结于软件的仿真结果,系统的搭建和实物的构造可以借鉴,不能完全照搬!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 信号发生器