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这两上框架,都是比较有名的框架,先上图: 上面就是用来点菜的界面,左边是已点 ...
随机推荐
- HQL查询——HQL查询的基本用法
HQL查询--HQL查询的基本用法 1.HQL语法类似于SQL语法,但是需要注意的是,HQL是一种完全面向对象的查询语言.SQL语言操作的对象是数据表.列等数据库对象,而HQL语言的操作对象是类.实例 ...
- SpringMVC和MyBatis整合
目前主流的Web MVC框架,除了Struts这个主力 外,还有Spring MVC,主要是由于Spring MVC配置比较简单,使用起来也十分明了,非常灵活,与Spring 集成较好,对RESTfu ...
- .net 网站开发学习资源
慕课网 前端基础学习 http://www.imooc.com/course/list?c=fe 了解需求 例子之一 http://wenku.it168.com/d_000517899.shtml ...
- Install Nvidia driver 367.18 or later
Install Nvidia driver 367.18 or later from ppa:graphics-drivers/ppa as follows: sudo add-apt-reposit ...
- CentOS6.5安装Nginx
1.安装prce(重定向支持)和openssl(https支持,如果不需要https可以不安装.) yum -y install pcre* yum -y install openssl* 2.下载n ...
- [bzoj2743][HEOI2012]采花(树状数组+离线)
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 1832 Solved: 954[Submit][Status] ...
- sql 查看某用户的连接数 以及 如何删除该用户的会话
--查看不同用户的连接数 select TERMINAL from v$session where username='username' and machine='machine' ---查询用户会 ...
- iOS - WXPay 微信支付
1.微信支付申请 微信支付官方集成指引 微信支付官方集成指导视频 微信 APP 支付开发者文档 微信公众平台 微信开放平台 微信商户平台 1.1 微信 APP 支付申请步骤 APP 支付:APP 支付 ...
- 慕课网__CSS__vertical align
- C语言程序设计进阶 第1周编程题
第1周编程题 查看帮助 返回 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数 ...