fpga4fun.com/Music box

news/2024/11/27 23:27:52/

1.Simple beep

先做一个简单地蜂鸣器,原理是晶振通过不同的分频器分成不同的频率,通过电路发出音调不同的声音。
例子中Pluto FPGA板子有25Mhz的时钟频率,采用16位计数器(可以产生65536个不同的数值),则最高位的频率是25000000/65536=381hz(通过计数器不同位数进行分频,产生不同的频率),例如第0位就是25Mhz/ 2^0 =12.5Mhz…最高位就是以381hz的频率在0/1之间来回切换
实例代码如下:

module music(clk, speaker);
input clk;
output speaker;// first create a 16bit binary counter
reg [15:0] counter;
always @(posedge clk) counter <= counter+1;// and use the most significant bit (MSB) of the counter to drive the speaker
assign speaker = counter[15];
endmodule

现在产生的是381hz的声音

“A”的声音

A的声音频率是440hz,若要产生440hz的声音,则25000000/440 = 56818.18
则需要16位计数器到56817的时候重新开始计数,但对于32768(2^15)~ 56817 的占空比为42%(24049/56818),若要实现0.5占空比,最简单的方法是除以2(58818/2=28409),所以若要获得440hz的频率且具有0.5的占空比,需要在半个周期内(计数器为28409)将电平清零取反。
简单来说,晶振频率/时间 = 想要的频率
用计数器实现时间的确定,用计数的办法,也就是加法比如需要30%高电平,70%低电平,加到30取反清零,然后加到70再取反
代码如下:

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

救护车来了

救护车的音调为tone[23] 25000000/2^23 = 1.5hz
音调一致,两次响铃间隔时间来回交替,一个时间为clkdivider-1,一个为clkdivider/2 -1,也就是形成所谓的占空比,当tone[23]=1,维持时间为clkdivider-1,为0时维持时间clkdivider/2 -1,代码如下:


module music(clk, speaker);
input clk;
output speaker;
parameter clkdivider = 25000000/440/2;reg [23:0] tone;
always @(posedge clk) tone <= tone+1;reg [14:0] counter;
always @(posedge clk) if(counter==0) counter <= (tone[23] ? clkdivider-1 : clkdivider/2-1); else counter <= counter-1;reg speaker;
always @(posedge clk) if(counter==0) speaker <= ~speaker;
endmodule

http://www.ppmy.cn/news/903648.html

相关文章

WITH( NOLOCK)

在select查询的时候&#xff0c;有时为了提高查询的效率会引用入 WITH( NOLOCK) &#xff0c;但是这样会引起脏读数据 eg&#xff1a;SELECT * FROM table1 WITH( NOLOCK) LEFT JOIN table2 WITH( NOLOCK) ON table1.atable2.b 这篇感觉不错http://www.cnblogs.com/hsapph…

锁+LOCK

--锁 总结锁&#xff08;LOCKING&#xff09;是最常用的并发控制机构。是防止其他事务访问指定的资源控制、实现并发控制的一种主要手段。锁是事务对某个数据库中的资源&#xff08;如表和记录&#xff09;存取前&#xff0c;先向系统提出请求&#xff0c;封锁该资源&#xff0…

关于Lock锁

Synchronized锁的缺陷 Synchronized不会手动释放锁资源&#xff0c;当线程发生阻塞后&#xff0c;其他线程只能眼睁睁的等着&#xff0c;不会分别是读线程和写线程&#xff0c;读问题并不会引发高并发&#xff0c;但是synchronized锁不能识别是读线程还是锁线程 &#xff0c;遇…

KeyLock

在这篇文章https://bbs.csdn.net/topics/390523873基础上改进的 public class KeyLock<K> {// 保存所有锁定的KEY及其信号量private final ConcurrentMap<K, Semaphore> map new ConcurrentHashMap<K, Semaphore>();// 保存每个线程锁定的KEY及其锁定计数p…

[转贴]What's the Scroll Lock key on my computer for?

你知道键盘上Scroll Lock键有什么用吗&#xff1f;可能大多数人都不知道这个键&#xff0c;恐怕它只是为了点亮键盘上的一个灯而以。但从原来DOS以来的人们估计或多或少的知道这个键是用于滚动锁定的&#xff0c;那具体是怎么一回事呢&#xff1f;请看下文&#xff1a;[原文链接…

CBlock

第三章 本章将介绍一些新的数据结构。除非特别说明&#xff0c;本章提到的所有的类与函数均位于main.h或main.cpp。 每个节点均保存有一个区块链副本。区块链由相互连接的区块&#xff08;CBlock实例&#xff09;所构成。每个区块包含多笔交易&#xff08;CTransaction实力&…

wholocking me

今天在cmd下边查看一个ax的时候&#xff0c;发现它没有用&#xff0c;准备del掉它&#xff0c;没有想到却说 “拒绝访问。” 难道是因为有其他的进程转载了它&#xff0c;不能删除。 想起了用到的wholocking me工具&#xff0c;看看是哪个进程装载了它。不过这个工具是GUI的&am…

文件被system进程锁定,不能删除

文件被system进程锁定&#xff0c;不能删除&#xff0c;没有明显用户进程操作此文件。 软件UNLOCKER,WHOLOCKME,LOCK HUNTER之类的&#xff0c;可能需要重启才能解决问题&#xff0c;这在生产环境 中是不可接受的。 能作的还是慢慢搜索可用解决方案。。 然后&#xff0c;找到此…