基于vhdl语言的pwm.docx
《基于vhdl语言的pwm.docx》由会员分享,可在线阅读,更多相关《基于vhdl语言的pwm.docx(11页珍藏版)》请在冰豆网上搜索。
基于vhdl语言的pwm
基于vhdl语言的pwm
————————————————————————————————作者:
————————————————————————————————日期:
YibinUniversity
EDA技术及应用期末设计报告
题目:
PWM信号发生器的设计
专业:
电子信息科学与技术
姓名:
学号:
2013年12月20日
摘要:
pwm,即脉冲宽度调制。
脉冲宽度,即一个脉冲信号所占时间的长度。
所以脉冲宽度的调制就是调制脉冲信号的时间长度。
一个完整的脉冲信号是有高电平部分和低电平部分共两部分组成的.所以,脉冲宽度调制可以简单的理解为就是调制脉冲信号的高电平或者低电平时间的长度。
而控制时间的长度,可以用计数器对时钟脉冲信号的计数来实现:
通过计数器的数值设定以及对溢出信号的使用,就可以实现对脉冲信号中的高电平或者低电平的时间进行限定.
在本次设计中,一共有两个设计方案,分别用不同的器件进行设计,但其中最重要的,最关键的部分,都是有关计数器的设计,用信号赋值的方式决定输出的电平的高低,通过相关计数器的数值设定,调制脉冲输出的电平的时间长度。
关键词:
1)脉冲宽度调制
2)时钟信号
3)计数器
4)D触发器
摘要---—--————--—-—----———-—————-———--——--——-————---—————--—--—-—-——--——-—-—————————2
关键词-—--——-—--—-——-————-—-—-—--—-———-----——-—---—--————-——--—-—-——-—--—--—---—-—-2
引言——---———--——-——-—-—---——-————--—-—-—----—-—-———-——-—----——--—————-————-------——-4
设计概述-—-—--—————————-—------——-——-—-—-—--—---———---—-—-—-———--——-—-----——---—--4
方案论证—-———--——-—-——--——---—-—-----—-——-—-————-—-—-——-—-—————-———-—————--———-—--5
源程序设计—--——-—--——-——-——--—---—-—--————-————-—-————----—---————-—--———---——--—6
方案选择-———————-—-————-————-——--—---——-—-—-—-—-————--—-----——---—-——-———--———-—-11
程序分析-——----——-——-——--————---—--—-—--————-—-—-——-—---——--———-—-—----——-—-—————11
设计程序仿真图————-——--—-—-——--———---—-———--—--———-—-----———-——--—---—-—--——--12
仿真分析—-————--—-----—-—--————-—--——-———---—-—-———-————----—-———--——--—-——-———-—13
设计总结—-—————---—-——--—--—-------——-------—-——------——-——---———————--—--—-—---—14
参考文献-—-—-——----———-——-—-———--—-———--—-—-—-----——--——-----——------——-—--—-—-——14
引言:
pwm即脉冲宽度调制,就是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
Pwm从处理器到被控系统信号都是数字式的,无需进行数模转换。
让信号保持为数字形式可将噪声影响降到最小,因此广泛应用在测量,通信和功率控制与交换的许多领域。
脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变.这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
PWM控制技术以其控制简单,灵活和动态响应好的优点而成为电力电子技术最广泛应用的控制方式,也是人们研究的热点.由于当今科学技术的发展已经没有了学科之间的界限,结合现代控制理论思想或实现无谐振波开关技术将会成为PWM控制技术发展的主要方向之一。
设计概述:
本次设计中,采用方案二进行设计。
用一个信号“CNT"来对时钟脉冲信号进行计数,并且将脉冲宽度调制信号设为pwmh和pwml两个信号。
用信号:
CNT,作为计数中间值.当计数数值信号CNT的计数数值小于其设定值的时候,每来一个时钟脉冲信号就将CNT加一,如果这个时候计数数值信号CNT的计数数值也小于或等于D信号输入值,就将pwmh信号置为高电平,pwml信号置为低电平。
当计数数值信号CNT的技术数值等于D信号的输入值的时候,便将输出信号翻转,即pwmh为低电平,pwml为高电平.当计数数值信号CNT的计数数值等于CNT设定值的时候,便将CNT置零,程序便再次循环作用,不断输出脉冲宽度调制信号。
由此达到脉冲宽度调制的目的.完成程序设计的目的。
方案论证:
本次设计一共设想了两个方案:
1)方案一:
用一个八位可自加载的加法计数器控制低电平的时间长度,用另一个八位可自加载的加法计数器控制高电平的时间长度,用一个D触发器来接收两个计数器的溢出信号和输出调制信号。
其中一个计数器的溢出信号接到D触发器的clk输入端,用来控制低电平的时间长短.另一个计数器的溢出信号接到D触发器的清零信号输入端,用来控制高电平的时间长短.
通过将D触发器的输出信号取反后加到控制低电平时间长短的计数器的置位端,让计数器回到初始值,并重新开始计数。
另一个控制高电平时间长短的计数器的置位端接入D触发器的输出信号,达到将计数器置入初始值,重新开始计数的目的。
这样,整个电路形成完整的回路,达到往返输出pwm信号的目的。
2)方案二:
在本方案中,将脉冲宽度调制信号设为了pwmh和pwml两个信号。
在输入端,通过D信号的输入值,CNT信号的设定值以及IF函数,达到计数的目的.
当计数数值信号CNT的计数数值小于其设定值的时候,每来一个时钟脉冲信号就将CNT加一,如果这个时候计数数值信号CNT的计数数值也小于或等于D信号输入值,就将pwmh信号置为高电平,pwml信号置为低电平。
当计数数值信号CNT的技术数值等于D信号的输入值的时候,便将输出信号翻转,即pwmh为低电平,pwml为高电平。
当计数数值信号CNT的计数数值等于CNT设定值的时候,便将CNT置零,程序便再次循环作用,不断输出脉冲宽度调制信号。
由此达到脉冲宽度调制的目的。
源程序设计:
方案一设计源程序:
1)八位可自加载假发计数器的源程序lcnt8.vhd
Libraryieee;
Useieee。
std_logic_1164。
all;
Entitylcnis
Port(clk,ld:
instd_logic;
D:
inintegerrange0to255;
Cao:
outstd_logic);
Endentitylcnt8;
Architectureartoflcnt8is
Signalcount:
integerrange0to255;
Begin
Process(clk)is
Begin
Ifclk'eventandclk=’1'then
Ifld=’1’thencount<=count+1;
Endif;
Endif;
Endprocess;
Process(count)is
Begin
Ifcount=255thenyc〈=’1';
Elseyc〈=’0’;
Endeif;
Endprocess;
2)Pwm信号发生器的源程序pwm。
Vhd:
Libraryieee;
Useieee。
std_loic_1164。
all;
Entitypwmis
Port(clk:
instd_logic;
A,b:
instd_logic_vector(7downto0);
Pwm:
outstd_logic);
Endentitypwm;
Architectureartofpwmis
Componentlcnt8is
Port(clk,ld:
instd_logic;
D:
instd_logic_vector(7downto0);
Yc:
outstd_logic);
Endcomponentlcnt8;
Signalyc1,yc2:
std_logic;
Signalld1,ld2:
std_logic;
Signalspwm:
std_logic;
Begin
U1:
lcnt8portmap(clk=>clk,ld=〉ld1,d=〉a,yc=〉yc1);
U2:
lcnt8portmap(clk=〉clk,ld=>ld2,d=>b,yc=>yc2);
Process(yc1,yc2)is
Begin
Ifyc1=〉'1'thenspwm〈=’0’;
Elsifyc2’eventandyc2=〉’1'thenspwm<=’1';
Endif;
Endprocess;
Ld1〈=spwm;
Ld2<=notspwm;
Pwm<=spwm;
Endarchitectureart;
End;
方案二源程序:
LIBRARYIEEE;
USEIEEE。
STD_LOGIC_1164。
ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE。
STD_LOGIC_ARITH。
ALL;
ENTITYPWMISPORT(
CLK:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(11DOWNTO0);
PWMH:
OUTSTD_LOGIC;
PWML:
OUTSTD_LOGIC);
ENDentitypwm;
ARCHITECTUREARTOFPWMIS
SIGNALPH:
STD_LOGIC;
SIGNALPL:
STD_LOGIC;
SIGNALCNT:
STD_LOGIC_VECTOR(11DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IFCLK’EVENTANDCLK='1'THEN
IFCNT=”000000001111"THENCNT〈="000000000000”;
elseCNT〈=CNT+'1';
ENDIF;
ENDIF;
IFCNT〈=DTHEN
PH<=’1’;
PL<=’0';
elsePH〈=’0';PL〈=’1’;
ENDIF;
ENDPROCESS;
process(clk)is
begin
IFCLK'EVENTANDCLK=’1'THEN
PWMH〈=PH;
PWML<=PL;
endif;
endprocess;
END;
方案选择:
由设计源程序可知,在第二个方案中,用一个IF语句就达到了方案一中的两个计数器的计数,去控制输出的目的,并且省略了D触发器。
在硬件上节约了很多资源,并且在程序上也显得简单得多。
所以采用方案二作为本次设计的最终方案。
程序分析:
本次设计,选择的方案是第二个。
由方案二的源程序可以看出:
运用到了数值加法计数,所以打开USEIEEE.STD_LOGIC_UNSIGNED。
ALL;USEIEEE.STD_LOGIC_ARITH。
ALL两个程序包。
由于信号是以高低电平输入或输出,所以打开了USEIEEE。
STD_LOGIC_1164。
ALL程序包。
在实体设计中,定义了时钟信号输入端口和D信号设定值输入端口,定义了两个脉冲宽度调试的输出信号。
在结构体中定义了两个输出信号:
pwmh和pwml,还定义了一个计数信号:
cnt,作为中间值。
由源程序可以知道,当计数数值信号CNT的计数数值小于其设定值的时候,每来一个时钟脉冲信号就将CNT加一,如果这个时候计数数值信号CNT的计数数值也小于或等于D信号输入值,就将pwmh信号置为高电平,pwml信号置为低电平.当计数数值信号CNT的技术数值等于D信号的输入值的时候,便将输出信号翻转,即pwmh为低电平,pwml为高电平.当计数数值信号CNT的计数数值等于CNT设定值的时候,便将CNT置零,程序便再次循环作用,不断输出脉冲宽度调制信号。
由此达到脉冲宽度调制的目的。
完成程序设计的目的。
设计程序仿真图:
方案二源程序仿真图
仿真分析:
由仿真图可以看出,D的输入值为10,在程序中得知CNT计数数值信号的设定值为15,所以,当前十个时钟信号来时,保持pwmh输出为高电平,pwml输出为低电平.当第十一个时钟到来时,输出信号翻转,将pwmh置为低电平,pwml置为高电平,保持五个时钟周期后,CNT的计数数值等于其设定数值,因此被置零,所以输出信号再次翻转,将pwmh输出置为高电平,pwml输出置为低电平,由此往返运行程序,便循环输出脉冲宽度调制信号。
综上所述,方案二的设计满足了设计要求。
设计总结:
脉冲宽度调制的程序设计本身是比较简单的,最重要的设计部分就是计数器的设计和如何运用计数器去控制脉冲宽度调制信号的切换与脉冲信号周期的长短。
除此之外,这个设计本无什么难度.
这次设计的源程序就实现了脉冲信号周期时间的控制以及电平信号的翻转这两个作用,所以其用途可以用来进行控制重复循环动作的切换,比如交通灯的亮灭与切换,切割机的切割动作的控制。
本次设计的最大的收获是来自于动手能力的提高,以前都是在书上读程序,而这次是自己写,感觉很不一样,虽然程序简单,但也花了不少时间。
另外就是对开发软件的熟悉程度跟以往相比提高很多。
参考文献:
[1]谭会生,张昌凡。
EDA技术及应用.西安电子科技大学出版社,2011
[2]杨晖,张凤言。
大规模可编程逻辑器件与数字系统设计.北京航空航天大学出版社,1998
[3]杨恒,李爱国,王辉。
FPGA/CPLD最新使用技术指南。
清华大学出版社,2005