EDA课程设计.docx
《EDA课程设计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计.docx(55页珍藏版)》请在冰豆网上搜索。
![EDA课程设计.docx](https://file1.bdocx.com/fileroot1/2022-11/20/db2cc5bd-ee0b-407f-89e9-ba9c61ffad71/db2cc5bd-ee0b-407f-89e9-ba9c61ffad711.gif)
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所示: