可以弹奏高中低音电子琴设计Verilog代码Quartus 开发板
名称:可以弹奏高中低音电子琴设计Verilog代码Quartus 开发板
软件:Quartus
语言:Verilog
代码功能:
可以弹奏高中低音电子琴设计
使用21个键,7个键为一个音调,一共三种音调,高中低。
在此,首先介绍一下硬件电路的发声原理。我们知道,声音的频谱范围约在几十到几千赫兹,如果将一定频率的方波接上扬声器就能发出相应频率的声音。而乐曲中的每一音符对应着一个确定的频率,因此,要想FPGA 发出不用音符的音调,实际上只要控制它输出相应音符的频率即可(音符和频率的关系见下表)
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素。而简易电子琴,工作原理与乐曲演奏一样,只是将固定预置乐曲变成了手动按键输入,节拍时间取决于按键的停留时间,如果合适,同样能播放出完整的歌曲来。频率的高低决定了音调的高低。音乐的十二平均率规定:每两个八度音(如简谱中的中音1 和高音1)之间的频率相差一倍。在两个八度音之间又分为十二个半音。另外,音名A(简谱中的低音6)的频率为440Hz,音名B 到C 之间、E 到F 之间为半音,其余为全音。由此可以计算出简谱中从低音1 到高音1 之间每个音名对应的频率,所有不同频率的信号都是从同一个基准频率分频得到的。由于音阶频率多为非整数,而分频系数又不能为小数,因此必须将计算得到的分频数四舍五入取整。因此,要想FPGA 发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。本文中选取50MHZ 作为CLK 的分频计数器的输入分频信号。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。采用50M 时钟,分频表如下所示:
表 1 频率与分频系数
音名 | 频率/Hz | 分频 系数 | 音名 | 频率/Hz | 分频 系数 | 音名 | 频率/Hz | 分频 系数 |
低音 1 | 261.6 | 191132 | 中音 1 | 523.3 | 95548 | 高音 1 | 1045.5 | 47824 |
低音 2 | 293.7 | 170242 | 中音 2 | 587.3 | 85136 | 高音 2 | 1174.7 | 42564 |
低音 3 | 329.6 | 151700 | 中音 3 | 659.3 | 75838 | 高音 3 | 1318.5 | 37922 |
低音 4 | 349.2 | 143184 | 中音 4 | 698.5 | 71582 | 高音 4 | 1396.9 | 35794 |
低音 5 | 392 | 127551 | 中音 5 | 784 | 63776 | 高音 5 | 1568 | 31888 |
低音 6 | 440 | 113636 | 中音 6 | 880 | 56818 | 高音 6 | 1760 | 28410 |
低音 7 | 493.9 | 101236 | 中音 7 | 987.8 | 50618 | 高音 7 | 1975.5 | 25310 |
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在开发板验证,开发板如下,其他开发板可以修改管脚适配:

演示视频:
设计文档:
1、工程文件

2、程序文件



3、程序编译

4、RTL图(顶层原理框图)

5、管脚分配

6、Testbench

7、仿真图
整体仿真图


分频模块

音调控制模块

矩阵按键输入模块

编码控制模块

数码管控制模块


部分代码展示:
//输入模块 module data_input( input clk_500KHz,//500KHZ input reset, input [3:0] L_row,//行 output [3:0] H_col,//列 output key_0_rise,//琴键0 output key_1_rise,//琴键1 output key_2_rise,//琴键2 output key_3_rise,//琴键3 output key_4_rise,//琴键4 output key_5_rise,//琴键5 output key_6_rise,//琴键6 output key_7_rise,//琴键7 output key_8_rise,//琴键8 output key_9_rise,//琴键9 output key_10_rise,//琴键10 output key_11_rise,//琴键11 output key_12_rise,//琴键12 output key_13_rise,//琴键13 output key_14_rise,//琴键14 output key_15_rise //琴键15 ); wire [15:0] key_number;// key_4x4 i_key_4x4 ( .clk_500KHz(clk_500KHz),//500KHZ .reset(reset), //低电平复位 .L_row(L_row), //行 .H_col(H_col), //列 .key_number(key_number)//按键键值 ); assign key_0_rise =key_number[0]; assign key_1_rise =key_number[1]; assign key_2_rise =key_number[2]; assign key_3_rise =key_number[3]; assign key_4_rise =key_number[4]; assign key_5_rise =key_number[5]; assign key_6_rise =key_number[6]; assign key_7_rise =key_number[7]; assign key_8_rise =key_number[8]; assign key_9_rise =key_number[9]; assign key_10_rise=key_number[10]; assign key_11_rise=key_number[11]; assign key_12_rise=key_number[12]; assign key_13_rise=key_number[13]; assign key_14_rise=key_number[14]; assign key_15_rise=key_number[15]; //reg key_0_buf1=0; //reg key_1_buf1=0; //reg key_2_buf1=0; //reg key_3_buf1=0; //reg key_4_buf1=0; //reg key_5_buf1=0; //reg key_6_buf1=0; //reg key_7_buf1=0; //reg key_8_buf1=0; //reg key_9_buf1=0; //reg key_A_buf1=0; //reg key_B_buf1=0; //reg key_C_buf1=0; //reg key_D_buf1=0; //reg key_E_buf1=0; //reg key_F_buf1=0; // //reg key_0_buf2=0; //reg key_1_buf2=0; //reg key_2_buf2=0; //reg key_3_buf2=0; //reg key_4_buf2=0; //reg key_5_buf2=0; //reg key_6_buf2=0; //reg key_7_buf2=0; //reg key_8_buf2=0; //reg key_9_buf2=0; //reg key_A_buf2=0; //reg key_B_buf2=0; //reg key_C_buf2=0; //reg
代码文件(付费下载):
![]()
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 可以弹奏高中低音电子琴设计Verilog代码Quartus 开发板
发表评论
模板文件不存在: ./template/plugins/comment/pc/index.htm