硬件介绍
STEP-MXO2-C专用板是专为FPGA大赛推出的,可以使用网页版FPGA开发系统Web IDE来编程,无需下载、安装FPGA的编程软件,当然熟悉Lattice Diamond编程工具的同学仍然可以使用Diamond对其进行编程。
STEP-MXO2-C专用版功能和配置与STEP-MXO2小脚丫:基于Lattice XO2-4000HC的FPGA学习模块,板载编程器几乎完全一致,唯一的差别在于FPGA程序下载方式不同。STEP-MXO2-C没有采用USB-JTAG的模式下载,而是通过MCU虚拟U盘,拷贝FPGA配置文件到U盘的方式下载程序,使用更便捷。
-
板载资源:
-
两位7段数码管;
-
两个RGB三色LED;
-
8路用户LED;
-
4路拨码开关;
-
4路按键;
-
-
36个用户可扩展I/O(其中包括一路SPI硬核接口和一路I2C硬核接口)
-
支持Lattice的开发工具Diamond
-
支持MICO32/8软核处理器
-
板上集成FPGA编程器
-
一路Micro USB接口
-
板卡尺寸52mm x 18mm
任务介绍
- 基于我们提供的套件和工具,自己组装电子琴
- 自己编程基于FPGA实现:
- 存储一段音乐,并可以进行音乐播放,
- 可以自己通过板上的按键进行弹奏,支持两个按键同时按下(和弦)并且声音不能失真,板上的按键只有13个,可以通过有上方的“上“、”下”两个按键对音程进行扩展
- 使用扬声器进行播放时,输出的音调信号除了对应于该音调的单频正弦波外,还必须包含至少一个谐波分量
- 音乐的播放支持两种方式,这两种方式可以通过开关进行切换:
- 当开关切换到蜂鸣器端,可以通过蜂鸣器来进行音乐播放
- 当开关切换到扬声器端,可以通过模拟扬声器来进行音乐播放,每个音符都必须包含基频 + 至少一个谐波分量
设计思路及细节 一、正弦波生成
正弦波采用查表的方式进行计算,相比于调用正弦函数,直接查表的速度更快,占用资源更少。
二、按键消抖
通常的按键所用的开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
一般我们采用软件方法消抖。即检测到按键按下动作之后进行10ms~20ms左右的延时,当前沿的抖动消失之后再一次检测按键的状态。如果仍然是按下的电平状态,则认为这是一次真正的按键按下;同样检测到按键释放,也要做10ms~20ms延时,检测到后沿抖动消失后认为是一个完整的按键弹起过程。
三、偶次谐波合成
由于需要在音频信号中代入谐波量,这里就以频率的两倍作为偶次谐波。
在 Verilog 中只需要将基波和谐波相加取平均就可以得到按下一个按键所需要的波形。
四、PWM 输出波形合成
PWM 输出的波形只需要全部波形相加后取平均就可以。如果没有取平均,在同时按下很多按键时会失真。
这里直接使用加号进行相加,在综合时会自动生成加法器。
五、升调降调设置
因为按键同时按下会导致冒险情况的出现,所以这里把升调和降调进行分离,按下对应按键会对对应变量产生影响。总频率变化为两者之差乘100。
经过测试这种方法下可以避免掉时序报错。
六、拨码开关切换蜂鸣器和扬声器输出
拨码开关位于不同位置时会有不同的电平,通过监测拨码开关的电平状况就可以得到具体的位置,从而切换输出。
在测试中发现扬声器输出的音频效果会比蜂鸣器好一些。
七、自动播放模块设计
自动播放模块通过LUT查找当前所需要按下的按键位置,通过接管外部按键实现音频输出。这种方法可以使得在降调升调后依然可用,大大提升了可复用性。
八、指示灯、数码管设计
LED 灯和按键位置一一对应,如果按下特定按键,其对应的 LED 灯也会亮起。
数码管左侧显示当前按下的按键数量,右侧显示升降调状态。如果有负数,则小数点位会亮起。
九、使用资源概览
实物展示
结尾
小脚丫 FPGA 的扩展性非常强大,可以实现多样的功能,在此感谢硬核团队的技术支持。