电子琴原理

什么是声音?上过初中的朋友都知道声音是由震动所产生的。一定频率的震动就产生了一定频率的声音。

理论研究第一步,让喇叭发出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模块——电子琴的更多相关文章

  1. STEP模块——电子钟

    原理 显示时分秒(日期也可以加上),两个按键调节时间 原理图 代码 /*---------------------------------------------------------------- ...

  2. Simulink仿真入门到精通(二) Simulink模块

    2.1 Simulink模块的组成要素 用户构建系统模型时无需直接面对成千上万行的代码,而是通过模块化图形界面以模块化的方式构建,能够使理解变得容易,让大脑减负.通过层次化模块分布将系统功能模块化,而 ...

  3. ABAQUS/CAE——Context

    Part(部分) 用户在Part单元内生成单个部件,可以直接在ABAQUS/CAE环境下用图形工具生成部件的几何形状,也可以从其他的图形软件输入部件.详细可参考ABAQUS/CAE用户手册第15章. ...

  4. Step By Step(Lua模块与包)

    Step By Step(Lua模块与包) 从Lua 5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块.从使用者的角度来看,一个模块就是一个程序库,可以通过requi ...

  5. step by step 之餐饮管理系统六(数据库访问模块)

    距上次写的博客已经好几个月,一方面公司里面有很多的东西要学,平时的时候又要写代码,所以没有及时更新,不过现在还好,已经成型了,现在把之前的东西贴出来,先看一下现在做的几个界面吧.第一个界面是用颜色用区 ...

  6. step by step 之餐饮管理系统五(Util模块)------附上篇日志模块源码

    这段时间一直在修改日志模块,现在基本上写好了,也把注释什么的都加上了,昨天邮件发送给mark的园友一直报失败,老是退回来,真是报歉,如下图所示:

  7. step by step 之餐饮管理系统四(日志模块实现)

    三天前基本上把数据库表设计的文档写好,今天想到了一个问题,还要再加几个表,一个是log表,用来记录系统日志,另外再加几个字典表,一些需要配置的数据但又不好放在像xml文件里面的数据可以放在这些字典表里 ...

  8. Nginx 模块开发(1)—— 一个稍稍能说明问题模块开发 Step By Step 过程

    1. Nginx 介绍        Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/S ...

  9. step by step 之餐饮管理系统七(点菜模块实现)

    好长时间没有更新这个系列了,一是因为这段时间比较忙,有很多事情,二来要学习新的东西,AngularJs,devExpress这两上框架,都是比较有名的框架,先上图: 上面就是用来点菜的界面,左边是已点 ...

随机推荐

  1. web前端之HTML中元素的区分

    作为前端人员,我们就是要与各种超文本标记打交道,用到各种不同的标签元素.在使用的时候不知道有没有注意到他们的分类归属?现在就来说一说博主的见解: 目前博主总结了三种分类方法:一是按封闭来划分,一是按显 ...

  2. JSON数据解析

    1 JSON简介 JSON(JavaScript Object Notation),类似于XML,是一种轻量级的数据交换格式,比如在JavaEE中Struts2与Ajax在来回传递数据时,除了可以利用 ...

  3. NSJSONSerialization(json序列化)

    //通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据 NSJSONSerialization isValidJSONObject:obj 我们能利用N ...

  4. asp.net天网代码

    自己整理的asp.net中国天气网的城市代码 完整下载 case "北京": Code = "101010100"; break; case "海淀& ...

  5. elasticsearch 初学 笔记(1)

    使用 curl进行数据的的格式, 1.下载curl,配置路径 格式 C:\Users\Administrator>curl -XPUT http://localhost:9200/dept/em ...

  6. Web开发中20个很有用的CSS库

    来源: 微信公众号文章 在过去的几年中,CSS已经成为一大部分开发者和设计者的最爱,因为它提供了一系列功能和特性.每个月都有无数个围绕CSS的工具被开发者发布以简化WEB开发.像CSS库,框架,应用这 ...

  7. C++ 字符编码转换类

    记录一下C++ 编码转换的函数: #pragma once #include "afx.h" #define DEFAULT_CODE 0 #define CHINESE_SIMP ...

  8. Android导航栏菜单强制转换

    private void getOverflowMenu() { ViewConfiguration viewConfig = ViewConfiguration.get(this); try { F ...

  9. $.inArray()

    原文链接:http://www.css88.com/jqapi-1.9/jQuery.inArray/ jQuery.inArray( value, array [, fromIndex ] )返回: ...

  10. Python之路 day3 函数定义 *args及**kwargs

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa import time # def logger(): # time_format ...