• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

音乐播放器VHDL蜂鸣器数码管显示简谱

05/19 15:25
966
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1-23101R32RM40.doc

共1个文件

名称:音乐播放器数码管显示简谱蜂鸣器(代码在文末付费下载)

软件:Quartus

语言:VHDL

代码功能:

设计音乐播放器,播放一首歌,使用开发板的蜂鸣器播放音乐,使用Quartus内的ROM IP核存储音乐文件,使用数码管显示简谱,led显示节奏。

简谱存储在ROM中,具体值可以打开music.mif文件查看

mif文件说明:

8表示简谱1

9表示简谱2

10表示简谱3

以此类推

每个简谱对应4个相同的值

演示视频:

部分代码展示

LIBRARY?ieee;
???USE?ieee.std_logic_1164.all;
???USE?ieee.std_logic_unsigned.all;
--播放器控制
ENTITY?music_ctrl?IS
???PORT?(
??????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?:?ROM
??????PORT?MAP?(
?????????address??=>?codeaddr1,
?????????clock????=>?musicclk,
?????????q????????=>?ROM_data
??????);
???led?<=?music_select;
???PROCESS?(sysclk,?stop_key,?start_key)
???BEGIN
??????IF?(sysclk'EVENT?AND?sysclk?=?'1')?THEN
?????????IF?((NOT(stop_key))?=?'1')?THEN
????????????music_select?<=?'0';--停止
?????????ELSIF?((NOT(start_key))?=?'1')?THEN
????????????music_select?<=?'1';--开始
?????????END?IF;
??????END?IF;
???END?PROCESS;
???
???
???step?<=?tonestep;
???PROCESS?(sysclk)
???BEGIN
??????IF?(sysclk'EVENT?AND?sysclk?=?'1')?THEN
?????????addr?<=?addr?+?("000000000000"?&?step);--step是根据音乐文件产生的频率控制字,不同step产生不同频率的spkout
??????END?IF;
???END?PROCESS;
???
???
???PROCESS?(sysclk)
???BEGIN
??????IF?(sysclk'EVENT?AND?sysclk?=?'1')?THEN
?????????IF?(divclk_counter?=?"0000000000000000000001000")?THEN--50M/(1799999*2)=分频到13.9Hz,为便于仿真,计数器0000110110111011100111111改小为0000000000000000000001000
????????????musicclk?<=?(NOT(musicclk));--musicclk=13.9Hz
????????????divclk_counter?<=?"0000000000000000000000000";
?????????ELSE
????????????divclk_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. 仿真图

整体仿真图

频率控制字模块

音乐控制模块

显示模块

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=196

  • 1-23101R32RM40.doc
    下载

相关推荐