正负脉宽数控调制信号发生器Word下载.docx
《正负脉宽数控调制信号发生器Word下载.docx》由会员分享,可在线阅读,更多相关《正负脉宽数控调制信号发生器Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
随着可编程逻辑器件迅速发展,出现了功能强大的全新的EDA工具。
具有较强描述能力的硬件描述语言(VHDL、VerilogHDL)及高性能综合工具的使用,使过去单功能电子产品开发转向系统级电子产品开发。
QuartusⅡ设计工具完全支持VHDL、Verilog的设计流程,其内部嵌有VHDL、Verlog逻辑综合器。
QuartusⅡ包括模块化的编译器。
编译器包括的功能模块有分析/综合器(Analysis&
Synthesis)、适配器(Fitter)、装配器(Assembler)、时序分析器(TimingAnalyzer)、设计辅助模块(DesignAssistant)、EDA网表文件生成器(EDANetlistWriter)、编辑数据接口(CompilerDatabaseInterface)等。
可以通过选择StartCompilation来运行所有的编译器模块,也可以通过选择Start来单独运行各个模块。
还可以通过选择CompilerTool,在CompilerTool窗口中运行该模块来启动编译器模块。
在CompileTool窗口中,可以打开该模块的设置文件或报告文件,或打开其它相关窗口。
1.2EDA的优势
EDA技术的优势体现在:
●用VHDL对数字系统进行抽象的行为与功能描述到具体的内部线路结构,从而可以在电子设计的各个阶段、各个层次进行计算机模拟验证,保证设计过程的正确性,可以大大降低设计成本,缩短设计周期。
●EDA工具之所以能够完成各种自动设计过程,关键是有种类库的支持,如逻辑仿真时的模拟库、逻辑综合时的综合库、版图综合时的版图库、测试综合时的测试库等。
●某些HDL本身也是文档型的语言(如VHDL),极大地简化了设计文档的管理。
●EDA中最为瞩目的功能,最具现代化电子设计技术特征的功能,是日益强大的逻辑设计仿真测试技术。
极大地提高了大规模系统电子设计的自动化程度。
1.3EDA发展趋势
表现在以下几个方面:
●超大规模集成电路的集成度和工艺水平不断提高,深亚微米(Deep-Submicron)工艺,如0.13um、90nm已经走向成熟,在一个芯片上完成的系统级的集成已经成为可能。
●由于工艺不断减小,在半导体材料上的许多寄生效应已经不能简单地补码忽略,这就对EDA工具提出了更高的要求。
同时,也使得IC生产线的投资更为巨大。
●高性能的EDA工具得到长足的发展,其自动化和智能化程度不断提高,为嵌入式系统设计提供了功能强大的开发环境。
●市场对电子产品提出了更高的要求,从而也对系统的集成度不断提出更高的要求。
同时,设计的效率也成了一个产品能否成功的因素,促使EDA工具应用更为广泛。
2、设计任务与要求
2.1课程设计的任务
此信号发生器可产生占空比可调的方波,高低电平的维持时间由8位二进制数控制。
2.2课程设计的基本要求
通过课程设计各环节的实践,应达到如下要求:
1、初步掌握数字逻辑电路、EDA分析和设计的基本方法。
包括:
⑴.根据设计任务和要求,初选电路;
⑵.通过研究、设计计算,确定电路方案;
⑶.电路仿真及编程、模拟、连线、进行调试;
⑷.分析实验结果,写出设计总结报告。
2、培养一定自学能力和独立分析问题、解决问题能力。
⑴.学会自己分析、找出解决问题的方法;
⑵.对设计中遇到的问题,能独立思考,查阅资料,寻找解决方案;
⑶.掌握一些测试电路的基本方法,实验中出现一般故障,能独立解决;
⑷.能对实验结果进行分析和评价。
3、掌握编程、仿真、连线、调试等基本技能。
3、设计原理
总体框架图如图3.1所示:
[4]
图3.1总体框图
设计思路:
此信号发生器是由两个完全相同但使能端有效电平不同的的可自加载加法计数器组成的,它的输出信号的高低电平脉宽时间可分别由两组8位二进制预置数进行控制。
如果将信号发生器的输出端作为本计数器的初始预置加载信号ld1,取反后的作为ld2,那么cnt1和cnt2分开工作,则可构成计数初始值自加载方式的加法计数器,从而构成数控分频器。
4、功能模块
4.1分频器div
器件图如图4.1所示:
图4.1分频器器件图
时钟信号接到分频器的输入端clk,分频器的输出端clk10(接到预置计数器的脉冲输入端CLK)它的作用是将高频信号分成低频信号,在本设计中,是把50MHZ分成1KHZ。
[1]
分频器div的VHDL程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycounter100is
port(clk:
instd_logic;
q:
outstd_logic);
endcounter100;
architecturebahaveofcounter100is
signalq0:
std_logic:
='
0'
;
begin
process(clk)
variablecount:
integerrange0to25000;
begin
ifrising_edge(clk)then
ifcount<
25000thencount:
=count+1;
elseq0<
=NOTq0;
count:
=0;
endif;
endif;
endprocess;
q<
=q0;
endbahave;
仿真波形如图4.2所示:
图4.2分频器仿真波形
由于分频倍数太大,导致clk脉冲太密集,所以看不出来高低电平,但是能得出,分频后的输出信号q的周期是1ms。
仿真分析:
任意给一个时钟信号,分频器将高频信号分成低频信号。
4.2可预置数计数器
器件图如图4.3所示:
图4.3计数器器件图
此计数器是一个8位二进制数的预置计数器,比普通计数器多了一个预置端ld和预置数据端d。
当ld=1或0时,在下一个时钟脉冲过后,计数器输出端预置数d,clk为脉冲信号输入端,时钟信号经分频后接到clk端,cnt为计数溢出输出端。
由于要接数码管显示成十进制数,所以需要将百、十、个位单独分出来[3]。
程序如下:
entitycnt1is
port(clk,ld:
d:
inintegerrange0to255;
cnt:
outstd_logic;
bai,shi,ge:
outintegerrange0to9);
endentitycnt1;
architectureartofcnt1is
signalcount,count1:
integerrange0to255;
signals1,s2,s3:
integerrange0to9;
signale:
integerrange0to99;
begin
process(clk)is
ifclk'
eventandclk='
1'
then
ifld='
thencount<
=d-1;
elsecount<
=count-1;
endif;
process(clk,count)is
ifcount=0thencnt<
elsecnt<
count1<
=d;
s1<
=count1rem10;
e<
=count1/10;
s2<
=erem10;
s3<
=count1/100;
bai<
=s3;
shi<
=s2;
ge<
=s1;
endarchitectureart;
仿真结果如图4.4、4.5所示:
图4.4预置数
图4.5溢出
图4.4中预置数D[7..0]为任意八位二进制数,预置端LD为1时,当时钟上升沿到来时,加载预置数,否则继续递减计数,当计到0时输出为1(如图4.5),然后继续从所设置的预置数开始递减计数,从而达到控制脉冲宽度的目的。
在此仿真过程中发现,由于计数到0,那么实际上是数了(预置数-0+1)ms,那么在程序中,开始递减的数据应该是(预置数-1)这样才能保持脉冲宽度大小与预置数相等。
4.3数码动态扫描显示
本次课设所用的FPGA实验板中的数码管是共阳数码管,即将所有发光二极管的阳极接到一起形成公共阳极(COM),共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
用数码管显示信息时,由于每个数码管至少需要8个I/O口,如果需要多个数码管,则需要太多I/O口,所以在实际应用中,一般采用动态显示的方式解决此问题。
在编程时,需要输出段选和位选信号,位选信号选中其中一个数码管,然后输出段码,使该数码管显示所需要的内容,延时一段时间后,再选中另一个数码管,再输出对应的段码,高速交替。
利用人的视觉暂留作用使人看到多个数码管同时显示。
在动态显示程序中,各个位的延时时间长短是非常重要的,如果延时时间长,则会出现闪烁现象;
如果延时时间太短,则会出现显示暗且有重影。
[2]
相应程序如下:
entitymux6_1is
port(s1,s2,s3,s4,s5,s6:
instd_logic_vector(3downto0);
clk:
segout:
outstd_logic_vector(6downto0);
count:
outstd_logic_vector(7downto0));
endmux6_1;
architectureoneofmux6_1is
signalCQI:
std_logic_vector(2downto0);
signaldout:
std_logic_vector(3downto0);
process(clk)
variablecount0:
integerrange0to50000;
ifcount0<
50000thencount0:
=count0+1;
count0:
process(q0)
ifq0'
eventandq0='
then
ifCQI="
101"
CQI<
="
000"
else
CQI<
=CQI+1;
caseCQIis
when"
=>
count<
11111110"
dout<
001"
11111101"
010"
11111011"
011"
11011111"
=s4;
100"
10111111"
=s5;
01111111"
=s6;
whenothers=>
null;
endcase;
endprocess;
process(dout)
casedoutis
0000"
=>
segout<
1000000"
0001"
1111001"
0010"
0100100"
0011"
0110000"
0100"
0011001"
0101"
0010010"
0110"
0000010"
0111"
1111000"
1000"
0000000"
1001"
0010000"
segout<
1111111"
endcase;
endone;
5、总体设计电路图
5.1总体电路图[2][5]
图5.1整体电路图
5.2顶层文件
entitypulseis
port(clk:
b:
instd_logic_vector(7downto0);
key:
instd_logic;
psout:
segout:
count:
endentitypulse;
architectureartofpulseis
componentcnt1is
d:
cnt:
bai,shi,ge:
endcomponentlcnt8;
componentcounter100is
q:
endcomponentcounter100;
componentmux6_1is
segout:
outstd_logic_vector(0to6);
endcomponentmux6_1;
signalcnt1,cnt2:
std_logic;
signalld1,ld2,e:
signalpsint:
signalss1,ss2,ss3,ss4,ss5,ss6:
signalb1,b2:
std_logic_vector(7downto0);
begin
u1:
counter100portmap(clk=>
clk,q=>
e);
u2:
cnt1portmap(clk=>
e,ld=>
ld1,d=>
b1,cnt=>
cnt1,bai=>
ss3,shi=>
ss2
ge=>
ss1);
u3:
ld2,d=>
b2,cnt=>
cnt2,bai=>
ss6,shi=>
ss5
ss4);
u4:
mux6_1portmap(ss6,ss5,ss4,ss3,ss2,ss1,clk,segout,count);
process(key)
ifkey='
thenb1<
=b;
elseb2<
process(cnt1,cnt2)is
ifcnt1='
thenpsint<
elsifcnt2'
eventandcnt2='
thenpsint<
ld1<
=notpsint;
ld2<
=psint;
psout<
由于实验板上只有八个拨码开关,为达到给两个计数器提供预置数的目的,使用了一个按键,按键按下去时,一个计数器预置数有效,按键松开时,另一个有效。
6、程序下载及结果分析
6.1管脚分配情况
管脚定义
管脚编号
备注
clk
28
时钟
key
24
按键
b[7]
86
拨
码
开
关
count[7]
84
数码管
位选
b[6]
87
count[6]
82
b[5]
88
count[5]
81
b[4]
89
count[4]
80
b[3]
90
count[3]
77
b[2]
92
count[2]
76
b[1]
94
count[1]
75
b[0]
95
count[0]
74
segout[6]
70
段选
segout[2]
64
段选
segout[5]
69
segout[1]
63
segout[4]
68
segout[0]
61
segout[3]
67
psout
37
接示波器
6.2结果验证
通过示波器观察实验结果:
7、课程设计心得体会
刚拿到题目时,不知从何下手,反复的看书查资料,寻求帮助,终于让我对这个题目有了一定的了解,开始设计电路,编写程序,最后进行仿真,在仿真的过程中,出现了很多问题,比如开始的时候,输出信号的周期比预设的总是多了两秒,后来发现是因为倒数至0时相当于在原预置数加了1,于是开始信号接收到的数字应该是预置数减1。
在同学的帮助下,终于解决了各种问题得到了正确的结果。
由于上学期选修过EDA这门课,所以对quartusII软件的编程以及使用方法还比较熟悉,以前学习上存在的不足,通过与同学探讨和查阅资料,终于把问题都解决了,并加深了对正负脉宽数控调制信号发生器的