《FPGA播放声音和音乐.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《FPGA播放声音和音乐

这里我们将让我们的FPGA播放声音和音乐。我们从产生一个单频音开始。然后,逐步让它实现一些更加有趣的功能,例如播放警笛和曲子。 这个工程中用到的硬件器件包括:一块Pluto板、一个扬声器(speaker)以及一个1千欧姆的电阻(resistor)。 ? 关于此硬件系统的一个更加正式的表示方法如下图所示: ? 振荡器(oscillator)产生一个固定频率输入到FPGA,FPGA将此频率分频后驱动一个I/O口。这个I/O口通过一个1千欧姆的电阻连接到一个扬声器。通过改变这个I/O口的输出频率,就可以使扬声器发出各种声音。 HDL(硬件描述语言)设计 这里将分三部分来描述它: ?第一部分 - 简单的哔哔声 ?第二部分 - 警笛声 ?第三部分 - 曲调 简单的哔哔声 FPGA 可以很容易就实现二进制的计数。让我们从一个16位的计数器开始。首先从25MHz的时钟开始,对于这个时钟信号,我们可以简单的应用计数器来实现“分频”。一个16位的计数器从0计到65535(一共65536个不同的值)。计数器的最高位将65536=381Hz的频率翻转。 对应的Verilog HDL语言如下所示: 代码 module?music(clk,?speaker); ?? input?clk; ?? output?speaker; ?? ?? //?16位的2进制计数器 ?? reg?[15:0]?counter; ?? always?@(posedge?clk)?counter?=?counter+1; ?? ?? //?使用计数器的最高有效位驱动扬声器 ?? assign?speaker?=?counter[15]; ?? ?? endmodule?? 计数器的最低有效位(counter[0])以12.5MHz的频率翻转,类似的counter[1]以6.125MHz的频率翻转,以此类推。我们使用最高有效位(counter[15])来驱动扬声器。这样就可以给扬声器输出一个很好的381Hz的方波。 A 调 (440Hz) 好了,与其产生一个随机的频率,为何不试试得到一个440Hz的频率。这个频率就是“A”调的频率。这样一来,我们需要将25MHz的信号56818分频,下面是对应的Verilog HDL代码。 代码 module?music(clk,?speaker); ?? input?clk; ?? output?speaker; ?? ?? reg?[15:0]?counter; ?? always?@(posedge?clk)?if(counter==56817)?counter?=?0;?else?counter?=?counter+1; ?? ?? assign?speaker?=?counter[15]; ?? ?? endmodule?? 问题来了,输出信号的频率虽然是希望的440Hz,但是其占空比不再是50%。因为低电平从0一直维持到32767(期间counter[15]等于0),而高电平则从32768维持到56817。这样输出信号中,高电平的占空比仅为42%。 最简单的得到50%占空比的办法是添加一个状态,使输出信号先28409分频(56818的一半),然后再2分频。以下是修改后的Verilog HDL代码。 代码 module?music(clk,?speaker); ?? input?clk; ?? output?speaker; ?? ?? reg?[14:0]?counter; ?? always?@(posedge?clk)?if(counter==28408)?counter?=?0;?else?counter?=?counter+1; ?? ?? reg?speaker; ?? always?@(posedge?clk)?if(counter==28408)?speaker?=?~speaker; ?? ?? endmodule?? 添加一个参数 下面的代码跟上面的代码效果完全一样,一个名为“clkdivider”的参数被添加到代码中,而计数器则变为向下技术(这个只是个人爱好问题). 代码 module?music(clk,?speaker); ?? input?clk; ?? output?speaker; ?? parameter?clkdivider?=440/2; ?? ?? reg?[14:0]?counter; ?? always?@(posedge?clk)?if(counter==0)?counter?=?clkdivider-1;?else?counter?=?counter-1; ??

文档评论(0)

guojiahao8 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档