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
获取 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 系统框图
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 系统架构展示
6.2 效果展示(更多信息参见视频)
6.3 资源使用情况
· 综合资源利用情况展示
·资源使用情况展示
6.3 存在的问题
· 产生PWM波驱动蜂鸣器产生的音乐缺乏层次感,只适合用来了解PWM波控制原理。
· 显示屏OLED驱动程序还需要进一步总结分析。
6.4 展望
后续深入学习相关知识,特别是FPGA领域有关神经网络相关的知识,解决实际工程问题。