STEP模块——电子琴
电子琴原理
什么是声音?上过初中的朋友都知道声音是由震动所产生的。一定频率的震动就产生了一定频率的声音。
理论研究第一步,让喇叭发出do re mi fa sol la si的音,我们先不管do的频率是不是261hz,更重要的是我们必须知道,每个音之间的频率关系,初中老师说,do re mi这三个音相邻两个音是全音关系,mi 和 fa 是半音关系,fa sol la si 这四个音相邻两个音也是全音关系。全音关系意味着振动频率关系为2的开六次方,即1.12246,半音关系意味着频率关系为2的开16次方,即1.05946。什么意思呢?比如do为261hz,那么re 为261*1.12246=293hz,以此类推,mi为293*1.12246=329hz,fa和mi成半音关系,则fa为329*1.05946=348hz。这样算下去,可以得到所有音的频率了。
原理设计
通过产生脉冲信号驱动无源蜂鸣器来产生相应频率的声音,7个按键对应do re mi fa sol la si的音,蜂鸣器由三极管驱动
如图,按键需要加上拉电阻(由于FPGA内部可以设置为上啦,所以没有外接 )。蜂鸣器由三极管来驱动。使用小脚丫FPGA板
功能描述
模式一,通过按键来弹奏,同时按下do 和 si 键切换到自动播放模式
模式二,自动播放音乐,
verilog代码如下
/*--------------------------------------------------------------------------------------
-- Filename ﹕ piano.v
-- Author ﹕tony-ning
-- Description ﹕piano-based STEP PGGA board
-- Called by ﹕--
-- Revision History ﹕15-10-26
-- Revision 1.0
--
---------------------------------------------------------------------------------------*/ module piano
(
input CLK,
input [:]key,
output reg beep
);
/*-------------------------------define --------------------------------------*/
parameter dao ='b1111110; //261hz countmax 47892
parameter ruai='b1111101; //293hz countmax 42662
parameter mi ='b1111011; //329hz countmax 37993
parameter fa ='b1110111; //349hz countmax 35816
parameter suo ='b1101111; //392hz countmax 31887
parameter la ='b1011111; //440hz countmax 28409
parameter xi ='b0111111; //493hz countmax 25354 reg [:]sheet[:]; initial
begin
sheet[]<= 'b1111110;
sheet[]<= 'b1111110;
sheet[]<= 'b1101111;
sheet[]<= 'b1101111;
sheet[]<= 'b1011111;
sheet[]<= 'b1011111;
sheet[]<= 'b1101111;
sheet[]<= 'b1111111;
sheet[]<= 'b1110111;
sheet[]<= 'b1110111;
sheet[]<=mi;
sheet[]<=mi;
sheet[]<=ruai;
sheet[]<=ruai;
sheet[]<=dao;
sheet[]<='b1111111;
sheet[]<='b1101111;
sheet[]<='b1101111;
sheet[]<='b1110111;
sheet[]<='b1110111;
sheet[]<=mi;
sheet[]<=mi;
sheet[]<=ruai;
sheet[]<='b1111111;
sheet[]<='b1101111;
sheet[]<='b1101111;
sheet[]<='b1110111;
sheet[]<='b1110111;
sheet[]<=mi;
sheet[]<=mi;
sheet[]<=dao;
sheet[]<='b1111111;
end
/*-------------------------------use internal osc--------------------------------------
// Internal Oscillator
defparam OSCH_inst.NOM_FREQ = "2.08";// This is the default frequency
//defparam OSCH_inst.NOM_FREQ = "24.18";
OSCH OSCH_inst( .STDBY(1'b0), // 0=Enabled, 1=Disabled
// also Disabled with Bandgap=OFF
.OSC(osc_clk),
.SEDSTDBY()); // this signal is not required if not
// using SED -------------------------------piano --------------------------------------*/
reg [:]rcount=,countmax,mcount;
reg run,state=;
reg [:]num=;
reg [:]rsheet;
always@(posedge CLK)
case(state)
: begin
case(key)
dao : begin countmax<=; run<=; if(countmax >)rcount<=; end //set the max count
ruai: begin countmax<=; run<=; if(countmax >)rcount<=; end
mi : begin countmax<=; run<=; if(countmax >)rcount<=; end
fa : begin countmax<=; run<=; if(countmax >)rcount<=; end
suo : begin countmax<=; run<=; if(countmax >)rcount<=; end
la : begin countmax<=; run<=; if(countmax >)rcount<=; end
xi : begin countmax<=; run<=; if(countmax >)rcount<=; end
default : run<=;
endcase if(rcount==countmax && run) //produce the frequency
begin
rcount<=;
beep<=~beep;
end
else rcount<=rcount+; if(key=='b0111110) //push dao and xi keys will play the pre sound
state<=; end : begin
if(mcount==12_500_000) //meter produce
begin
mcount<=;
if(num==)
num<=;
else num<=num+;
rsheet<=sheet[num];
end
else mcount<=mcount+; case(rsheet)
dao : begin countmax<=; run<=; if(countmax >)rcount<=; end //set the max count
ruai : begin countmax<=; run<=; if(countmax >)rcount<=; end
mi : begin countmax<=; run<=; if(countmax >)rcount<=; end
fa : begin countmax<=; run<=; if(countmax >)rcount<=; end
suo : begin countmax<=; run<=; if(countmax >)rcount<=; end
la : begin countmax<=; run<=; if(countmax >)rcount<=; end
xi : begin countmax<=; run<=; if(countmax >)rcount<=; end
default : run<=;
endcase if((rcount==countmax) && run) //produce the frequency
begin
rcount<=;
beep<=~beep;
end
else rcount<=rcount+; if(key=='b0111101) //push dao and la keys will back to make music
state<=; end
endcase endmodule
piano.v

PCB


实物图



STEP模块——电子琴的更多相关文章
- STEP模块——电子钟
原理 显示时分秒(日期也可以加上),两个按键调节时间 原理图 代码 /*---------------------------------------------------------------- ...
- Simulink仿真入门到精通(二) Simulink模块
2.1 Simulink模块的组成要素 用户构建系统模型时无需直接面对成千上万行的代码,而是通过模块化图形界面以模块化的方式构建,能够使理解变得容易,让大脑减负.通过层次化模块分布将系统功能模块化,而 ...
- ABAQUS/CAE——Context
Part(部分) 用户在Part单元内生成单个部件,可以直接在ABAQUS/CAE环境下用图形工具生成部件的几何形状,也可以从其他的图形软件输入部件.详细可参考ABAQUS/CAE用户手册第15章. ...
- Step By Step(Lua模块与包)
Step By Step(Lua模块与包) 从Lua 5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块.从使用者的角度来看,一个模块就是一个程序库,可以通过requi ...
- step by step 之餐饮管理系统六(数据库访问模块)
距上次写的博客已经好几个月,一方面公司里面有很多的东西要学,平时的时候又要写代码,所以没有及时更新,不过现在还好,已经成型了,现在把之前的东西贴出来,先看一下现在做的几个界面吧.第一个界面是用颜色用区 ...
- step by step 之餐饮管理系统五(Util模块)------附上篇日志模块源码
这段时间一直在修改日志模块,现在基本上写好了,也把注释什么的都加上了,昨天邮件发送给mark的园友一直报失败,老是退回来,真是报歉,如下图所示:
- step by step 之餐饮管理系统四(日志模块实现)
三天前基本上把数据库表设计的文档写好,今天想到了一个问题,还要再加几个表,一个是log表,用来记录系统日志,另外再加几个字典表,一些需要配置的数据但又不好放在像xml文件里面的数据可以放在这些字典表里 ...
- Nginx 模块开发(1)—— 一个稍稍能说明问题模块开发 Step By Step 过程
1. Nginx 介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/S ...
- step by step 之餐饮管理系统七(点菜模块实现)
好长时间没有更新这个系列了,一是因为这段时间比较忙,有很多事情,二来要学习新的东西,AngularJs,devExpress这两上框架,都是比较有名的框架,先上图: 上面就是用来点菜的界面,左边是已点 ...
随机推荐
- 【前端】Ember.js学习笔记
Model 在默认情况下,model钩子返回的值,会设置为关联的控制器的model属性.例如,如果App.PostsRoute通过model钩子返回了一个对象,这个对象会设置为App.PostsCon ...
- Spring MVC上传文件
Spring MVC上传文件 1.Web.xml中加入 <servlet> <servlet-name>springmvc</servlet-name> <s ...
- gravity与layout_gravity的区别
android:gravivty 控件的内容显示位置 android:layout_gravity 控件在屏幕的布局位置,相对于容器或者父控件的位置
- Microsoft Web Platform Installer 5.0
Microsoft Web Platform Installer 5.0 Web 平台安装器 https://www.microsoft.com/web/downloads/platform.aspx
- 关于 jquery和js获取宽度时只能取整数,取不到小数点
最近在改版自已的一个网站的时候,遇到了一个问题. 用jquery的width()函数获取元素宽度的时候,返回得到的是整数,而不是小数. 如下图,谷歌上显示的宽度为1078.89px 而我用控制台输出了 ...
- linux内核学习心得
最初在其他课程做实验的时候接触到了linux,震撼于linux的开源精神,想更了解linux的内部原理,选了这门课程.通过这门课程对linux内部实现有了一定的了解,主要是中断.进程切换.系统函数的具 ...
- Pod 的安装
1.如果之前已经安装过的 gem list --local | grep cocoapods 会看到如下输出: cocoapods (1.1.1)cocoapods-deintegrate (1.0. ...
- HTML <a> download 属性,点击链接来下载图片
Html5里面的 标签的 Download 属性可以设置一个值来规定下载文件的名称.所允许的值没有限制,浏览器将自动检测正确的文件扩展名并添加到文件 (.img, .pdf, .txt, .html, ...
- linux建立一个快捷方式,连接到另一个目录
sudo ln -s 源目录 目标快捷方式比如你要在/etc下面建立一个叫LXBC553的快捷方式,指向/home/LXBC,那就是sudo ln -s /home/LXBC /etc/LXBC553
- 解决Mac下MX4手机无法连接adb问题之解决方案
一般的android连接mac 很方便不用安装驱动就可以啦,可是不知道为什么特殊情况下有的android手机(小米2,华为等)就是连接不上,下来就说说特殊情况下如何连接. 使用USB连接安卓手机后可以 ...