波形发生器的设计.docx

上传人:b****7 文档编号:10271264 上传时间:2023-02-09 格式:DOCX 页数:33 大小:354.21KB
下载 相关 举报
波形发生器的设计.docx_第1页
第1页 / 共33页
波形发生器的设计.docx_第2页
第2页 / 共33页
波形发生器的设计.docx_第3页
第3页 / 共33页
波形发生器的设计.docx_第4页
第4页 / 共33页
波形发生器的设计.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

波形发生器的设计.docx

《波形发生器的设计.docx》由会员分享,可在线阅读,更多相关《波形发生器的设计.docx(33页珍藏版)》请在冰豆网上搜索。

波形发生器的设计.docx

波形发生器的设计

 

专业课程设计报告

 

题目:

波形发生器的设计

 

姓名:

专业:

班级学号:

同组人:

指导教师:

 

2012年6月28日

专业课程设计任务书

2011-2012学年第2学期 第17周-20周

题目

波形发生器的设计

内容及要求

用CPLD可编程模块产生下列信号(特殊芯片:

EPM570T100C5)

(1)采用VHDL编写相关程序,能产生递增斜波、递减斜波、阶梯波、正弦波、方波、三角波;

(2)用户能够选择输出所需其中一种波形。

进度安排

17周:

查找资料,进行系统方案设计;

18周:

软件的分模块调试;

19周:

系统联调;

20周:

设计结果验收,报告初稿的撰写。

学生姓名:

指导时间:

第17~20周

指导地点:

E楼607室

任务下达

2012年6月4日

任务完成

2012年6月29日

考核方式

1.评阅√□2.答辩√□3.实际操作√□4.其它√□

指导教师

系(部)主任

 

摘要

各种各样的信号是通信领域的重要组成部分,其中递增斜波、递减斜波、阶梯波、正弦波、方波、三角波等是较为常见的信号。

在科学研究及教学实验中常常需要这几种信号的发生器。

为了试验、研究方便,研制一种灵活使用、功能齐全、使用方便的信号源是十分必要的。

本次设计的波形发生器是一种能够产生递增斜波、递减斜波、阶梯波、正弦波、方波、三角波的信号发生器。

设计可以通过硬件和软件两种方法实现,本次实验中通过QuartusII软件编程软件的方法,运用VHDL语言与原理图混合设计的方法,VHDL语言描述底层模块,原理图设计方法设计顶层原理图文件。

实验分模块设计,便于调试及错误的查找。

实验运用VHDL语言编写程序,实现了各波形的产生,并且最后通过6选1多路开关的设计,实验了对需要波形的选择。

关键词:

波形发生器VHDLQuartusII原理图多路开关

 

第一章波形发生器设计内容及要求

1.1设计内容

实验设计波形发生器是一种能够产生递增斜波、递减斜波、阶梯波、正弦波、方波、三角波的电路。

实验中通过QuartusII软件编程,运用VHDL语言与原理图混合设计的方法,VHDL语言描述底层模块,原理图设计方法设计顶层原理图文件。

实验分模块设计,在完成一个模块时即对其进行调试修改,防止了最后模块综合时存在调试困难的情况出现。

如果是对元件例化相对较熟练的同学,也可采用元件例化的方法进行程序的编写。

但在此过程中,应特别注意VHDL语言的运用,以防语法错误导致影响实验结果。

实验最后将程序下载到芯片EPM570T100C5中,供实际运用。

1.2设计要求

用CPLD可编程模块产生下列信号(特殊芯片:

EPM570T100C5)

1、采用VHDL编写相关程序,能产生递增斜波、递减斜波、阶梯波、正弦波、方波、三角波;

2、用户能够选择输出所需其中一种波形。

第二章波形发生器系统框图及工作原理与设计

2.1系统框图

波形发生器由各波形发生模块及6选1多路开关构成,时钟信号对其作用产生输出波形信号,系统框图如图2.1所示。

图2.1系统框图

2.2设计平台与仿真工具

QuartusII软件包是MAX+plusII的升级版本,其提供了一个完整高效的设计环境,非常适合具体的设计需求。

提供了方便的设计输入方式、快速的编译和直接易懂的器件编程,属于EDA工具。

EDA技术的基本特征是采用高级语言描述,具有系统级仿真和综合能力。

它主要采用并行工程和“自顶向下”的设计方法,这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构的设计。

在方框图一级进行仿真、纠错,并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证。

然后用综合优化工具生成具体电路的网表,其对应得物理实现级可以是印刷电路板或专用集成电路。

由于设计的主要仿真和调试过程是在高层次上完成的,这不仅有利于早起发现结构设计上的错误,避免设计工作的浪费,而且也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。

本实验中是多个模块的相互联系作用,采用了VHDL与原理图混合设计的方式进行设计。

各模块设计最后,为了能在图形编辑器中调用元件,需要为该元件创建一个元件图形符号。

2.3工作原理与设计

2.3.1递增波形

递增波形的设计运用的是VHDL语言中if语句对其进行0-255的序列递增来实现的,每等待一个时钟上升沿,计数器加1,故输出信号周期为256倍时钟周期。

程序主要语句如下所示:

iftmp="11111111"then

tmp:

="00000000";

else

tmp:

=tmp+1;

endif;

其中,定义clk为输入时钟信号端口,reset为输入复位信号端口程,q1为8位二进制输出信号端口。

程序设计流程图如下图所示:

图2.2递增波形设计流程图

2.3.2递减波形

递减波形的设计运用的是VHDL语言中if语句对其进行255-0的序列递减来实现的,与递增波形正好是相反的。

每等待一个时钟上升沿,计数器减1,故输出信号周期为256倍时钟周期。

程序主要语句如下所示:

iftmp="00000000"then

tmp:

="11111111";

else

tmp:

=tmp-1;

endif;

其中,时钟信号clk,复位信号reset,8位二进制输出信号端口q2。

程序设计流程图如下图所示:

图2.3递减波形设计流程图

2.2.3阶梯波

阶梯波运用VHDL语言中if语句设计,程序中每计数16次对输出信号进行一次序列递增,从而得到周期为输入时钟递增信号波形周期16倍的输出阶梯波信号。

在设计原理上是与递增波形类似的。

程序中,阶梯波阶梯增量为16,可以根据需要通过改变递增量来得到需要波形。

因为在计数器11110000是加16刚好为00000000,故程序省略了

iftmp="11111111"then

tmp:

="00000000";

语句,并且在计数器增量设置时,增量应为

这样才能使阶梯波各个阶梯高度是一致的。

程序主要语句如下所示:

ifreset='0'then

tmp:

="00000000";

elsifclk'eventandclk='1'then

tmp:

=tmp+16;

endif;

其中,时钟信号clk,复位信号reset,8位二进制输出信号端口q5。

程序设计流程图如下图所示:

图2.4阶梯波设计流程图

2.1.4三角波

三角波的设计运用的是VHDL语言中if语句先对其进行0-255的序列递增,之后再对递增到255的序列进行255-0的序列递减来实现的,正好是递增波形与递增波形相结合得到。

程序语句设置内部接点信号a作为递减信号,判断波形处于递增或者是递减阶段。

当a为0时,递增,计数器加1;a为1时,递减,计数器减1。

程序主要语句如下所示:

ifa='0'then

iftmp="11111110"then

tmp:

="11111111";

a:

='1';

else

tmp:

=tmp+1;

endif;

else

iftmp="00000001"then

tmp:

="00000000";

a:

='0';

else

tmp:

=tmp-1;

endif;

endif;

其中,时钟信号clk,复位信号reset,8位二进制输出信号端口q3。

程序设计流程图如下图所示:

图2.5三角波设计流程图

2.1.5正弦波

正弦波的设计运用的是VHDL语言中if语句与case语句,由于正弦波是模拟信号波形,而VHDL语言程序输出的是数字信号波形。

因此,实验中对信号进行等间距采样,等效正弦信号波形。

程序采样点为128个,等效为近似的正弦波形。

程序主要语句如下所示:

iftmp=127then

tmp:

=0;

else

tmp:

=tmp+1;

endif;

casetmpis

when00=>d<=255;when01=>d<=255;when02=>d<=255;when03=>d<=254;

……

when124=>d<=254;when125=>d<=254;when126=>d<=255;when127=>d<=255;

whenothers=>null;

endcase;

endif;

其中,时钟信号clk,复位信号clr,8位二进制输出信号端口d。

程序设计流程图如下图所示:

图2.6正弦波设计流程图

2.1.6方波

阶梯波运用VHDL语言中if语句设计,程序中每计数64次对输出信号进行一次翻转,从而得到周期为输入时钟信号周期128倍的输出方波信号。

程序设置内部节点信号a作为输出判断信号,计数器计数0-63后,对输出判断信号取反,实现0、1的变化。

ifcnt<63then

cnt:

=cnt+1;

else

cnt:

=0;

a<=nota;

endif;

其中,a为0是输出低电平,a为1时输出高电平。

ifa='1'then

q6<=255;

else

q6<=0;

endif;

其中,时钟信号clk,复位信号clr,8位二进制输出信号端口q6。

程序设计流程图如下图所示:

图2.7方波设计流程图

2.1.66选1多路开关

6选1多路开关运用VHDL语言中case语句设计。

程序主要语句如下所示:

caseais

when"000"=>q<=z1;

when"001"=>q<=z2;

when"010"=>q<=z3;

when"011"=>q<=z4;

when"100"=>q<=z5;

when"101"=>q<=z6;

whenothers=>q<=null;

endcase;

其中,时钟信号clk,输入选择sel,8位二进制输出信号端口q。

程序设计流程图如下图所示:

图2.76选1多路开关设计流程图

第三章系统调试与分析

3.1系统调试

3.1.1调试方法

实验运用的是VHDL语言与原理图混合设计方法,因此有程序调试和原理图调试两部分。

实验步骤如下:

1、新建工程、VHDL文档输入设计模块子程序

2、调试各个子程序是否存在语法错误的问题

3、对各子模块进行波形仿真,验证输出是否正确

4、各子模块生成图元文件

5、新建工程、原理图文档,将各子模块文件夹下的文档拷贝到新建工程中

6、根据系统设计框图将各个模块图元文件连成原理图

7、检验原理图是否正确

8、最后原理图仿真,检查波形图是否正确

3.1.2调试故障及解决方法

在整个实验调试过程中,最主要出现的问题是对VHDL语言的不熟悉,导致在程序编写过程中出现了不少语法错误导致影响实验结果的问题。

其次是软件运用不熟练使得影响实验进度,有时也会影响了实验调试。

针对实验中出现了问题,总结了以下一些解决方法和注意事项:

1、程序书写过程中要注意程序的层次,便于出错时对错误的查找;

2、程序输入时应仔细认真,以免个别字母的错误输入影响实验结果;

3、分模块设计分模块调试,便于对错误的纠正;

4、项目名必须与顶层设计文件名相同;

5、程序命名过程中,以一定意义的字母命名,便于之后读程序;

6、在原理图设计上,注意总线的书写。

设计中主要用的是VHDL语言中的if语句和case语句,因此对这两种语句的运用要十分熟悉。

并且其不区分大小写,所以在命名时应注意此问题。

3.2结果分析

3.2.1递增波形

通过对程序语句的调试过程,得到以下波形图:

图3.1递增波形图

图3.2递增模块图

由波形图可以看出,在每个时钟上升沿,输出加1,从波形图上我们也可以看到,输出由00000000增至11111111,从而得到了递增波形,并且其周期为时钟周期的256倍。

因此,从调试得到的波形图可知,程序设计实现了递增波形的产生功能。

3.2.2递减波形

递减波形程序调试,得到了以下的波形图:

图3.3递减波形图

图3.4递减模块图

由波形图可以看出,在每个时钟上升沿,输出减1,从波形图上我们也可以看到,输出由11111111减到00000000,与递增波形正好是相反的,其周期与递增波形周期相等,为时钟周期的256倍。

因此,从调试得到的波形图可知,程序设计实现了递减波形的产生功能。

3.2.3三角波

三角波程序调试至无语法错误后,仿真得到以下波形图:

图3.5三角波波形图

图3.6三角波模块图

通过对波形图的分析,每个时钟上升沿计数器加1或者减1,有一个最大值11111111。

输出由00000000递增至11111111后再递减至00000000,从而得到了三角波。

从图上我们可以看到输出的递增与递减,程序实现了三角波的产生功能。

3.2.4正弦波

对正弦波程序的调试,得到了以下波形图:

图3.7正弦波波形图

图3.8正弦波模块图

程序根据正弦波采样取点,得到了以上仿真波形。

与递增波形不同的是,正弦波设计中由于取点并不按一定规律得到,无法采用循环来实现,相对于前面波形的设计较难一些。

因此,程序中利用case语句,通过查表的方法来实现输出正弦波。

3.2.5阶梯波

阶梯波调试得到波形图如下所示:

图3.9阶梯波波形图

图3.10阶梯波模块图

与之前设计的递增波形比较我们不难发现,阶梯波与递增波形是类似的,其区别就在于,阶梯波阶梯增量为16,而递增波形的阶梯增量是1。

并且在阶梯波的设计中应注意,阶梯增量应设置为

,只有这样才能保证阶梯的每一层的阶梯高度是一样的。

实验设计程序实现了阶梯波的产生。

3.3.6方波

方波调试得到波形图如下图所示:

图3.11方波波形图

图3.12方波模块图

由上图我们可以知道,程序的调试实现了方波的产生。

我们的输如时钟信号就是一个方波信号,因此,在方波发生器的设计上要相对简单。

实验是通过设置的计数周期,之后对输出信号进行翻转,从而得到所需的波形。

3.3.76选1多路开关

由于要实现用户对所需波形的选择功能,因此,实验设计了一个6选1多路开关。

通过对用户输入否认判断,从而输出用户所需的信号波。

调试得到如下波形图:

图3.136选1多路开关

图3.26选1模块图

通过对部分输出波形的观察,在输入信号为000时,选择输出z1的输入信号,满足多路开关的功能实现。

3.2.8原理图

实验运用的是VHDL语言和原理图混合设计的方法,因此,在所以程序调试成功后,生成每个子模块的元件图形。

再根据设计框图,将个子模块连接,得到系统原理图。

原理图调试得到如下波形:

图3.8原理图选择输出方波

各波形发生器模块产生波形,6选1多路开关,进行对所需波形信号的选择。

仿真过程中,输入101信号,选择的是方波信号的输出。

图3.9原理图选择输出递减波形

输入001信号,选择的是递减波形信号的输出。

 

第四章结论

本次实验室一个基于VHDL语言的波形发生器的设计,该波形发生器能够产生递增斜波、递减斜波、阶梯波、正弦波、方波、三角波。

实验中通过QuartusII软件编程,运用VHDL语言与原理图混合设计的方法,VHDL语言描述底层模块,原理图设计方法设计顶层原理图文件。

最后通过6选1多路开关的设计,实验了对需要波形的选择。

实验分模块设计,在完成一个模块时即对其进行调试修改,防止了最后模块综合时存在调试困难的情况出现。

如果是对元件例化相对较熟练的同学,也可采用元件例化的方法进行程序的编写。

但在此过程中,应特别注意VHDL语言的运用,以防语法错误导致影响实验结果。

实验最后将程序下载到芯EPM570T100C5中,供实际运用。

通过此次课程设计,深深的感觉到自己所学知识真是非常的浅薄。

利用EDA设计软件辅助设计,方便快捷,减少了错误率的产生,缩短了产品的设计及上市周期,既减轻了设计工作量又满足了商业利益的需求。

本次课程设计最后顺利完成了波形发生器的设计,实现了实验要求的各个功能,但是也遇到了不少问题。

在设计过程当中,遇到了软件操作不熟练,程序编写不规范等诸多问题,通过对问题的总结分析得出,应用软件的主要功能必须熟练操作,才能提高工作效率,需要规范操作的地方必须严格按照使用说明操作,避免由于软件使用不当造成的错误产生。

程序的编写格式必须规范,模块、端口以及信号变量的命名应当反映实际意义,缩进格式工整明了,方便阅读理解,这样有利于程序的编写,有利于分析调试,也有利于程序的重复使用。

设计采用的分模块设计方法,对单个模块调试,便于对错误的查找。

课设的完成,巩固了学习的理论知识,也发现了自己很多需要学习改进的地方。

 

参考文献

[1]朱正伟.EDA技术及应用[M].北京:

清华大学出版社,2005.

[2]童诗白.模拟电子技术基础(第五版)[M].北京:

高等教育出版社.2005.

[3]谢自美.电子技术基础实验与课程设计[M].北京:

电子工业出版社.2006.

 

附录一原理图

附录二程序清单

--递增波形

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydizengis

port(clk,reset:

instd_logic;--定义时钟和复位

q1:

outstd_logic_vector(7downto0));--定义8位输出

enddizeng;

architecturebehaveofdizengis

begin

process(clk,reset)--定义敏感信号表

variabletmp:

std_logic_vector(7downto0);--定义内部节点信号作为计数器

begin

ifreset='0'then--复位

tmp:

="00000000";

elsifclk'eventandclk='1'then--等待时钟上升沿

iftmp="11111111"then--计数器清零

tmp:

="00000000";

else

tmp:

=tmp+1;--计数器加1

endif;

endif;

q1<=tmp;--输出

endprocess;

endbehave;

--递减波形

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydijianis

port(clk,reset:

instd_logic;

q2:

outstd_logic_vector(7downto0));

enddijian;

architecturebehaveofdijianis

begin

process(clk,reset)

variabletmp:

std_logic_vector(7downto0);

begin

ifreset='0'then

tmp:

="00000000";

elsifclk'eventandclk='1'then

iftmp="00000000"then

tmp:

="11111111";

else

tmp:

=tmp-1;--计数器减1

endif;

endif;

q2<=tmp;

endprocess;

endbehave;

--三角波

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitysjiaois

port(clk,reset:

instd_logic;

q3:

outstd_logic_vector(7downto0));

endsjiao;

architecturebehaveofsjiaois

begin

process(clk,reset)

variabletmp:

std_logic_vector(7downto0);--定义内部节点信号tmp作为计数器

variablea:

std_logic;--定义内部节点信号a作为递减信号

begin

ifreset='0'then

tmp:

="00000000";

elsifclk'eventandclk='1'then

ifa='0'then--a为0,递增;a为1,递减

iftmp="11111110"then

tmp:

="11111111";

a:

='1';

else

tmp:

=tmp+1;

endif;

else

iftmp="00000001"then

tmp:

="00000000";

a:

='0';

else

tmp:

=tmp-1;

endif;

endif;

endif;

q3<=tmp;

endprocess;

endbehave;

--正弦波

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityzxianis

port(clk,clr:

instd_logic;

d:

outintegerrange0to255);

endzxian;

architecturebehaveofzxianis

begin

process(clk,clr)

variabletmp:

integerrange0to127;

begin

ifclr='0'then

d<=0;

elsifclk'eventandclk='1'then

iftmp=127then

tmp:

=0;

else

tmp:

=tmp+1;

endif;

casetmpis--查表输出

when00=>d<=255;when01=>d<=255;when02=>d<=255;when03=>d<=254;

when04=>d<=254;when05=>d<=253;when06=>d<=252;when07=>d<=251;

when08=>d<=250;when09=>d<=249;when10=>d<=247;when11=>d<=246;

when12=>d<=244;when13=>d<=242;when14=>d<=240;when15=>d<=238;

when16=>d<=236;when17=>d<=233;when18=>d<=231;when19=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1