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这两上框架,都是比较有名的框架,先上图: 上面就是用来点菜的界面,左边是已点 ...
随机推荐
- Python3基础 casefold 将字符串中的所有字符变成小写
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 【leetcode❤python】 204. Count Primes
#-*- coding: UTF-8 -*- #Hint1:#数字i,i的倍数一定不是质数,因此去掉i的倍数,例如5,5*1,5*2,5*3,5*4,5*5都不是质数,应该去掉#5*1,5*2,5*3 ...
- python学习之深入
一.迭代器和生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. ...
- web前端之HTML中元素的区分
作为前端人员,我们就是要与各种超文本标记打交道,用到各种不同的标签元素.在使用的时候不知道有没有注意到他们的分类归属?现在就来说一说博主的见解: 目前博主总结了三种分类方法:一是按封闭来划分,一是按显 ...
- Java GUI编程
----基础 // 创建一个窗体对象 JFrame frame = new JFrame(); // 设置窗口大小 frame.setSize(300, 20 ...
- 如何为数据源向导填加一种自定义的数据源类型(win示例)
https://www.devexpress.com/Support/Center/Example/Details/T310160
- LINQ之路 9:LINQ to SQL 和 Entity Framework(上)
在上一篇中,我们从理论和概念上详细的了解了LINQ的第二种架构“解释查询”.在这接下来的二个篇章中,我们将使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的 ...
- HttpClient 4.5.x 工具类设计与实现
最近,业务需要在java服务端发起http请求,需要实现"GET","POST","PUT"等基本方法.于是想以 "HttpCli ...
- 实验一 DOS
实验一.DOS实验 一. 实验目的 DOS(Disk Operating System)是一个使用得十分广泛的磁盘操作系统,就连眼下流行的Windows9x/ME系统都是以它为基础 ...
- iis设置asp站点
在 IIS 6.0 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击.譬如说默认配置数据库属性实施的最大 ASP 张贴大小为 204,800 个字节,并将各个 ...