首页 乐曲发生器eda设计—《新年好

乐曲发生器eda设计—《新年好

举报
开通vip

乐曲发生器eda设计—《新年好目录 1(前言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„ 2(课程设计任务„„„„„„„„„„„„„„„„„„„„„„„„„„„ 2.1 设计题目„„„„„„„„„„„„„„„„„„„„„„„„„„ 2.2 基本要求„„„„„„„„„„„„„„„„„„„„„„„„„„ 2.3 提高要求„„„„„„„„„„„„„„„„„„„„„„„„„„ 3. 系统电路功能描述、粗框图及方案论证说明„„„„„„„„„„„„„„ 3.1 功能描述„„„„„„„„„„„„„„„„„„„„„„„„„„ 3....

乐曲发生器eda设计—《新年好
目录 1(前言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„ 2(课程设计任务„„„„„„„„„„„„„„„„„„„„„„„„„„„ 2.1 设计题目„„„„„„„„„„„„„„„„„„„„„„„„„„ 2.2 基本要求„„„„„„„„„„„„„„„„„„„„„„„„„„ 2.3 提高要求„„„„„„„„„„„„„„„„„„„„„„„„„„ 3. 系统电路功能描述、粗框图及 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 论证说明„„„„„„„„„„„„„„ 3.1 功能描述„„„„„„„„„„„„„„„„„„„„„„„„„„ 3.2 粗框图„„„„„„„„„„„„„„„„„„„„„„„„„„„ 3.3 方案论证说明„„„„„„„„„„„„„„„„„„„„„„„„ 4(系统电路设计陈述„„„„„„„„„„„„„„„„„„„„„„„„„ 4.1系统电路总框图及工作原理„„„„„„„„„„„„„„„„„„ 4.1.1音名与频率的关系„„„„„„„„„„„„„„„„„„ 4.1.2可变分频器„„„„„„„„„„„„„„„„„„„„„ 4.1.3节拍发生器原理„„„„„„„„„„„„„„„„„„„„ 4.2 控制模块„„„„„„„„„„„„„„„„„„„„„„„„„„ 4.2.1 音调发生器(ydfsq)模块„„„„„„„„„„„„„„„„ 4.2.2音调编码器(ydbmq)模块„„„„„„„„„„„„„„„„ 4.2.3手动\自动选择(bmux)模块„„„„„„„„„„„„„„„ 4.2.4 数控分频器(skfpq)模块„„„„„„„„„„„„„„„„ )模块„„„„„„„„„„„„„„„„„ 4.2.5彩灯控制(colour 4.3 受控模块中各子系统电路间的逻辑关系„„„„„„„„„„„„„„ 4.4 系统电路„„„„„„„„„„„„„„„„„„„„„„„„„„„ 4.4.1 仿真波形分析结果„„„„„„„„„„„„„„„„„„„ 4.4.2 引脚锁定清单„„„„„„„„„„„„„„„„„„„„„ 4.4.3 硬件(时钟频率、开关、按键、显示、音响等)„„„„„„„„„ 4.4.4 使用说明书„„„„„„„„„„„„„„„„„„„„„„ 5(下载结果„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„ 6(含外围硬件环境的整体系统原理电路图及说明„„„„„„„„„„„„„„ 7(工作进程及本人担任的任务 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf „„„„„„„„„„„„„„„„„„„„ 8(收获和体会„„„„„„„„„„„„„„„„„„„„„„„„„„„„„ 9(附录„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„ 9.1程序清单„„„„„„„„„„„„„„„„„„„„„„„„„„„ 9.2参考文献„„„„„„„„„„„„„„„„„„„„„„„„„„„ 前言 电子设计自动化EDA(Electronic Design Automation)是指利用计算机完成电子的设计。EDA技术是以计算机和微电子技术为先导,汇集了计算机图形学、拓扑、逻辑学、微电子工艺与结构学和计算机数学等等多种计算机应用学科最新成果的先进技术。EDA工具的发展经历了两个阶段:物理工具和逻辑工具。现在EDA和系统设计工具正逐渐被理解成一个整体的概念:电子系统设计自动化。物理工具用来完成设计中的实际物理问题,如芯片布局、印制电路板布线等;逻辑工具是基于网表、布尔逻辑、传输时序等概念,首先由原理图编辑器或硬件描述语言进行设计输入,然后利用EDA系统完成综合、仿真、优化等过程,最后生成物理工具可以接受的网表或VHDL,Verilog-HDL的结构化描述。现在常见的EDA工具有编辑器、仿真器、检查分析工具、优化综合工具等。 VHDL是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言 。 VHDL的英文全写是:VHSI(Very High Speed Integrated Circuit)Hardware Description Language.翻译成中文就是超高速集成电路硬件描述语言。因此它的应用主要是应用在数字电路的设计中。目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。 VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点 。 与其他硬件描述语言相比,VHDL具有以下特点: (1)功能强大、设计灵活。VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功能,层层 - 2 - 细化,最后可直接生成电路级描述。VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言虽不能比拟的。VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。 (2)支持广泛、易于修改。由于VHDL已经成为IEEE 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。 (3)强大的系统硬件描述能力。VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。 (4)独立于器件的设计、与工艺无关。设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。当设计描述完成后,可以用多种不同的器件结构来实现其功能。 (5)很强的移植能力,易于共享和复用。 VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。 目前有多种EDA工具支持采用VHDL进行电路综合、仿真以及实现。一些可编程器件生产商将使用VHDL进行电路设计所需的多种EDA工具集成为统一的开发平台提供给用户,进行针对本公司可编程器件产品的开发,从而使整个设计流程更加简捷和易于使用。目前比较常见的是Altera公司的QuartusII 和Xilinx 公司的ISE开发平台。 本次课程设计要求使用EDA工具,设计实现简易音乐演奏器,理解音名与频率的关系及数控分频原理,经过对整体进行模块化分析、编程、综合、仿真及最终下载,完整实现简易音乐器的播放功能。 我们知道,与利用单片机来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具与硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。 在后面的章节中会详细介绍利用EDA技术实现简易音乐演奏器的过程。 - 3 - 2(课程设计任务 2.1 设计题目 简易乐曲发生器:利用音名与频率的关系可以制作简易的音乐发生器。 2.2 基本要求 1(.能播放一首你喜欢的乐曲。 2(所播放的乐曲节奏感清晰,准确。 3(节省硬件资源,合理设计音频电路。 2.3 提高要求 1(至少循环演奏两首乐曲。 2(通过数码管显示乐曲演奏时对应的音符。 3(手动控制和自动播放功能。 (播放时有彩灯显示。 4 - 4 - 3. 系统电路功能描述、粗框图及方案论证 3.1 功能描述 本次课程设计是利用EDA设计一个简单的乐曲演奏器,可通过按键输入来控制音响声音 ,演奏时可以通过按键选择是手动演奏还是自动演奏,手动演奏是通过按键进行简易乐曲的演奏,自动演奏则是演奏已存入的固定乐曲。 3.2 粗框图 音调 手动\自音调 数控 动选择 发生 编码 分频 彩灯 控制 3.3 方案论证说明 顶层结构所包含的模块分别有音调发生器(ydfsq)模块、音调编码器(ydbmq)模块、手动\自动选择(bmux)模块、数控分频器(skfpq)模块及彩灯控制(colour)模块。 《新年好》的简谱: 1 1 1 5 | 3 3 3 1 | 1 3 5 5 | 4 3 2 — | ( 2 3 4 4 | 3 2 3 1 | 1 3 2 5 | 7 2 1 — | (( 设计全音占4个时间,半音占2个时间,四分之一音占一个时间 《童话》的简谱: 0 5 5 4 | 3 3 4 3 3 3 4 | 3 4 3 2 1 0 1 3 5 | ( 6 6 6 5 5 2 2 4 3 | 3 — 0 1 3 5 | 6 6 6 5 5 2 2 4 | 3 4 3 2 1 1 2 3 | 6 6 1 1 7 | 1 — — 0 | ((( 设计全音占8个时间,半音占4个时间,四分之一音占2个时间。(一拍的时长是新年好的两倍。) - 5 - 4(系统电路设计陈述 4.1系统电路总框图及工作原理 FPGA 12MHz 数控分频器 时钟电路 扬声器 基准时钟12MHz 电路 4Hz 模式选择 音乐节拍 产生电路 音调编码 电路 数码管 手动输入 三种彩灯花形 数码管灯 4.1.1音名与频率的关系 根据声乐知识,产生音乐的两个因素是音乐频率的持续时间,音乐的十二平均率规定,每两个八音度之间的频率相差一倍,在两个八音度之间,又可分为12个半音。每两个半音的频率比为4。另外,音名A(乐谱中的低音6)的频率为440HZ,音名B到C之间,E到F之间为半音,其余为全音。由此可以计算出乐谱中从低音1到高音1之间每个音名的频率如图所示: 音名 频率(Hz) 音名 频率(Hz) 音名 频率(Hz) 261.63 523.25 1046.50 低音1 中音1 高音1 293.67 587.33 1174.66 低音2 中音2 高音2 329.63 659.25 1381.51 低音3 中音3 高音3 349.23 698.46 1396.92 低音4 中音4 高音4 391.99 783.99 1567.98 低音5 中音5 高音5 440 880 1760 低音6 中音6 高音6 439.88 987.76 1975.52 低音7 中音7 高音7 ——简谱中的音名与频率的关系—— 4.1.2可变分频器 (1)基准频率的选取 各音名所对应的频率可由一频率较高的基准频率进行整数分频得到,所以实 - 6 - 际产生各音名频率为近似的整数值。这是由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频系数四舍五入取整,若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差较小,但分频结构将变大,实际的设计应综合考虑两方面的因素,在尽量减小频率差的前提下取舍合适的基准频率。本次设计选择12MHz作为基准频率。 (2)分频系数A、公用二进制的计数容量N及初始值的选取D 1、分频系数的选取 首先将12MHz的基准频率进行12分频,得到1MHz的基准频率,分频系数A,1MHz,音名频率,此分频系数可由计数器实现。但若不加处理语句,其分频后的信号将不是对称方波。而占空比很小的方波很难使扬声器有效地发出声响。 为得到对称方波,可将分频系数A分解为:分频系数A=分频系数n×2。即先进行分频系数n的分频,得到不对称方波,然后再2分频得到对称方波。 2、公用二进制的计数容量N的选取 n分频可由n进制计数器实现。n进制计数器可用复位法或置位法实现,由于加载初始值d的置位法可有效地减少设计所占用的可编程逻辑器件资源,因此,此次设计采用置位法。低音1的分频数n为最大,其值为1275,应取公用二进制计数器的计数容量N大与“最大分频系数n”,故本次设计的公用二进制计数器应该设计为十一位二进制加法计数器,其计数最大容量为2048,计数的最大值N为2047,可满足本次设计中所有音名对音频系数的要求。 3、初始值的选取D 初始值D = 计数最大值N - 分频系数n 此次设计中应用的各音名对应的分频系数值及初始值如表所示: 音符 初始值 对应音谱 区别高中低音 0 2047 0 0 1 773 1 0 2 912 2 0 3 1036 3 0 4 1116 4 0 5 1197 5 0 6 1290 6 0 7 1372 7 0 8 1410 1 1 9 1480 2 1 10 1542 3 1 12 1622 5 1 13 1670 6 1 14 1711 7 1 15 1728 1 2 ——各音名对应的分频系数值及初始值—— - 7 - 4.1.3节拍发生器原理 该演奏电路的最小节拍为1拍,将一拍的时长定为0.25s,则只需要再提供一个4Hz的时钟频率即可产生一拍的时长。为了能达到演奏时能循环进行,则需设置一个时长计数器,当乐曲演奏完时,保证能自动从头开始演奏。 4.2 控制模块 4.2.1 音调发生器(ydfsq)模块 1、音调发生器模块 在此模块中设置了一个8位二进制计数器(计数最大值为64),这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25s,恰好为当全音符设为1s时,四四拍的4分音符的持续时间。例如,ydfsq在以下的VHDL逻辑描述中,“新年好”乐曲的第一个音符为“1”,此音在逻辑中停留了2个时钟节拍,即为0.5s时间,相应地所对应“1”音符分频预置数为773在skfpq的输入端停留了1s。随着notetabs中的计数器按4Hz的时钟频率做加法计数时,乐谱逐次被选取,“新年好”乐曲就开始自然连续而且循环地演奏起来。在新年好之后,又循环播放了”童话”。 音调发生器模块VHDL源程序如下: library ieee; use ieee.std_logic_1164.all; --库的声明 entity ydfsq is port(clk:in std_logic; toneindex:out integer range 0 to 15); end; architecture bhv of ydfsq is signal counter:integer range 0 to 392; --读取音符谱中的音符 begin process(clk,counter) begin if counter=392 then counter<=0; elsif clk'event and clk='1' then counter<=counter+1; end if; end process; - 8 - process(counter) begin case counter is --将读取的音符谱输出 when 0 to 1|3 to 4|6 to 9|24 to 27|29 to 30|76 to 79|81 to 82|97 to 104|186 to 187|192 to 195|263 to 266|320 to 325|348 to 351|353 to 360|368 to 392=>toneindex<=8; when 46 to 53|55 to 56|70 to 71|85 to 88|95 to 96|184 to 185|233 to 236|238 to 240|295 to 297|299 to 302|318 to 319|327 to 330=>toneindex<=9; when 14 to 15|17 to 18|20 to 23|31 to 32|44 to 45|57 to 58|68 to 69|72 to 75|83 to 84|136 to 143|148 to 151|154 to 159|164 to 167|172 to 175|180 to 183|196 to 199|243 to 260|267 to 270|307 to 310|315 to 317|331 to 334=>toneindex<=10; when 42 to 43|59 to 62|64 to 67|132 to 135|152 to 153|168 to 171|176 to 179|241 to 242|303 to 306|311 to 314=>toneindex<=11; when 33 to 36|38 to 41|128 to 131|200 to 203|227 to 232|271 to 274|289 to 294=>toneindex<=12; when 204 to 211|220 to 223|225 to 226|275 to 281|283 to 286|287to 288=>toneindex<=13; when 10 to 13|89 to 92|124 to 127=>toneindex<=5; when 335 to 342|344 to 347=>toneindex<=6; when 93 to 94|361 to 367=>toneindex<=7; when 2|5|16|19|28|37|54|63|80|105 to 119|120 to 123|144 to 147|160 to 163|188 to 191|212 to 219|224|237|261 to 262|282|298|326|343|352=>null; end case; end process; end; 2、音调发生器模块的仿真图 《新年好》音调发生器模块的仿真波形图 《童话》音调发生器模块的仿真波形图 - 9 - 通过仿真图可以清楚的看到,时钟clk由0开始计数,每计一次数输出toneindex的值随之发生一定的变化,只不过根据乐谱的不同,输出的变化也不尽相同。例如在本次设计中,自第4个时钟上升沿来临到第7个时钟上升沿,输出toneindex “1”。于是根据乐谱的不同就输出不同的音符,作为音调编码器的输入。然后把输出toneindex输入到音调编码器模块,进行下一步编码工作。于是,由仿真图可以知道本模块输出的即为演奏音乐的音符谱,说明该程序正确,可以生成逻辑器件。 3、音调发生器模块生成的逻辑器件 音调发生器电路模块生成器件 4.2.2音调编码器(ydbmq)模块 1、音调编码器模块的功能 此模块的功能首先是为skfpq提供决定所发音符的分频预置数,而此数在skfpq输入端口停留的时间即为此音符的节拍值。ydbmq模块是乐曲简谱码对应的分频预置数查表电路,其中设置了“小星星”乐曲全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和音调发生器模块ydfsq的clk输入频率决定,在此为4Hz。这13个值的输出由对应于ydbmq的4位输入值index[3..0]来确定。与此同时,code[3..0]和code1[3..0]这两个输出接2个数码管分别显示乐曲音符的高、中、低音(“0”代表低音,“1”代表中音,“2”代表高音)和乐曲演奏的音符(高、中、低1,7音符)。 2、音调编码器模块的VHDL源程序 library ieee; use ieee.std_logic_1164.all; entity ydbmq is port(index:in integer range 0 to 15; code:out integer range 0 to 15; code1:out integer range 0 to 15; tone:out integer range 0 to 2047); end; architecture bhv of ydbmq is begin process(index) - 10 - begin --为个音符赋初始值以便进行分频 case index is when 0=>tone<=2047;code<=0;code1<=0; when 1=>tone<=773;code<=1;code1<=0; when 2=>tone<=912;code<=2;code1<=0; when 3=>tone<=1036;code<=3;code1<=0; when 4=>tone<=1116;code<=4;code1<=0;when 5=>tone<=1197;code<=5;code1<=0; when 6=>tone<=1290;code<=6;code1<=0;when 7=>tone<=1372;code<=7;code1<=0; when 8=>tone<=1410;code<=1;code1<=1;when 9=>tone<=1480;code<=2;code1<=1; when10=>tone<=1542;code<=3;code1<=1;when 11=>tone<=1571;code<=4;code1<=1; when12=>tone<=1622;code<=5;code1<=1;when 13=>tone<=1670;code<=6;code1<=1; when14=>tone<=1711;code<=7;code1<=1;when 15=>tone<=1728;code<=1;code1<=2; when others=>NULL; end case; end process; end ; 3、音调编码器模块生成的逻辑器件 音调编码器模块生成的逻辑器件 4、音调编码器模块的仿真图 音调编码器模块的仿真波形图 在此仿真图中从上到下依次代表输出code、输出code1、输入index和输出tone。 - 11 - 通过此仿真图能清楚的看到当音符分别为4、10、8、15时,它们所对应的分频预置数tone分别是1116、1542、1410、1728;所对应的音谱code分别是4、3、1、1;所对应的高中低音code1又分别是0(低)、1(中)、1(中)、2(高)。其中code、code1能分别在两个数码管上显示,而tone则输入到数控分频模块作为分频的依据。于是,由仿真图印证了音调编码模块传送预置数及显示功能。 4.2.3手动\自动选择(bmux)模块 1、手动\自动选择模块的功能 根据设计的要求,该简易乐曲演奏器能实现手动或自动演奏乐曲的功能。于是,可通过一个按键cs来进行自动与手动的选择,当cs按下时,乐曲自动演奏,其他情况下均为手动演奏乐曲,即可以通过按下其他的按键(与cs相连的按键除外)来控制不同的音符。与此同时,还需要一个复位信号rst来控制该演奏器是否工作,当rst为1时,停止演奏,为0时,可以演奏。以上提到的手动与自动的选择只能在rst为0时有效。 2、手动\自动选择模块的VHDL源程序 library ieee; use ieee.std_logic_1164.all; entity bmux is port(d1,d2:in integer range 0 to 15; cs,rst:in std_logic; q:out integer range 0 to 15); end; architecture bhv of bmux is begin process(cs,rst) begin if rst=‟1‟ then q<=0; else case cs is when „0‟=>q<=d1; when „1‟=>q<=d2; when others=>q<=d1; end case; end if; end process; end; - 12 - 3、手动\自动选择模块生成的逻辑器件 手动\自动选择模块生成的逻辑器件 4、手动\自动选择模块的仿真图 手动\自动选择模块的仿真波形图 此仿真图中输入cs代表手动\自动演奏的选择端,输入rst代表整体复位端,输入d1、d2分别代表手动和自动要演奏的音符,输出q代表经过选择后,要演奏的或是手动输入或是自动输入的音符。由此仿真图可清楚的看到当rst=1时,不论选择的是手动还是自动,输出都为零,达到了整体复位的功能;当rst=0且cs=1时,自动演奏乐曲,因为q与d2的值相同;当rst=0且cs=0时,手动演奏乐曲,因为这时的q与d1的值相同,从而也达到了演奏方式选择的功能。 4.2.4 数控分频器(skfpq)模块 1、数控分频器模块的功能 该模块的clk端输入一个具有较高频率(本实验为12MHz)的信号,通过skfpq分频后由spkout输出。由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲信号,为了便于驱动喇叭,需另加一个D触发器均衡其占空比,也即作二分频处理。skfpq对clk输入信号的分频比由11位预置数tone[10..0]决定。spkout的输出频率将决定每一音符的音调,这样分频计数器的预置数tone[10..0]与spkout的输出频率就有了对应关系。例如在ydbmq模块中取tone[10..0]=1036,作为发音符为“3”音的信号频率。 2、数控分频器模块的VHDL源程序 - 13 - library ieee; use ieee.std_logic_1164.all; entity skfpq is port(clk:in std_logic; tone:in integer range 0 to 2047; spks:out std_logic); end; architecture bhv of skfpq is signal preclk:std_logic; signal fullspks:std_logic; begin process(clk) variable count4:integer range 0 to 15; begin preclk<=‟0‟; if count4>11 then preclk<=‟1‟;count4:=0; elsif clk‟event and clk=‟1‟ then count4:=count4+1; end if; end process; process(preclk,tone) variable count11:integer range 0 to 2047; begin if preclk‟event and preclk=‟1‟ then if count11=2047 then count11:=tone;fullspks<=‟1‟; else count11:=count11+1;fullspks<=‟0‟; end if; end if; end process; process(fullspks) variable count2:std_logic; begin if fullspks‟event and fullspks=‟1‟ then count2:=not count2; if count2=‟1‟ then spks<=‟1‟; else - 14 - spks<=‟0‟; end if; end if; end process; end; 3、数控分频器模块生成的逻辑器件 数控分频器模块逻辑器件 4、数控分频器模块的仿真图 数控分频器模块的仿真波形图 在此仿真图中,输入clk是一个频率较大的时钟信号,输入tone代表着某个音符的分频预置数,输出spks则代表将输入clk先经过12次分频,再经过(预置数终值2048-tone)次分频,最终在进行二分频处理后的信号,而这个信号的频率就是我们需要演奏的音谱的频率,根据频率的不同,从而能通过喇叭听到不同的声音,这就是我们一直想要演奏的乐曲了~ 4.2.5彩灯控制(colour)模块 1、彩灯控制模块的功能 clk端输入一个频率的信号,数码管显示灯,即D1到D8灯,随着时间循环亮灯。 2、彩灯控制模块的VHDL源程序 library ieee; use ieee.std_logic_1164.all; entity colour is - 15 - port( clk: in std_logic; light: out std_logic_vector(7 downto 0) ); end; architecture one of colour is signal counter:integer range 0 to 35; begin process(clk) begin if counter=35 then counter<=0; elsif(clk'event and clk='1')then counter<=counter+1; end if; end process; process(counter) begin case counter is when 01=>light<="11000000"; when 02=>light<="00110000"; when 03=>light<="00001100"; when 04=>light<="00000011"; when 05=>light<="00001100"; when 06=>light<="00110000"; when 07=>light<="11000000"; when 08=>light<="01100000"; when 09=>light<="00110000"; when 10=>light<="00011000"; when 11=>light<="00001100"; when 12=>light<="00000110"; when 13=>light<="00000011"; when 14=>light<="00000110"; when 15=>light<="00001100"; when 16=>light<="00011000"; when 17=>light<="00110000"; when 18=>light<="01100000"; when 19=>light<="11000000"; when 20=>light<="10101010"; when 21=>light<="01010101"; when 22=>light<="10101010"; when 23=>light<="01010101"; when 24=>light<="10101010"; when 25=>light<="01010101"; when 26=>light<="10101010"; - 16 - when 27=>light<="01010101"; when 28=>light<="10101010"; when 29=>light<="01010101"; when 30=>light<="10101010"; when 31=>light<="01010101"; when 32=>light<="10101010"; when 33=>light<="01010101"; when 34=>light<="10101010"; when 35=>light<="01010101"; when others=>null; end case; end process; end; 3、彩灯控制器模块生成的逻辑器件 彩灯控制模块生成的逻辑器件 4、彩灯控制模块的仿真图 彩灯控制模块的仿真波形图 - 17 - 4.3 受控模块中各子系统电路间的逻辑关系 4.4 系统电路 4.4.1 仿真波形分析结果 顶层模块仿真图 通过仿真波形图可以看到,输入端rst为复位端,当其值为1时,输出端均为0,cs为手动、自动选择端,cs为1时手动演奏即输出端与d0的值相同,cs为0时自动演奏即输出端与d1的值相同,也就是演奏已存入的固定乐曲;与此同时进 - 18 - 行手动演奏和自动演奏时,数码管上即code2和code3的输出同时能显示出音符的数和高低音的种类。 从仿真图中得知所设计的原理图符合本设计要求,可以进行下载。 4.4.2 引脚锁定清单 根据需要,本设计采用模式5,这是因为数码管自带译码芯片,输出时只需输出数字的二进制数,因此不必直接输出数字的码型,这就方便了字符的输出。根据模式5上所对应的引脚号查表可以得出需要锁定的引脚号码。 clk1 PIN-153 clk2 PIN-28 cs PIN-240 code0 PIN-13 code1 PIN-14 code2 PIN-15 code3 PIN-16 rst PIN-239 sdm[0] PIN-233 sdm[1] PIN-234 sdm[2] PIN-235 sdm[3] PIN-236 spkout PIN-174 code10 PIN-17 code11 PIN-18 code12 PIN-19 code13 PIN-20 clk3 PIN-152 light[0] PIN-1 light[1] PIN-2 light[2] PIN-3 light[3] PIN-4 light[4] PIN-6 light[5] PIN-7 light[6] PIN-8 light[7] PIN-12 4.4.3 硬件(时钟频率、开关、按键、显示、音响等) 输入程序并且编译无误,并且仿真无误后,便进行引脚锁定及程序下载,在进行引脚锁定时必须对照引脚锁定图进行锁定,采用模式5其引脚锁定图如图所示: - 19 - 模式5实验电路结构图 输入clk2是一个频率较小的时钟信号,在进行硬件下载时它与实验箱上clock2模块的4Hz频率相连,它决定着乐曲演奏的快慢;输入clk1是一个频率较大的时钟信号,因为要对它进行多次不同的分频,下载时它与实验箱上clock0模块的12MHz频率相连;输入key[3..0]是当手动演奏时自己确定的音符,下载时它与实验箱上的按键4、3、2、1相连;输入rst和cs分别是整体复位端和演奏方式选择端,它们分别与实验箱上的按键8、7相连;输出code0和code1分别用来显示音谱与高中低音,它们分别与实验箱上的数码管1和2相连(提示:选择工作模式为模式5);输出spkout要与实验箱上的喇叭相连,用来发出声音;输出light[7..0]是彩灯显示,分别与数码管显示灯D1到D7相连。顶层电路的仿真波形图是否正确依赖于各个子模块的功能是否完善,同时顶层电路的功能实现又验证了各个子模块的正确性,二者相互依存。最后,由仿真波形图印证了整体电路的功能。引脚锁定后执行programmer 下载程序至试验箱进行验证,经验证本次设计完成的设计基本正确,但是基准时钟选取的不同演奏的效果不同。 - 20 - 4.4.4 使用说明书 当按键7按下去 当按键7弹上来 (即当rst=1时) (即当rst=0时) 只有 当按键8按下去时(即cs=1) 当按键8弹上来时(即cs=0) 彩灯 循环播放《新年好》和《童话》 手动输入(按键1~4) 闪烁 数码显示管1显示音调(即1~7) 数码显示管2显示音高(即低音,中音,高音) 手动输入对应表 0 0 0 0 0 低音0 0 0 0 1 1 低音1 0 0 1 0 2 低音2 0 0 1 1 3 低音3 0 1 0 0 4 低音4 0 1 0 1 5 低音5 0 1 1 0 6 低音6 0 1 1 1 7 低音7 1 0 0 0 8 中音1 1 0 0 1 9 中音2 1 0 1 0 10 中音3 1 0 1 1 11 中音4 1 1 0 0 12 中音5 1 1 0 1 13 中音6 1 1 1 0 14 中音7 1 1 1 1 15 高音1 5(下载结果 按键7(复位键)按下时,只有彩灯显示。 - 21 - 按键7弹上来时,按键8按下去时,自动播放。 按键7、8都弹上来,手动播放 例如:输入低音1,数码管显示01;输入低音2,数码管显示02。 6(含外围硬件环境的整体系统原理电路图及说明 - 22 - 经过了各个子模块的分析与验证后,我们只需将各个子模块之间的输入输出端、子模块与整体电路之间的输入输出端进行正确的硬件连接就得到了顶层音乐演奏器的原理图,如图所示: INPUTkeyVCCINPUTclk12VCC bmuxydbmq ydfsqskfpq d1[3..0]q[3..0]index[3..0]code[3..0] INPUTOUTPUTclk4spkoutclktoneindex[3..0]d2[3..0]code1[3..0]clkspksVCC cstone[10..0]tone[10..0] rstinst2 inst3inst1 inst INPUTcsVCCOUTPUTcode2 INPUTrstVCC OUTPUTcode3 7(工作进程及本人担任的任务总结 本次实训两周,我们组设计的题目是简易乐曲发生器,第一周讲了相关的软件的知识,第二周开始分工,然后编写程序,做仿真,下载。 我们组要求设计的乐曲发生器能循环播放两首曲目,要求能实现手控自控功能,数码显示管同步显示乐谱功能,显示彩灯功能。 我负责的是,数码显示的模块,分频模块,共同完成的是编写两首曲目的程序。 总结: 1、本次简易乐曲演奏器的设计经过了整体分析、模块化分析、整体与模块的仿真分析这样三个步骤,硬件实现了整体复位、按键选择演奏方式、循环演奏以及数码管显示乐谱的功能。 2、在做数控分频器模块的仿真时一定要处理好时序问题。 3、本次设计可以说达到了设计要求,但尚有需要改进的地方。随着乐谱的复杂程度加大,如果依然在音调发生器的程序中通过时钟计数来决定音符的输出,会加大编程的繁杂度,这时一个很好的解决办法就是把将要演奏的乐谱存放在人为开辟的存储空间里,这样只需要在相应地址中读出音符即可。 - 23 - 8(收获和体会 为期的两周的FPGA设计基础实训结束了,对于这次电子课程设计实训,我感想颇多。这次实训提供了多次动手锻炼的机会,增强了我们的实践能力。在这次实训中我们小组遇到了很多的困难,分析程序对我们来说就是不小的挑战,常常要花两倍的时间改程序,编译通过了也可能希望的功能没有实现出来。但我们从来就没有放弃过我们设计的课题。我们把问题细化,一步一步地解决。去图书借阅相关的书籍。在解决问题的过程,我们学到了很多的实际的知识,这些知识是书本上学不到的。给我们积累了很多的实际经验。尤其在本次实训中,陈老师给了我们小组及时的帮助让我茅塞顿开、受益匪浅,在此对陈老师表示深深的谢意。 9(附录 9.1程序清单 library ieee; use ieee.std_logic_1164.all; --库的声明 entity ydfsq is port(clk:in std_logic; toneindex:out integer range 0 to 15); end; architecture bhv of ydfsq is signal counter:integer range 0 to 392; --读取音符谱中的音符 begin process(clk,counter) begin if counter=392 then counter<=0; elsif clk'event and clk='1' then counter<=counter+1; end if; end process; process(counter) begin case counter is --将读取的音符谱输出 when 0 to 1|3 to 4|6 to 9|24 to 27|29 to 30|76 to 79|81 to 82|97 to 104|186 to 187|192 to 195|263 to 266|320 to 325|348 to 351|353 to 360|368 to 392=>toneindex<=8; - 24 - when 46 to 53|55 to 56|70 to 71|85 to 88|95 to 96|184 to 185|233 to 236|238 to 240|295 to 297|299 to 302|318 to 319|327 to 330=>toneindex<=9; when 14 to 15|17 to 18|20 to 23|31 to 32|44 to 45|57 to 58|68 to 69|72 to 75|83 to 84|136 to 143|148 to 151|154 to 159|164 to 167|172 to 175|180 to 183|196 to 199|243 to 260|267 to 270|307 to 310|315 to 317|331 to 334=>toneindex<=10; when 42 to 43|59 to 62|64 to 67|132 to 135|152 to 153|168 to 171|176 to 179|241 to 242|303 to 306|311 to 314=>toneindex<=11; when 33 to 36|38 to 41|128 to 131|200 to 203|227 to 232|271 to 274|289 to 294=>toneindex<=12; when 204 to 211|220 to 223|225 to 226|275 to 281|283 to 286|287to 288=>toneindex<=13; when 10 to 13|89 to 92|124 to 127=>toneindex<=5; when 335 to 342|344 to 347=>toneindex<=6; when 93 to 94|361 to 367=>toneindex<=7; when 2|5|16|19|28|37|54|63|80|105 to 119|120 to 123|144 to 147|160 to 163|188 to 191|212 to 219|224|237|261 to 262|282|298|326|343|352=>null; end case; end process; end; library ieee; use ieee.std_logic_1164.all; entity ydbmq is port(index:in integer range 0 to 15; code:out integer range 0 to 15; code1:out integer range 0 to 15; tone:out integer range 0 to 2047); end; architecture bhv of ydbmq is begin process(index) begin --为个音符赋初始值以便进行分频 case index is when 0=>tone<=2047;code<=0;code1<=0; when 1=>tone<=773;code<=1;code1<=0; when 2=>tone<=912;code<=2;code1<=0; when 3=>tone<=1036;code<=3;code1<=0; when 4=>tone<=1116;code<=4;code1<=0;when 5=>tone<=1197;code<=5;code1<=0; when 6=>tone<=1290;code<=6;code1<=0;when 7=>tone<=1372;code<=7;code1<=0; when 8=>tone<=1410;code<=1;code1<=1;when 9=>tone<=1480;code<=2;code1<=1; when10=>tone<=1542;code<=3;code1<=1;when 11=>tone<=1571;code<=4;code1<=1; when12=>tone<=1622;code<=5;code1<=1;when 13=>tone<=1670;code<=6;code1<=1; - 25 - when14=>tone<=1711;code<=7;code1<=1;when 15=>tone<=1728;code<=1;code1<=2; when others=>NULL; end case; end process; end ; library ieee; use ieee.std_logic_1164.all; entity bmux is port(d1,d2:in integer range 0 to 15; cs,rst:in std_logic; q:out integer range 0 to 15); end; architecture bhv of bmux is begin process(cs,rst) begin if rst=‟1‟ then q<=0; else case cs is when „0‟=>q<=d1; when „1‟=>q<=d2; when others=>q<=d1; end case; end if; end process; end; library ieee; use ieee.std_logic_1164.all; entity skfpq is port(clk:in std_logic; tone:in integer range 0 to 2047; spks:out std_logic); end; architecture bhv of skfpq is signal preclk:std_logic; signal fullspks:std_logic; begin - 26 - process(clk) variable count4:integer range 0 to 15; begin preclk<=‟0‟; if count4>11 then preclk<=‟1‟;count4:=0; elsif clk‟event and clk=‟1‟ then count4:=count4+1; end if; end process; process(preclk,tone) variable count11:integer range 0 to 2047; begin if preclk‟event and preclk=‟1‟ then if count11=2047 then count11:=tone;fullspks<=‟1‟; else count11:=count11+1;fullspks<=‟0‟; end if; end if; end process; process(fullspks) variable count2:std_logic; begin if fullspks‟event and fullspks=‟1‟ then count2:=not count2; if count2=‟1‟ then spks<=‟1‟; else spks<=‟0‟; end if; end if; end process; end; library ieee; use ieee.std_logic_1164.all; entity colour is port( clk: in std_logic; light: out std_logic_vector(7 downto 0) ); - 27 - end; architecture one of colour is signal counter:integer range 0 to 35; begin process(clk) begin if counter=35 then counter<=0; elsif(clk'event and clk='1')then counter<=counter+1; end if; end process; process(counter) begin case counter is when 01=>light<="11000000"; when 02=>light<="00110000"; when 03=>light<="00001100"; when 04=>light<="00000011"; when 05=>light<="00001100"; when 06=>light<="00110000"; when 07=>light<="11000000"; when 08=>light<="01100000"; when 09=>light<="00110000"; when 10=>light<="00011000"; when 11=>light<="00001100"; when 12=>light<="00000110"; when 13=>light<="00000011"; when 14=>light<="00000110"; when 15=>light<="00001100"; when 16=>light<="00011000"; when 17=>light<="00110000"; when 18=>light<="01100000"; when 19=>light<="11000000"; when 20=>light<="10101010"; when 21=>light<="01010101"; when 22=>light<="10101010"; when 23=>light<="01010101"; when 24=>light<="10101010"; when 25=>light<="01010101"; when 26=>light<="10101010"; when 27=>light<="01010101"; when 28=>light<="10101010"; when 29=>light<="01010101"; - 28 - when 30=>light<="10101010"; when 31=>light<="01010101"; when 32=>light<="10101010"; when 33=>light<="01010101"; when 34=>light<="10101010"; when 35=>light<="01010101"; when others=>null; end case; end process; end; 9.2参考文献 [1].王传新 《FPGA设计基础》高等教育出版社 [2].王振红《VHDL数字电路设计与应用实践教程》王振红 [3].刘江海 《EDA技术课程设计》.华中科技大学出版社 - 29 -
本文档为【乐曲发生器eda设计—《新年好】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_482581
暂无简介~
格式:doc
大小:303KB
软件:Word
页数:36
分类:企业经营
上传时间:2017-09-05
浏览量:83