名称电子琴 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 上板工程参考。部分代码以下展示顶层模块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代码获取点击下方公众号卡片