描述
使用fpga蜂鸣器连续发出do,re,mi,fa,so,la,xi七个不同的音调,每个音调的持续时间为0.5s。
思路
采用状态机实现音调的转化,当do状态持续了0.5s之后转移到re状态,以此类推...采用0.5s的时间flag信号控制状态机的转变。因为不同的音调有不同的频率,所以在每个时钟周期内需要发出不同频率的方波,采用计数器控制占空比,在每个状态下需要设置不同的频率计数器最大值,采用状态机控制计数器的频率最大值。
细节
设置输入clk,rst,输出beep
内部寄存器cnt_time 计数0.5s时间间隔,标志信号time_flag 每当计数0.5s拉高一个周期,当flag拉高时,状态寄存器状态改变
状态机采用三段式编写
设置内部寄存器cnt_wave,记录不同的频率最大值,设置变量wave_num为不同频率的最大值。
代码
module music
#(parameter time_max = 25'd24999999,
parameter dowave = 17'd95419,
parameter rewave = 17'd85033,
parameter miwave = 17'd75756,
parameter fawave = 17'd71632,
parameter sowave = 17'd63774,
parameter lawave = 17'd56817,
parameter xiwave = 17'd50606
)
(i