EDA课程设计.docx

上传人:b****5 文档编号:3274900 上传时间:2022-11-21 格式:DOCX 页数:55 大小:3.58MB
下载 相关 举报
EDA课程设计.docx_第1页
第1页 / 共55页
EDA课程设计.docx_第2页
第2页 / 共55页
EDA课程设计.docx_第3页
第3页 / 共55页
EDA课程设计.docx_第4页
第4页 / 共55页
EDA课程设计.docx_第5页
第5页 / 共55页
点击查看更多>>
下载资源
资源描述

EDA课程设计.docx

《EDA课程设计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计.docx(55页珍藏版)》请在冰豆网上搜索。

EDA课程设计.docx

EDA课程设计

一、设计目的………………………………………………………………..2

二、设计要求………………………………………………………………..2

三、设计总体方案要求……………………………………………………..2

1、设计的总体原理……………………………………………………2

2、设计内容…………………………………………………………….2

四、EDA设计与仿真……………………………………………………….2

1、时基发生模块………………………………………………………3

2、频率细调模块………………………………………………………4

3、波形发生模块………………………………………………………9

4、方波产生模块……………………………………………………..10

5、正弦波发生模块…………………………………………………..12

6、三角发生模块……………………………………………………..16

7、上锯齿波发生模块………………………………………………...17

8、下锯齿波发生模块………………………………………………..18

9、梯形波发生模块…………………………………………………..20

10、波形选择模块……………………………………………………21

11、频率显示模块……………………………………………………23

五、硬件实现………………………………………………………………28

1、硬件实现步骤……………………………………………………..28

2、硬件实现结果……………………………………………………..29

六、设计总结………………………………………………………………39

七、参考文献……………………………………………………………….39

八、设计生成的电路总原理图……………………………………………40

 

一、设计目的

(1)、通过本次课程设计,进一步熟悉quartusII软件的使用,掌握EDA技术及CPLD/FPGA的开发流程,掌握自顶向下的设计思想,掌握VHDL语言的编程技巧。

(2)、掌握DAC的工作原理。

并利用DAC0832芯片实现数/模转换,产生模拟信号

(3)、并利用EDA技术产生常见的基本波形波形;

二、设计要求

(1)、熟悉DAC的工作原理,利用DAC0832产生正弦波、方波、三角波、锯齿波、梯形波等波形。

(2)、通过按键控制波形发生信号的频率来控制波形的周期时间,通过档位选择来满足不同场合的需要。

(3)、通过频率细调实现频率的进一步接近所需要的频率指标。

并通过数码管显示出输出频率的四位有效值。

(4)、能把设计文件下载到实验箱,并用示波器观察各波形。

三、总体设计方案要求

1、设计总体原理

实现多功能波形发生器,从总体功能模块上划分应该有四部分组成,分别由:

目标频率产生模块、频率调节模块、显示模块及波形产生模块。

通过各功能模块的的功能管脚的相互连接,即可形成所需要的多功能信号发生器。

其结构框图如图3-1所示。

图3-1总体设计框图

2、设计内容

电子时钟主要模块有四个,它包括时基发生电路(脉冲信号产生模块)、频率调节模块(即分频模块)、数字显示模块、波形发生模块、复位模块等。

将总体电路模块化,根据自顶向下设计思想,先将各个模块先用EDA技术中的VHDL语言编程仿真,再生成各个小模块的模拟框图元件,再根据所需要的功能将其在原理图中相连接,生成具有一定功能的子功能模块。

然后根据总体设计思路,将各子功能模块连接起来实现总设计电路,最后经过仿真和硬件调试即可实现总体功能。

四、EDA设计及仿真(各个模块设计程序、原理框图及仿真波形图)

1.时基发生电路

总体设计方法是原理图与程序相结合的方法实现,原理图如4-1所示。

图4-1时基发生电路

◆该电路的主要功能为:

给待发生的功能模块提供两种不同的时钟,该实际发生电路提供两种档位的时钟脉冲,由锁相环产生高频率的稳定时钟,一方面为后续波形的产生提供可变的定时脉冲;另一方面为频率显示模块提供基准频率。

图中原理图2选1模块的程序为:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitymuxto21is

port(sel:

instd_logic;--选择信号sel

d1,d2:

instd_logic;--3路输入信号

q:

outstd_logic);--输出信号

endmuxto21;

architecturemuxto21ofmuxto21is

begin

q<=d1whensel='0'else--选择信号sel=001,选择第1路信号输出

d2;--选择信号sel=010,选择第2路信号输出

endmuxto21;其仿真波形图4-2所示:

图4-2时基发生电路仿真波形图

编译后生成的实际发生电路模块如图4-3所示:

图4-3时基发生电路模块

图中分频模块为500分频电路,主要是降低时钟频率,产生低频率的信号波形,具体实现程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydiv1000is

port(clk:

instd_logic;

clkout:

outstd_logic);--输出信号

end;

architecturediv1000ofdiv1000is

signalcout:

std_logic;

begin

process(clk)

variabletemp:

integerrange0to499;

begin

ifclk'eventandclk='1'then

iftemp=499then

temp:

=0;

cout<='1';

else

temp:

=temp+1;

cout<='0';

endif;

endif;

endprocess;

P_DIV:

PROCESS(cout)

VARIABLECNT2:

STD_LOGIC;

BEGIN

IFcout'EVENTANDcout='1'THEN

CNT2:

=NOTCNT2;

--如果溢出标志信号FULL为高电平,D触发器输出取反

IFCNT2='1'THENclkout<='1';ELSEclkout<='0';

ENDIF;

ENDIF;

ENDPROCESSP_DIV;

enddiv1000;

其仿真波形如图4-4所示:

图4-4分频模块仿真图

编译后生成的分频电路模块如图4-5所示:

图4-5分频模块原理图

2.频率调节模块

频率调节主要对时基发生电路产生的两种时钟频率进行二次分频,该分频电路能够将上述两种频率进行0~999内进行任意值得分频,从而得到不同的频率值。

以满足在不同的场合下的频率需求。

频率调节模块如图4-6所示:

图4-6频率调节电路

◆分频数值设置电路主要实现的功能是:

对所需要的分频数值进行设置,该电路有四个按键进行控制,其中一个按键是对其他三个按键加减功能控制,当该按键为高电平时实现减数功能,当为低电平时实现加数功能。

而且其他三个键d1、d2、d3分别控制分频数的个位、十位、百位。

图中的分频数值设置电路程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entityfenpinis

port(d1,d2,d3,jj:

instd_logic;--个位、十位、百位分频设置按键

rst:

instd_logic;

db1:

outstd_logic_vector(3downto0);--个位分频显示端口

db2:

outstd_logic_vector(3downto0);--十位分频显示端口

db3:

outstd_logic_vector(3downto0);--百位分频显示端口

db:

outstd_logic_vector(6downto0));--分频输出端

end;

architectureoneoffenpinis

signaljia:

std_logic;

signalint1,int2,int3:

integer;

signaltemp1,temp2,temp3:

std_logic_vector(3downto0);

begin

p0:

process(jj)

begin

ifjj='0'then--低电平时实现加法运算

jia<='1';

else

jia<='0';--高电平时实现减法运算

endif;

endprocessp0;

p1:

process(rst,d1)--d1按键的加减控制

begin

ifrst='1'then--复位信号有效时个位清零

temp1<="0000";

elsifrising_edge(d1)then

ifjia='1'then

iftemp1="1001"then

temp1<="0000";

else

temp1<=temp1+1;

endif;

elsifjia='0'then

iftemp1="0000"then

temp1<="1001";

else

temp1<=temp1-1;

endif;

endif;

endif;

endprocessp1;

p2:

process(rst,d2)--d2按键的加减控制

begin

ifrst='1'then--复位信号有效时十位清零

temp2<="0000";

elsifrising_edge(d2)then

ifjia='1'then

iftemp2="1001"then

temp2<="0000";

else

temp2<=temp2+1;

endif;

elsifjia='0'then

iftemp2="0000"then

temp2<="1001";

else

temp2<=temp2-1;

endif;

endif;

endif;

endprocessp2;

p3:

process(rst,d3)--d3按键的加减控制

begin

ifrst='1'then--复位信号有效时百位清零

temp3<="0000";

elsifrising_edge(d3)then

ifjia='1'then

iftemp3="1001"then

temp3<="0000";

else

temp3<=temp3+1;

endif;

elsifjia='0'then

iftemp3="0000"then

temp3<="1001";

else

temp3<=temp3-1;

endif;

endif;

endif;

endprocessp3;

int1<=conv_integer(temp1);--三位数分频显示

int2<=conv_integer(temp2);

int3<=conv_integer(temp3);

db1<=temp1;

db2<=temp2;

db3<=temp3;

db<=conv_std_logic_vector((int3*100+int2*10+int1),7);--分频频率输出

end;

◆任意数值分频电路分频电路功能是:

对事先设置好的分频数值进行分频。

通过记录时钟的上升沿与下降沿的个数,进行不同数值的分频。

该程序考虑到时钟分频的两种不同情况,即分频起始位置是在时钟的上升沿还是时钟的下降沿。

并对这两种情况分别处理。

已达到任意值得分频情况。

图中任意数值分频电路程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityfoudivis

port(

clk:

instd_logic;--clk:

待分频时钟

db:

instd_logic_vector(6downto0);--分频数

rst:

instd_logic;--复位,

fout:

outstd_logic--频率输出

);

end;

architecturelammyoffoudivis

signalup:

std_logic;--上升沿计数结束标志位

signaldo:

std_logic;--下降沿计数结束标志位

signalfull:

std_logic;--分频频率输出状态位

signalfullup:

std_logic;--分频频率翻转标志位

signalfulldo:

std_logic;--分频频率翻转标志位

signaldu:

std_logic_vector(7downto0);--上升沿计数器

signaldd:

std_logic_vector(7downto0);--下降沿计数器

begin

lammy02:

process(clk,rst)

variableupdata:

std_logic_vector(7downto0);

begin

ifrst='1'thenfullup<='0';

elsifclk'eventandclk='1'then

ifdo='1'thenupdata:

=(others=>'0');--如果下降沿计数结束,把上升计数沿赋值为全0;

endif;

updata:

=updata+1;

ifdd+updata=dbthenupdata:

=(others=>'0');fullup<='1';up<='1';--如果下降沿计数与上升沿计数之和等于分频数,则把上升计数沿赋值为全0,分频频率翻转,上升沿技术结束;

elsefullup<='0';up<='0';

endif;

endif;

du<=updata;

endprocess;

lammy03:

process(clk,rst)

variabledodata:

std_logic_vector(7downto0);

begin

ifrst='1'thenfulldo<='0';

elsifclk'eventandclk='0'then

ifup='1'thendodata:

=(others=>'0');

endif;

dodata:

=dodata+1;

ifdu+dodata=dbthendodata:

=(others=>'0');fulldo<='1';do<='1';

elsefulldo<='0';do<='0';

endif;

endif;

dd<=dodata;

endprocess;

lammy04:

process(fulldo,fullup)

begin

full<=fulldoorfullup;

endprocess;

lammy05:

process(full)

variablecnt2:

std_logic;

begin

iffull'eventandfull='1'thencnt2:

=notcnt2;

ifcnt2='1'thenfout<='1';

elsefout<='0';

endif;

endif;

endprocess;

end;

对该电路模块的功能仿真如图4-7所示:

图4-7频率调节电路仿真波形图

经过编译后的频率调节电路功能模块如图4-8所示:

图4-8频率调节模块

3.波形发生模块

波形发生电路的顶层电路图

波形发生顶层电路图主要有方波产生模块、正弦波产生模块、三角波产生模块、上升锯齿波发生模块、下降锯齿波发生模块、梯形波发生模块以及波形选择模块组成。

有num键产生的数值通过六选一数据选择模块进行波形选择。

该顶层电路图如图4-9所示:

图4-9波形发生顶层电路

该波形发生模块的顶层电路所对应的模块图如图4-10所示:

图4-10波形发生模块功能图

现对顶层电路的各个功能模块进行详细说明:

(1)、计数模块

◆计数模块的主要功能是:

通过num按键来进行计数,每按一次计数器的值加一,该计数值与六选一数据选择器的更能选择端相连,通过计数值的不同来选择输出的波形。

计数模块的硬件语言如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

entitycnt6is

port(num:

instd_logic;

sel:

outstd_logic_vector(2downto0)

);

endcnt6;

architectureoneofcnt6is

begin

process(num)

variabletemp:

integer:

=1;

begin

ifnum'eventandnum='1'then

temp:

=temp+1;

iftemp=7then

temp:

=1;

endif;

endif;

sel<=conv_std_logic_vector(temp,3);

endprocess;

endone;

对该电路模块的功能仿真如图4-11所示:

图4-11计数模块仿真波形图

对该电路进行编译后生成的计数功能模块如图4-12所示:

图4-12六进制计数模块

(2)、方波发生模块

◆方波发生模块的主要功能是:

利用时钟脉冲产生一个等宽度(占空比为50%)的矩形脉冲。

该方波由256组数据组成,这256组数据可分为两组前128组数据均为零,后128组数据均为255。

在每个时钟周期发送一组数据,那么在256个时钟周期内据产生一个完整的等宽度的方波。

方波模块的硬件描述程序语言如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitysquare_waveis--产生方波模块

port(clk,reset:

instd_logic;--复位信号reset,时钟信号clk

q:

outstd_logic_vector(7downto0));--输出信号q,8位数字信号

endsquare_wave;

architecturesquare_waveofsquare_waveis

signala:

std_logic;

begin

process(clk,reset)

variabletemp:

std_logic_vector(7downto0):

="00000001";

begin

ifreset='1'then

a<='0';

elsifrising_edge(clk)then--复位信号无效,时钟信号有上升沿

iftemp="11111111"then--产生8位二进制计数

temp:

="00000000";

else

temp:

=temp+1;

endif;

iftemp<"10000000"then--计数<10000000,a=1

a<='1';

else--否则a=0

a<='0';

endif;

endif;

endprocess;

process(clk,a)

begin

ifrising_edge(clk)then

ifa='1'then--a=1时输出全1

q<="11111111";

else

q<="00000000";--a=0时输出全0

endif;

endif;

endprocess;

endsquare_wave;

对该电路模块的功能仿真如图4-13所示:

图4-13方波模块仿真波形图

对该电路进行编译后生成的方波功能模块如图4-14所示:

图4-14方波发生模块

(3)、正弦波发生模块

正弦波发生电路中要有两部分组成:

地址发生器(64进制计数器)和数据存储器(64字节的ROM)。

其模块电路图如下图4-13所示,地址发生器的时钟输入频率f0与每周期的波形点数(在此选择64点),以及D/A输出的频率关系是:

f=f0/64

图4-15正弦波发生模块

64字节地址发生器的主要功能是:

产生64字节的ROM地址,让ROM的存储数据能够按时钟一次输出。

计数器输出一个6位二进制数据。

64字节地址发生器硬件程序语言如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.numeric_std.all;

entitymy_examis--实体名为my_exam

port(clk,reset:

instd_logic;--复位信号reset,时钟信号clk

q:

outintegerrange0to63);--输出信号q

endmy_exam;

architecturemy_examofmy_examis

begin

process(clk)

variablecnt:

integerrange0to63;

begin

if(rising_edge(clk))then--时钟信号有上升沿

ifreset='1'then--复位信号reset=1有效

cnt:

=0;--计数器复位

else

cnt:

=cnt+1;--计数器工作

endif;

endif;

q<=cnt;--输出当前计数值

endprocess;

endmy_exam;

对该电路模块的功能仿真如图4-16所示:

图4-16地址发生模块仿真波形图

对该电路进行编译后生成的地址发生器功能模块如图4-17所示:

图4-17地址发生器模块

64字节ROM存储模块则有原理图生成向导如(图4-16)生成,其主要功能是数据存储器,在内部存入正弦波数据,其数据如表4-1所示:

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

当前位置:首页 > 小学教育 > 英语

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

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