在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2468|回复: 3

[原创] Xilinx FPGA入门连载11:PWM蜂鸣器驱动之功能概述

[复制链接]
发表于 2015-10-9 13:07:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
Xilinx FPGA入门连载0

特权同学,版权所有

配套例程和更多资料下载链接:

http://pan.baidu.com/s/1jGjAhEm

1.jpg


1 功能概述

蜂鸣器是一种最简单的发声元器件,它的应用也非常广泛,大都是作为报警或发声提醒装置。比如我们家里的电脑在刚开启时,通常主板上会发出一声较短的尖锐的“滴……”的鸣叫声,提示用户主板自检通过,可以正常进行后面的启动;而如果是11短或12短的鸣叫声,则表示可能发生了电脑内存或显卡故障;当然还可以有其他不同的鸣叫声提示其他的故障,总而言之,可别小看了这颗区区几毛钱的小家伙,关键时刻还挺有用的。可以毫不夸张的说,蜂鸣器也算是一种人机交互的手段。

PWMPulse Width Modulation),即脉冲宽度调制,如下图所示,PWM的输出只有高电平1和低电平0PWM不停的重复输出周期为T,其中高电平1时间为t的脉冲,t/T是它的占空比,1/T是它的频率。

2.jpg          如下图所示,这是SF-SP6板上蜂鸣器的电路原理图,BEEP网络连接到FPGAIO上,当BEEP = 1时,三极管Q1BE导通,则CE也导通,那么U42端直接接地,因此在它两端有5V的电压,那么蜂鸣器就发声了。同理,BEEP =0时,Q1截止,U42端相当于开路,则蜂鸣器不会发出声音。

3.jpg


如下图所示,基于蜂鸣器在FPGAIO输出1就发声、0则不发声的原理,我们给IO口一个占空比为50%PWM的信号,让蜂鸣器间歇性的发声鸣叫。如果它的频率高则发声就显得相对尖锐急促一些,如果它的发声频率低则发声就显得低沉平缓一些。

4.jpg


在我们给出的实例代码中,我们期望产生一个输出频率为25Hz40ms)、占空比为50%PWM信号去驱动蜂鸣器的发声。因此,我们使用系统时钟25MHz40ns)进行计数,每计数1,000,000次,这个计数器就清零重新计算。因为这个计数器是2进制的,要能够表达0-999999的任意一个计数值,那么这个2进制计数器至少必须是20位的。此外,为了得到输出的PWM占空比为50%,那么我们只要判断计数值小于最大计数值的一半即500000时,输出高电平1,反之输出低电平0


2 设计源码

//产生频率为25Hz,占空比为50%的蜂鸣器发声信号

module sp6(

            input ext_clk_25m,  //外部输入25MHz时钟信号

            input ext_rst_n,    //外部输入复位信号,低电平有效

            output reg beep //蜂鸣器控制信号,1--响,0--不响

        );


//-------------------------------------

reg[19:0] cnt;      //20位计数器


    //cnt计数器进行0-999999的循环计数,即ext_clk_25m时钟的1000000分频,对应cnt一个周期为25Hz

always @ (posedge ext_clk_25m or negedge ext_rst_n)

    if(!ext_rst_n) cnt <= 20'd0;

    else if(cnt < 20'd999_999) cnt<= cnt+1'b1;

    else cnt <= 20'd0;


//-------------------------------------


    //产生频率为25Hz,占空比为50%的蜂鸣器发声信号

always @ (posedge ext_clk_25m or negedge ext_rst_n)

    if(!ext_rst_n) beep <= 1'b0;

    else if(cnt < 20'd500_000) beep<= 1'b1;    //蜂鸣器响

    else beep <= 1'b0;      //蜂鸣器不响


endmodule





发表于 2015-10-9 13:40:48 | 显示全部楼层
顶,希望特权同学一直更下去,支持到底~~~
发表于 2015-10-9 13:45:43 | 显示全部楼层
请问一下,verilog中调用一个module,如果使用always改变一个寄存器变量的值,同时这个寄存器变量的值是module的一个输入,那么每次这个值改变,都会再调用一次module吗?是不是能理解为,这个被调用的module是整个verilog这个大module的子模块,每次这个寄存器值变化,相当于重新给了这个子模块一个输入量,子模块会无条件地进行运算,给出输出?
发表于 2015-10-17 18:43:12 | 显示全部楼层
不错!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-8 22:35 , Processed in 0.021239 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表