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这两上框架,都是比较有名的框架,先上图: 上面就是用来点菜的界面,左边是已点 ...
随机推荐
- EXCEL如何提取文字中包含的数字?
方法1:=IF(ISERROR(FIND("-",A1)),"","-")&MID(SUM(MID(101&A1,2+LAR ...
- 浏览器禁止js打开新窗口
在项目中,有个需求是需要ajax获取新地址,然后去打开该页面地址,这样会被浏览器拦截,可以采取以下方式:1.再ajax请求先前,先创建一个新窗口 var newTab = window.open('' ...
- Vi指令,随时追加
1.设置tab键的空格数 :set tabstop=4 2.显示行号 :set nu
- oracle的imp导入时覆盖目标数据库
背景:oracle正式库通过exp命令导出的dmp备份包,现在通过imp命令还原到测试库,测试库上面的表数据全部不要,要用新的. 方法:先删除用户.用户所在表空间,再新建用户和表空间,再imp导入. ...
- 利用scrapy-splash爬取JS生成的动态页面
目前,为了加速页面的加载速度,页面的很多部分都是用JS生成的,而对于用scrapy爬虫来说就是一个很大的问题,因为scrapy没有JS engine,所以爬取的都是静态页面,对于JS生成的动态页面都无 ...
- Fair Scheduler 队列设置经验总结
Fair Scheduler 队列设置经验总结 由于公司的hadoop集群的计算资源不是很充足,需要开启yarn资源队列的资源抢占.在使用过程中,才明白资源抢占的一些特点.在这里总结一下. 只有一个队 ...
- 《C++ Primer》学习笔记【第三部分 类设计者的工具】
第13章 拷贝控制 使用default:=defult只能修饰默认构造函数或拷贝控制成员,显式地要去编译器生成合成的版本. 使用delete:=delete通知编译器不希望定义这些成员,禁止试图使用它 ...
- windows apache开启url rewrite
加载Rewrite模块: 在conf目录下httpd.conf中找到 LoadModule rewrite_module modules/mod_rewrite.so 这句,去掉前边的注释符号“#”, ...
- [分享] 《步步为营封 Win7》--skyfree
[分享] <步步为营封 Win7>--skyfree Skyfree 发表于 2009-9-13 05:51:32 https://www.itsk.com/thread-20957-1- ...
- react+redux完整项目
地址:https://segmentfault.com/a/1190000007642740?utm_source=tuicool&utm_medium=referral