电子技术课程设计基于FPGA的音乐硬件演奏电路的设计与实现

【ChatGPT】前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击查看学习资料)

wx供重浩:创享日记
对话框发送:乐曲电路
免费获取完整无水印论文报告(包含电路图)


文章目录

    • 一、设计任务要求
    • 二、总体框图
    • 三、选择器件
    • 四、功能模块
    • 五、总体设计电路图
    • 六、结束语


一、设计任务要求

1、课程设计题目
设计一个乐曲演奏电路,能够自动播放编写好的音乐。要求将音乐通过实验箱上的喇叭播放出来,用发光二级管显示出乐曲的节拍。
(附加功能:本设计在题目所要求的功能全部实现的基础之上又添加了许多附加功能,所有的功能将在“工程设计总述”中阐明,特此声明。)

2、设计分析
(1) 音乐硬件演奏电路基本原理
硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。

(2) 音符频率的获得
多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取1MHz的基准频率。数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。

根据分频系数,可计算数控分频器得到的初始值。(语言已经无法描述其中的原理了,程序可以说明此问题,关于初始值的解释,请看下文给出的程序)
初始值的计算公式如下:由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3) 乐曲节奏的控制
一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。

(4) 乐谱的发生
本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。

(5) 选择模块
选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性,用vhdl语言描述比较简单,不在此详述。

(6)译码器等其他模块
译码器等模块在以前做实验的时候做过,且原理比较简单易懂,不再这里阐述。

3、工程设计总述
当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数所需的初始值,将初始值送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的8Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。曲子也就流畅的播放出来了。同时led数码管会随着音乐显示相应的乐谱,3位led灯会随着高中低的频率,相应的闪烁。当乐曲一遍演奏完成后,乐曲发生器能自动从头开始循环演奏,这时用拨码开关选择播放的乐曲,拨码开关给选择器一个选择信号,即可选择相应的歌曲莫开中的数据进入数据翻译模块,播放出相应的歌曲,本工程选取了四首乐曲,以格雷码的形式编码,每次只变一位拨码开关,比较方便选择。(其余完整详见下载)


二、总体框图

在这里插入图片描述
该工程由是个模块构成,其中有四个为乐谱储存模块ROM,如图所示。

1、分频器的功能是将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。
2、计数器完成计数功能,183进制(最长的歌曲菊花台有183个字符)每个时钟沿加一。
3、四个音乐模块分别记录了4首歌的乐谱。根据上一模块计数器所计的数读取相应地址里的数据传递给下一模块。
4、选择器完成选择歌曲的功能。
5、数据翻译模块将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。
6、分频驱动器也就是一个数控分频器,完成分频的功能,并驱动蜂鸣器。
7、译码器将乐谱数据在led数码管上显示。


三、选择器件

详见下载


四、功能模块

1.分频器(div)
将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。

(1)模块图形:
在这里插入图片描述
(2)程序如下:

LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY div ISPORT(clk :IN STD_LOGIC; CLK12MHz,CLK8Hz: OUT std_logic);
END div;
ARCHITECTURE  one of div is
begin
nana:process(clk)
variable cnt:integer range 0 to 2;
variable tmp:std_logic;
begin
if(clk'event and clk='1')then
if cnt>=1 then
cnt:=0;
tmp:=not tmp;
else
cnt:=cnt+1;
end if;
end if;
CLK12MHz<=tmp;
end process nana;
nbnb:process(clk)
variable cnt:integer range 0 to 3125000;
variable tmp:std_logic;
begin
if(clk'event and clk='1')then
if cnt>=3124999 then
cnt:=0;
tmp:=not tmp;
else
cnt:=cnt+1;
end if;
end if;
CLK8Hz<=tmp;
end process nbnb;
end one;

(3)仿真波形:
在这里插入图片描述
(4)仿真波形分析
由波形可看出ckl为输入50MHz的时钟信号,ckl12输出为平12MHz的时钟信号,clk8为8Hz的时钟信号,由于纸张有限没有打印出其全部波形。
经分析该模块功能完全正确。

2、计数器(notetabs)
(详见下载)

3、选择模块(choice)
(详见下载)

4、数据翻译模块(tontaba)

将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。

(1)模块图像:
在这里插入图片描述
(2)程序如下:

library ieee;
use ieee.std_logic_1164.all;
entity tonetaba isport(index:in std_logic_vector (4 downto 0);code:out std_logic_vector(3 downto 0);high0:out std_logic_vector(2 downto 0);tone:out std_logic_vector(11 downto 0))
;end;
architecture one of tonetaba is
begin
search:process(index)
begincase index is
when"00000"=>tone<="111111111111";code<="0000";high0<="000";--0/4095
when"00001"=>tone<="011100011111";code<="0001";high0<="001";--L1/1823
when"00010"=>tone<="100000001111";code<="0010";high0<="001";--L2/2063
when"00011"=>tone<="100011110010";code<="0011";high0<="001";--L3/2291
when"00100"=>tone<="100101010101";code<="0100";high0<="001";--L4/2390
when"00101"=>tone<="101000010000";code<="0101";high0<="001";--L5/2576
when"00110"=>tone<="101010111000";code<="0110";high0<="001";--L6/2745
when"00111"=>tone<="101101001011";code<="0111";high0<="001";--L7/2891
when"01000"=>tone<="101110001111";code<="0001";high0<="010";--M1/2960
when"01001"=>tone<="110000001001";code<="0010";high0<="010";--M2/3082
when"01010"=>tone<="110001111001";code<="0011";high0<="010";--M3/3193
when"01011"=>tone<="110010101100";code<="0100";high0<="010";--M4/3244
when"01100"=>tone<="110100001001";code<="0101";high0<="010";--M5/3337
when"01101"=>tone<="110101011100";code<="0110";high0<="010";--M6/3420
when"01110"=>tone<="110110100101";code<="0111";high0<="010";--M7/3494
when"01111"=>tone<="110111000111";code<="0001";high0<="100";--H1/3528
when"10000"=>tone<="111000000101";code<="0010";high0<="100";--H2/3589
when"10001"=>tone<="111000111100";code<="0011";high0<="100";--H3/3645
when"10010"=>tone<="111001010110";code<="0100";high0<="100";--H4/3670
when"10011"=>tone<="111010000100";code<="0101";high0<="100";--H5/3717
when"10100"=>tone<="111010101101";code<="0110";high0<="100";--H6/3758
when"10101"=>tone<="111011010010";code<="0111";high0<="100";--H7/3795
when others=>null;end case;end process;end;

(3)仿真波形:
在这里插入图片描述
(4)仿真波形分析

由波形可看出,当输入信号index为00110时high0显示1,code显示6(即 中音6),预置初值为101010111000,查询上文所列的表,可发现功能完全正确。第二个波形图,输入信号00010,输出为中音2,再查预置初值,同样可发现完全正确。因此该模块功能完全正确。

5、译码器模块(deled)
(详见下载)

6、数控分频器模块(speakera)
(详见下载)

7、乐谱数据ROM(四个模块)
(详见下载)

8、地址线的选择:
除了上文所写到的模块外,还需要加入地址线的选择,已选择实验底箱的不同功能,本实验用到led数码管,因此地址线vga的赋值为vga0=0,vga1=1,vga2=0,vga3=0。如下图:

在这里插入图片描述

9、led数码管位选功能的解决方案:
本工程只需显示一位简朴,因此选用一位数码管即可,由于实验箱上的数码管是共阳数码管,因此只需选取一位数码管赋上低电平即可,如图:(我在这里选取了2、4、6、8四位数码管共同显示)

在这里插入图片描述


五、总体设计电路图

1、顶层设计的电路原理图

在这里插入图片描述
2、顶层设计的仿真结果
由于该工程总体的输入时钟信号为50MHz,其中要经过多个分频器且分频系数巨大,因此不可能整体仿真成功,(会导致仿真时间过长而失败)。关于这个问题,我特意请教了李兵老师,老师告诉我仿真的时候去掉几个模块,只仿真一部分功能,去掉的模块再单独仿真即可证明整个工程的正确性,我按这个方案想了很久,发现这个仿真可以先去掉div分频模块,再更改speakera的程序(像仿真speakera模块那样)仿真,也可以同时去掉div与speakera模块,进行仿真。但这两种方法也都是拆分为几块分别仿真,而没有整个工程的仿真,因此这种仿真与将每个模块分别仿真验证其功能的正确性本质上是一样的。
只要证明了每个模块的功能完全正确,即可得出本工程整体的功能可以实现,在上文已经分别证明了每个模块功能的完全正确,因此,整个工程的功能也是完全正确的。经分析,顶层设计仿真功能完全正确。

3、电路的顶层文件管脚分配图如下

在这里插入图片描述
4、连线及下载
在硬件电路上实现此程序 CLK接50MHz晶振输入;音乐选择指示灯分别接IO9、I010、IO11、IO12,然后再与LED灯连接;高中低音分别接IO14、IO15、IO16,然后再与LED连接,SPKOUT接IO13,然后与扬声器连接。


六、结束语

乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。实现方法有许多种,在众多的实现方法中,以纯硬件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通过引入支持LPM的EDA[1]软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。
这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方法,同时采用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、可靠性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8038.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

把我们的爱心代码改变为EXE运行文件

1.首先是我在华为那转载的爱心代码 代码连接 https://blog.csdn.net/weixin_43485737/article/details/127796995?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167602980816782425633583%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&…

chatgpt赋能python:Python怎么在SEO中使用爱心?

Python怎么在SEO中使用爱心&#xff1f; 介绍 在现代的互联网时代&#xff0c;SEO已经成为了一项重要的工作。SEO具有提高网站排名、增加流量和转化率的作用&#xff0c;因此吸引了众多网站管理者的关注。作为一名有着10年Python编程经验的工程师&#xff0c;我发现Python可以…

chatgpt赋能python:Python教程:如何使用Python画爱心

Python教程&#xff1a;如何使用Python画爱心 Python是流行的编程语言之一&#xff0c;可以用来完成很多任务&#xff0c;包括画图。在本文中&#xff0c;我们将介绍如何用Python画一个可爱的爱心。下面我们来详细了解如何实现这个过程。 准备工作 在我们正式开始之前&#…

借助媛如意让ROS机器人turtlesim画出美丽的曲线-云课版本

首先安装并打开猿如意 其次打开蓝桥云课ROS并加入课程 在猿如意输入问题得到答案 在蓝桥云课ROS验证 如何通过turtlesim入门ROS机器人 您可以通过以下步骤入门ROS机器人&#xff1a; 安装ROS&#xff1a;您需要安装ROS&#xff0c;可以在ROS官网上找到安装指南。 安装turtlesim…

编程的未来 - 还有未来么?

缘起 唐门教主上个月某天深夜写了一篇博客 --《编程的未来》&#xff0c;要我谈谈感想。 这也是最近软件工程师们聊得比较多的问题&#xff0c;上周&#xff0c;在上海的 “关东小磨” 和十多位 CSDN 博主聚会的时候&#xff0c;大家也稍微谈了一下这个话题&#xff0c;但是谈…

chatgpt赋能python:Python敲出爱心

Python敲出爱心 Python是一种高级编程语言&#xff0c;它的简单易学、可读性强等特点让它成为很多程序员的首选语言。除了作为一种功能强大的编程语言&#xff0c;Python也有很多有趣的用途&#xff0c;比如&#xff0c;我们可以用Python轻松地敲出爱心。 准备工作 在开始之…

爱心方程(专属理科生的浪漫?!)

目录 前言 C/C 源代码 扩展 Java Python HTML MATLAB 前言 这个在大一的时候就想找了&#xff0c;然后后面是找到了一个&#xff0c;但是忘记出处了。我决定把可以找到的所有爱心给整理一下&#xff0c;为了实现“理科生的浪漫”&#xff01;&#xff01;&#xff01; …

使用Gpt-3绘制爱心,无法做到直接判断用户肉眼的上下来进行输出相应的图形代码. 默认“正着绘制“:朝着Y轴方向;终端 Y轴朝上,EasyX Y轴朝下.

前言 使用GPT-3(本站大佬链接) ; VS2010 ; EasyX 一、第一个图形在终端输出,GUI界面无输出(肉眼朝上) 生成爱心方向,与windows终端逻辑坐标Y轴相同,正方向朝上 1.对话 2.代码 #include <graphics.h> #include <conio.h> #include <math.h> #include &l…

ChatGPT工作提效之使用百度地图在首都为六一儿童节献爱心(多边形覆盖物、文本标注、自动获取经纬度、爱心函数)

ChatGPT工作提效系列 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式ChatGPT工作提效之小鹅通二次开发批量API对接解决方…

新手入门前端代码单文件在线编辑器:codepen

作为一个前端新人第一次接触前端代码在线编辑器codepen&#xff0c;觉得这个还是很方便的&#xff0c;当需要请教别人查看你的代码哪里出了问题或者想要分享自己代码的时候就不需要那么麻烦了&#xff0c;只需要分享一个链接&#xff0c;就可以在线查看了。 传送门&#xff1a…

chatgpt赋能python:Python怎么敲代码敲出动态爱心

Python怎么敲代码敲出动态爱心 Python已经成为程序员们进行日常编程工作的首选语言之一。除了其易学易用的语法之外&#xff0c;Python还拥有各种各样的库和框架&#xff0c;有助于快速开发各种类型的应用程序。其中&#xff0c;Python的动态爱心代码在不同场景下得到了广泛的…

chatgpt赋能python:Python敲爱心代码的详细方法和注意事项

Python敲爱心代码的详细方法和注意事项 Python编程语言擅长数据处理和操作&#xff0c;也可以用于绘制图形。今天&#xff0c;我们将讨论Python如何在绘图功能中使用爱心。 什么是爱心绘图&#xff1f; 您可能已经熟悉了Python中的绘图功能。它可以绘制简单的图形和图表&…

chatgpt赋能python:Python敲代码敲出爱心:SimpleandFun

Python敲代码敲出爱心&#xff1a;Simple and Fun 记得在学习Python初期&#xff0c;我们总是会有各种各样的想法&#xff0c;希望用Python表达自己的情感和创意。今天&#xff0c;我们将分享一个特别有趣而且令人惊喜的事情&#xff1a;如何用Python怎么敲出爱心&#xff1f;…

chatgpt赋能python:Python怎么敲代码敲出爱心加名字

Python怎么敲代码敲出爱心加名字 在Python编程的世界里&#xff0c;有许多有趣的技巧可以让你的代码更加生动有趣&#xff0c;而其中一个最常见的就是敲出爱心加名字。这个技巧不仅能让你的代码更加个性化和有趣&#xff0c;同时也可以用于营销和SEO优化等方面。下面&#xff…

chatGLM-130B vs chatGPT,简单初步实测,看看谁更能打?

在前面初次接触到科大讯飞的星火大模型的时候我就写过一篇和chatGPT模型的对比分析测试文章&#xff0c;如下&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《chatGPT VS 科大讯飞星火大模型 使用初体验&#xff0c;到底谁更胜一筹&#xff1f;》 今天正好有点时间…

强化学习极简入门:通俗理解MDP、DP MC TC和Q学习、策略梯度、PPO

前言 22年底/23年初ChatGPT大火&#xff0c;在写《ChatGPT技术原理解析》的过程中&#xff0c;发现ChatGPT背后技术涉及到了RL/RLHF&#xff0c;于是又深入研究RL&#xff0c;研究RL的过程中又发现里面的数学公式相比ML/DL更多&#xff0c;于此激发我一边深入RL&#xff0c;一…

ChatGPT 连夜迭代,网友:你老婆不好使了。。。

ChatGPT凌晨升级&#xff0c;你的“老婆”真的不管用了。 以往&#xff0c;每当有人搬出“我老婆说xxx&#xff0c;我老婆永远是对的”这种话时&#xff0c;它立马秒怂认错&#xff0c;也不跟你争论25到底等于几了。 但现在&#xff0c;不管有没有老婆&#xff0c;ChatGPT都十分…

ChatGPT 连夜迭代:你老婆不好使了

点击上方“芋道源码”&#xff0c;选择“设为星标” 管她前浪&#xff0c;还是后浪&#xff1f; 能浪的浪&#xff0c;才是好浪&#xff01; 每天 10:33 更新文章&#xff0c;每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源…

ChatGPT 又迭代:这下连你老婆也不好使了 !

文末留言送书活动 ChatGPT凌晨升级&#xff0c;你的“老婆”真的不管用了。 以往&#xff0c;每当有人搬出“我老婆说xxx&#xff0c;我老婆永远是对的”这种话时&#xff0c;它立马秒怂认错&#xff0c;也不跟你争论25到底等于几了。 但现在&#xff0c;不管有没有老婆&#x…

chatgpt赋能python:Python如何搜索文献

Python如何搜索文献 在当今信息大爆炸的时代&#xff0c;我们需要越来越多的信息来帮助我们进行决策和工作。对于研究人员来说&#xff0c;搜索文献是非常重要的一步。Python作为一门简单易学的编程语言&#xff0c;可以帮助研究人员更加高效地搜索文献信息。 第一步&#xf…