名称:音乐播放器数码管显示简谱蜂鸣器
软件:Quartus
语言:VHDL
代码功能:
设计音乐播放器,播放一首歌,使用开发板的蜂鸣器播放音乐,使用Quartus内的ROM IP核存储音乐文件,使用数码管显示简谱,led显示节奏
简谱存储在ROM中,具体值可以打开music.mif文件查看
mif文件说明:
8表示简谱1
9表示简谱2
10表示简谱3
以此类推
每个简谱对应4个相同的值
演示视频:音乐播放器VHDL蜂鸣器数码管显示简谱_Verilog/VHDL资源下载
代码下载:音乐播放器VHDL蜂鸣器数码管显示简谱_Verilog/VHDL资源下载名称:音乐播放器数码管显示简谱蜂鸣器(代码在文末付费下载)软件:Quartus语言:VHDL代码功能:设计音乐播放器,播放一首歌,使用开发板的蜂鸣器播放音乐,使用Quartus内的ROM IP核存储音乐文件,使用数码管显示简谱,led显示节奏简谱存储在ROM中,具体值可以打开music.mif文件查看mif文件说明:8表示简谱19表示简谱210表示简谱3以此类推每个简谱对应4个相同的值演示视频:部http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=196
部分代码展示
LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all; --播放器控制 ENTITY music_ctrl ISPORT (sysclk : IN STD_LOGIC;--50M晶振stop_key : IN STD_LOGIC;start_key : IN STD_LOGIC;--开始tonecode : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);tonestep : IN STD_LOGIC_VECTOR(9 DOWNTO 0);led : OUT STD_LOGIC;--指示灯spkout : OUT STD_LOGIC--蜂鸣器输出); END music_ctrl; ARCHITECTURE trans OF music_ctrl IS --调用ROM COMPONENT ROM IS PORT ( address: IN STD_LOGIC_VECTOR (7 DOWNTO 0); clock: IN STD_LOGIC ; q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END COMPONENT;SIGNAL addr : STD_LOGIC_VECTOR(21 DOWNTO 0);--分频控制字SIGNAL divclk_counter : STD_LOGIC_VECTOR(24 DOWNTO 0);SIGNAL musicclk : STD_LOGIC;SIGNAL musickeyshiftbuf : STD_LOGIC_VECTOR(31 DOWNTO 0);SIGNAL musicno : STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL step : STD_LOGIC_VECTOR(9 DOWNTO 0);SIGNAL codeaddr1 : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL model_Key_down : STD_LOGIC;SIGNAL ROM_data : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL music_select : STD_LOGIC := '0'; BEGIN--例化ROM,ROM里面存了乐谱 i_ROM : ROMPORT MAP (address => codeaddr1,clock => musicclk,q => ROM_data);led <= music_select;PROCESS (sysclk, stop_key, start_key)BEGINIF (sysclk'EVENT AND sysclk = '1') THENIF ((NOT(stop_key)) = '1') THENmusic_select <= '0';--停止ELSIF ((NOT(start_key)) = '1') THENmusic_select <= '1';--开始END IF;END IF;END PROCESS;step <= tonestep;PROCESS (sysclk)BEGINIF (sysclk'EVENT AND sysclk = '1') THENaddr <= addr + ("000000000000" & step);--step是根据音乐文件产生的频率控制字,不同step产生不同频率的spkoutEND IF;END PROCESS;PROCESS (sysclk)BEGINIF (sysclk'EVENT AND sysclk = '1') THENIF (divclk_counter = "0000000000000000000001000") THEN--50M/(1799999*2)=分频到13.9Hz,为便于仿真,计数器0000110110111011100111111改小为0000000000000000000001000musicclk <= (NOT(musicclk));--musicclk=13.9Hzdivclk_counter <= "0000000000000000000000000";ELSEdivclk_counter <= divclk_counter + "0000000000000000000000001";END IF;END IF;END PROCESS;
PROCESS (sysclk)
BEGIN
IF (sysclk'EVENT AND sysclk = '1') THEN
IF (music_select = '0') THEN
spkout <= '1';--0时蜂鸣器拉高,不唱
ELSE
spkout <= addr(3);--addr的最高位就是输出蜂鸣器的频率--addr2
END IF;
END IF;
END PROCESS;
PROCESS (musicclk, stop_key)
BEGIN
IF ((NOT(stop_key)) = '1') THEN
codeaddr1 <= "00000000";
ELSIF (musicclk'EVENT AND musicclk = '1') THEN
IF (music_select = '1') THEN
tonecode <= ROM_data;--播放歌曲
IF (codeaddr1 = "11111111") THEN
codeaddr1 <= "00000000";--播放完后循环
ELSE
codeaddr1 <= codeaddr1 + "00000001";
END IF;
END IF;
END IF;
END PROCESS;
END trans;
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
频率控制字模块
音乐控制模块
显示模块