基于iCE40UP5K的FPGA学习平台实现音乐播放器
通过PWM产生不同的音调,并驱动板上蜂鸣器将音调输出;能够播放三首不同的曲子,每个曲子的时间长度为1分钟,可以切换播放;曲子的切换使用小脚丫核心板上的按键,需要有按键消抖的功能;播放的曲子的名字在OLED屏幕上显示出来(汉字显示)
标签
FPGA
ICE40UP5K
寒假在家一起练
PWM
音乐
chuirich
更新2022-03-03
兰州大学
706

1 序言

1.1 项目概述

项目2 - 利用PWM制作一个音乐播放器

· 通过PWM产生不同的音调,并驱动板上蜂鸣器将音调输出

· 能够播放三首不同的曲子,每个曲子的时间长度为1分钟,可以切换播放

· 曲子的切换使用扩展板的按键,需要有按键消抖的功能

· 播放的曲子的名字在OLED屏幕上显示出来(汉字显示)

1.2 项目规划

Step1. 实现按键消抖功能

Step2. 产生PWM波

Step3. 驱动蜂鸣器

Step4. 驱动OLED显示器

Step5. 各模块联合调试

2 软件安装激活

注册成为 LATTICE 会员。

软件 Radiant 下载,地址:Lattice Radiant (latticesemi.com)

软件 Radiant 激活,转到 Lattice Radiant License (latticesemi.com) ,输入 mac 地址。 mac 地址获取可以在 cmd 命令提示符中输入 ipconfig/all 获取,选取相应网卡的 mac 地址。

ipconfig/all

FhQ-1rOiTMcU7BIEiIAvnEf0nnia

获取 license.dat 后,放入软件安装文件夹 /license 下,打开软件 Radiant,选择第二项激活方式,选择 license.dat 激活成功。

3 输入输出信号分析

  • 输入信号
    • 系统时钟信号:clk
    • 复位信号:rst_n
    • 按键信号:key_in
  • 输出信号
    • oled显示屏复位信号:oled_rst
    • oled显示屏时钟信号:oled_clk
    • oled显示屏数据指令控制信号:oled_dcn
    • oled显示屏数据信号:oled_dat
    • 蜂鸣器输出:beep

4 系统框图

Fi8CaqhPQnjofz5DbtDpupPiAmrH

5 典型模块的实现(以按键消抖为例)

实现步骤:检测按键变化->计数器计时(使用计数器实现3~5ms计时)->按键消抖->实现按键功能

代码实现

module key(key_in,rst_n,clk,led);
	input wire key_in;
	input wire rst_n;
	input wire clk;
	output reg led;
	
	reg key_check;
	reg [18:0] counter;
	reg key_buff;
	reg key_buff_check;
	
	wire key_change;
	wire key_ok;
	
	always @ (posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			key_check <= 1'b1;
		else
			key_check <= key_in;
	end
	
	assign key_change = key_check ^ key_in;
	
	always @ (posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			counter <= 19'd0;
		else if(counter == 19'd500_000)
			counter <= 19'd0;
		else if(key_change == 1)
			counter <= 19'd0;
		else
			counter <= counter + 1'b1;
	end
	
	always @ (posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			key_buff <= 1'b1;
		else if(counter == 19'd500_000)
			key_buff <= key_in;
	end
	
	always @ (posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			key_buff_check <= 1'b1;
		else
			key_buff_check <= key_buff;
	end
	
	assign key_ok = key_buff && ~key_buff_check;
	
	always @ (posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			led <= 1'b0;
		else if(key_ok)
			led <= ~led;
	end		
endmodule	

6 总结展望

6.1 系统架构展示

Fm2LrfaLXSFNpaCjfDMKP7Ya0vop

6.2 效果展示(更多信息参见视频)

FlpDydStxHTrJmwYMUeGzXW8u3X5Fus1j8Owkif9iVGRZWzzwYZzGsPB

6.3 资源使用情况

            · 综合资源利用情况展示

FhRcQg4aTSi7ZJ8ugkDmktnZIe9V

     ·资源使用情况展示

Foaukde7dBUzM6nzuAeQUhdEAc8e

6.3 存在的问题

· 产生PWM波驱动蜂鸣器产生的音乐缺乏层次感,只适合用来了解PWM波控制原理。

· 显示屏OLED驱动程序还需要进一步总结分析。

6.4 展望

后续深入学习相关知识,特别是FPGA领域有关神经网络相关的知识,解决实际工程问题。

附件下载
final_music.zip
final_music_impl_1.rbt
团队介绍
个人
团队成员
chuirich
学生
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号