用FPGA和蜂鸣器DIY你的童年回忆:手把手教你用Verilog在Cyclone IV上播放《两只老虎》

张开发
2026/4/12 4:59:40 15 分钟阅读

分享文章

用FPGA和蜂鸣器DIY你的童年回忆:手把手教你用Verilog在Cyclone IV上播放《两只老虎》
用FPGA和蜂鸣器DIY你的童年回忆手把手教你用Verilog在Cyclone IV上播放《两只老虎》还记得小时候那些简单却充满魔力的电子玩具吗它们发出的声音或许不够完美却能带给我们最纯粹的快乐。今天我们将用现代数字电路技术重现这份童趣通过FPGA开发板和无源蜂鸣器让经典的《两只老虎》旋律重新响起。这不仅是一个技术实践更是一次穿越时光的创意之旅。1. 硬件准备与基础原理1.1 认识你的音乐元件无源蜂鸣器是这个项目的声带它与有源蜂鸣器的关键区别在于无源蜂鸣器需要外部提供PWM信号才能发声可以通过改变频率产生不同音高有源蜂鸣器内置振荡电路通电即发声但音高固定为什么选择无源蜂鸣器无源蜂鸣器就像一张白纸让我们能够完全控制音高和节奏这正是音乐播放所需的灵活性。1.2 FPGA与Cyclone IV开发板Cyclone IV EP4CE6系列FPGA为我们提供了50MHz系统时钟精确计时基础充足的逻辑单元实现复杂计数器灵活的I/O配置连接外部元件开发板原理图要点蜂鸣器接口通常标记为BEEP或BUZZER注意电平有效方式常见低电平有效2. 从音符到数字音乐的数字编码2.1 音乐频率对应表将乐谱转换为FPGA能理解的数字需要知道各音符对应的频率音符频率(Hz)周期计数(50MHz时钟)低音Do262190,840Re294170,068Mi330151,515Fa349143,266Sol392127,551La440113,636Si494101,2152.2 节奏与时间控制《两只老虎》采用4/4拍每个四分音符持续时间假设演奏速度为120BPM每分钟120拍每拍持续时间 60秒/120拍 0.5秒在50MHz时钟下需要计数25,000,000个周期3. Verilog实现详解3.1 顶层模块设计module music_player ( input wire clk, // 50MHz时钟 input wire rst_n, // 低电平复位 output reg beep_out // 蜂鸣器输出 ); // 参数定义区 parameter CLK_FREQ 50_000_000; // 系统时钟频率 parameter QUARTER_NOTE CLK_FREQ/2; // 四分音符时长计数 // 音符频率参数 parameter DO CLK_FREQ/262; parameter RE CLK_FREQ/294; parameter MI CLK_FREQ/330; parameter FA CLK_FREQ/349; parameter SOL CLK_FREQ/392; parameter LA CLK_FREQ/440; // 状态机与计数器定义 reg [5:0] note_counter; // 音符计数器 reg [31:0] duration_cnt; // 音符持续时间计数器 reg [31:0] freq_cnt; // 频率计数器 reg [31:0] current_freq; // 当前音符频率 // 主逻辑将在这里实现 endmodule3.2 音乐序列存储使用Verilog的case语句存储《两只老虎》的乐谱always (*) begin case(note_counter) 0,1,2,3,6,7: current_freq MI; 4,5: current_freq RE; 8,12: current_freq DO; 9,13: current_freq RE; 10,14: current_freq MI; 11,15: current_freq FA; // 其他音符对应关系... default: current_freq 0; // 休止符 endcase end3.3 PWM生成逻辑50%占空比的PWM生成方法always (posedge clk or negedge rst_n) begin if(!rst_n) begin freq_cnt 0; beep_out 1b1; end else begin if(freq_cnt current_freq) freq_cnt 0; else freq_cnt freq_cnt 1; beep_out (freq_cnt (current_freq 1)) ? 1b0 : 1b1; end end4. 调试技巧与优化方案4.1 常见问题排查当你的音乐听起来不对劲时可以检查音高不准确认时钟频率设置正确检查音符频率参数计算使用示波器验证输出波形频率节奏不稳检查音符持续时间计数器确保没有信号冲突或时序违规4.2 进阶优化建议动态节奏控制添加输入按钮调整播放速度多曲目选择通过拨码开关选择不同歌曲LED可视化让LED随音乐节奏闪烁和弦效果组合多个频率产生更丰富的声音// 简单的LED节奏指示器示例 reg [3:0] led_pattern; always (posedge clk) begin if(note_counter % 4 0) led_pattern 4b0001; else if(note_counter % 4 1) led_pattern 4b0010; else if(note_counter % 4 2) led_pattern 4b0100; else led_pattern 4b1000; end5. 项目扩展与创意应用这个基础音乐播放器可以发展为更复杂的项目电子音乐盒存储多首童年歌曲音乐门铃结合红外或按钮触发音乐教学工具可视化音高与节奏游戏音效为FPGA游戏添加简单音效硬件连接示意图Cyclone IV开发板 --------------------- | FPGA | | --------------- | | | 音乐生成逻辑 | | | -------------- | | | GPIO口 | -------------------- | v 无源蜂鸣器 -------- | Buz | --------6. 音乐与工程的完美结合完成这个项目后你会惊讶地发现数字电路与音乐艺术竟能如此和谐地结合。当《两只老虎》的旋律从你的开发板响起时那种成就感远超过普通的LED闪烁实验。这不仅是Verilog技能的提升更是工程思维与艺术感知的碰撞。

更多文章