• 方案介绍
  • 相关推荐
申请入驻 产业图谱

电子琴 FPGA 设计 Verilog Vivado

7小时前
140
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称:电子琴 FPGA 设计 Verilog Vivado

软件:Vivado

语言:Verilog

功能介绍

本设计实现一个 FPGA 电子琴系统,顶层模块为 dianziqin,使用 50MHz 系统时钟工作。系统支持 4x4 矩阵键盘输入,通过行列扫描获取按键编码,并根据当前按键或自动播放状态驱动蜂鸣器输出对应音调。

电子琴提供手动按键模式和自动播放模式。auto_key 用于切换自动播放与按键演奏,start_stop_key 用于暂停和继续,speed_key 用于加速控制,reset 为低电平复位。整体功能适合 FPGA 数字系统课程设计、矩阵键盘实验、蜂鸣器音乐播放实验以及综合型 Verilog 项目参考。

显示与指示部分包括 LED 高音指示和数码管显示。LED 输出用于反映相关音符或高音状态,数码管通过段选 seg_select 和位选 bit_select 显示当前按键编码,使演奏输入和系统状态更加直观。

运行环境

开发语言:Verilog。

开发软件:Vivado。

工程顶层模块:dianziqin。

主要工程文件包括 electronic_organ.xpr、dianziqin.v、control.v、key_4x4.v、data_in.v、display.v、div_clk.v,并配套 pins.xdc 管脚约束文件。

设计思路

系统采用模块化结构设计,顶层 dianziqin 负责连接按键输入、时钟分频发声、控制逻辑和数码管显示等功能模块。外部输入包括 50MHz 时钟、低电平复位、自动播放开关、暂停继续按键、加速按键以及 4x4 矩阵键盘行信号;输出包括矩阵键盘列扫描信号、蜂鸣器 BEEP、LED 指示和数码管显示信号。

按键输入部分由 data_input 模块完成,对矩阵键盘进行扫描并输出 code 编码。蜂鸣器发声由 div_clk 模块根据当前 code、自动播放开关和暂停继续状态生成 BEEP 输出,同时给出 add_step 信号供控制模块使用。控制模块 control 结合速度按键、自动播放状态和播放步进信号,实现演奏流程、速度控制和 LED 指示。

显示部分由 display 模块完成,将当前按键编号转换为数码管显示信号。这样的拆分方式使输入采集、音调产生、播放控制和显示输出相互独立,便于理解每个功能单元,也便于在 Vivado 中单独查看综合、实现和管脚分配结果。

模块结构

主要模块如下:

1. dianziqin:顶层模块,连接矩阵键盘、蜂鸣器、LED、数码管和控制按键。
2. data_input:输入处理模块,完成 4x4 矩阵键盘扫描并输出按键编码 code。
3. div_clk:分频与蜂鸣器驱动模块,根据按键编码和播放控制信号产生 BEEP 输出。
4. control:琴键控制模块,处理自动播放、暂停继续、加速控制和 LED 指示。
5. display:数码管显示模块,根据 key_num 输出段选和位选信号。
6. key_4x4:矩阵键盘相关逻辑模块。
7. music1.list:自动播放相关音乐数据文件。

开发板验证

工程包含 Vivado 管脚约束文件 pins.xdc,并提供开发板实物图片,可用于对照按键、蜂鸣器、LED、数码管等外设连接关系进行上板验证。实现工程中包含 bitstream 生成结果,适合作为完整 Vivado 上板工程参考。

电子琴 FPGA 设计 Verilog Vivado 开发板验证图片 硬木开发板.jpg

部分代码

以下展示顶层模块 dianziqin 的部分代码,完整源码请下载压缩包查看。

module dianziqin(clk,reset,speed_key,start_stop_key,L_row,H_col,BEEP,auto_key,seg_select,bit_select,LED);
input        clk;//50MHz
input        reset;//低电平--SW0
input 		 auto_key;//自动播放开关,1自动播放,0按键模式--SW1
input 		 start_stop_key;//暂停继续--SW2
input 		 speed_key;//加速--SW3
input [3:0] L_row;//行
output [3:0] H_col;//列
output       BEEP;//蜂鸣器输出
output [11:0]      LED;//LED 高音指示
output [7:0] seg_select;//数码管段选显示
output [5:0] bit_select;//数码管位选显示
	
wire [11:0] add_step;
wire [4:0] code;
//输入模块
data_input i_data_input(
. clk(clk),//50MHZ 
. reset(reset),
. L_row(L_row),//行
. H_col(H_col),//列
. code(code)
);

//分频模块
div_clk i_div_clk(
.clk(clk),
.reset(reset),//低电平--SW0
.auto_key(auto_key),
.start_stop_key(start_stop_key),
.code(code),
.BEEP(BEEP),
.add_step(add_step)
);

//琴键控制
control i_control(
.clk(clk),
.code(code),
.reset(reset),
.LED(LED),
.speed_key(speed_key),
.start_stop_key(start_stop_key),
.add_step(add_step),
.auto_key(auto_key)
);

//数码管显示模块
display i_display(
.clk_in(clk),
.key_num(code), 
.seg_select(seg_select),
.bit_select(bit_select)
);

endmodule

代码文件(付费下载)

相关推荐