码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 音乐播放器VHDL蜂鸣器数码管显示简谱,视频/代码


    名称:音乐播放器数码管显示简谱蜂鸣器

    软件: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个相同的值演示视频:部icon-default.png?t=N7T8http://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 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. 仿真图

    整体仿真图

    频率控制字模块

    音乐控制模块

    显示模块

  • 相关阅读:
    Python爬虫:爬虫所需要的爬虫代理ip是什么?
    EVPN基本原理
    论文笔记:YOLOv8-QSD 自动驾驶场景小目标检测算法
    R语言读取(加载)txt格式数据为dataframe、为dataframe中的两个离散变量构建列联表
    【KEIL】keil MDK for ARM无法编译老版本程序问题解决方案
    好消息,微信消费者投诉工具升级,可以直接回复用户、处理投诉了。。。
    STM32F4X SDIO(六) 例程讲解-SD_PowerON
    【03】HDFS
    java基本知识
    备战2022秋招系列:国内外一线互联网大厂(Java岗)必备高刷手册
  • 原文地址:https://blog.csdn.net/diaojiangxue/article/details/133917139
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号