当前位置:文档之家› Verilog-hdl—简易电子琴设计

Verilog-hdl—简易电子琴设计

湖北文理学院简易电子琴设计专业:自动化学号:64姓名:一天虹影实验目的使用VerilogHDL语言进行前端设计,并使用Quaruts软件在GW48-PK2实验上实现仿真,实现硬件电子琴。

电子琴要求有8个音阶,使用外部时钟信号3MHz,能同步显示音阶。

设计要求1、设计一个简易电子琴。

要求能演奏的音域为D调的do到E调do。

2、用GW48-PK2中的8个按键作为琴键。

3、 GW48-PK2中有蜂鸣器。

4、可以使用GW48-PK2上的12MHz作为输入时钟信号设计思路通过可编程逻辑器件(PLD)和VHDL硬件描述语言来实现电子琴的基本要求。

设计的主体是数控分频器,对输入的频率按照与每个音阶对应的分频系数进行分频,得到各个音阶对应的频率分别在蜂鸣器和数码管上以声音和频率数值的形式作为输出。

设计组成与原理下图为系统的工作原理框图。

模块设计1. 音名与频率的关系音乐的12平均率规定:每2个八度音(如简谱中的中音1与高音1)之间的频率相差1倍。

在2个八度音之间,又可分为12个半音。

灵位,音符A (简谱中的低音6)的频率为440HZ ,音符B 到C 之间、E到F之间为半音,其余为全音。

由此可以计算出简谱中所有的音符的频率,在这我们只需计算出中音1到高音1的频率即可。

如下所示: 表一 简谱音名与频率的对应关系由于各音符对应的频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。

若分频器时钟频率过低,则由分频置 数按 键分 频器12MHZ蜂 鸣 器数码管显示于分频系数过小,四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但分频数将变大。

实际的设计应综合考虑两方面的因素,在尽量减少频率误差的前提下取合适的时钟频率。

本实验要求用12MHZ的时钟脉冲信号,所以不必考虑这方面的因素。

实际上,只要各个音符间的相对频率关系不变,弹奏出来的音调听起来是不会走调的。

2.分频系数与初始值(预置数)本例设计的音乐电子琴选取12MHZ的系统时钟频率。

在数控分频器模块中,由于数控分频器输出的波形是脉宽极窄的脉冲波,为了更好地驱动扬声器发生,减少输出的偶次谐波分量,在到达扬声器之前需要均衡占空比,从而生成各音符对应频率的对称方波输出。

这个过程实际上进行了一次二分频,频率变为原来的二分之一,即6MHZ。

因此,分频系数的计算可以按照下面的方法进行。

以中音1为例,对应的频率值为,它的分频系数应该为:Divider=6MHz/=6*106 /=11466至于其他音符,同样由上式求出对应的分频系数,这样利用程序可以轻松地得到相应的乐声。

各音名对应的分频系数如下表:表二各音名对应的分频系数由于最大的分频系数为11466,故采用14位二进制计数器已能满足分频要求。

将分频系数设为0,其初始值为16383(214 -1 )即可,此时扬声器不会发声。

对于不同的分频系数,加载不同的初始值即可。

本实验参考王金明:《Verilog HDL程序设计教程》,采用差值法进行分频。

把差值作为初始值,为不同音阶的发声的来源。

各音名对应的初始值如下表:表三各音名对应的初始值3.数控分频器数控分频器是对基准频率进行分频,得到与各个音阶对应的频率输出。

数控分频模块是由一个初始值可变的14位加法计数器构成,该计数器的模为214=16384,当计数器记满时,产生一个进位信号,该信号就是用作发音的频率信号。

其分为预分频和脉冲展宽两部分。

a)预分频assign preclk=(divider==16383)1:0;always@(posedge clk)beginif(preclk)divider=origin;elsedivider=divider+1;endb) 脉冲展宽(二分频)always@(posedge preclk)beginspeaker=~speaker;目的是将预分频产生的占空比很小的波形进行拓宽,使得波形有足够长的高电平来驱动扬声器。

实验仿真(一)测试使用的仪器与软件仪器康芯GW48系列EDA设备-----GW48-PK2实验电路图和适用范围:本实验适用模式3,其结构图如下CLOCK9CLOCK5CLOCK2CLOCK0实验电路结构图NO.3译码器译码器译码器译码器译码器译码器译码器译码器D9D16D15D14D13D12D11D10D8D7D6D5D4D3D2D1PIO8PIO9PIO10PIO11PIO12PIO13PIO14PIO15S P E A K E R扬声器12345678目标芯片FPGA/CPLD PIO0PIO1PIO2PIO3PIO4PIO5PIO6PIO7键1键2键3键4键5键6键7键8PIO15-PIO8PIO47-PIO44PIO43-PIO40PIO39-PIO36PIO35-PIO32PIO31-PIO28PIO27-PIO24PIO23-PIO20PIO19-PIO16公司的Cyclone 系列的EP2C5T144C8芯片 2.康芯教学实验箱软件Quartus IIQuartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程以下为使用Quartus II软件得到的RTL级视图(二) 测试方法注:选择模式3,此模式下按键为琴键式,适合本实验演奏。

1.打开QuartusⅡ软件,file-NewProjectWizard-选择程序e_piano2.设置芯片为CycloneⅡ系列的EP2C5T144C83.定义管脚如下clk PIN_128index[2]PIN_3code[0]PIN_39index[3]PIN_4 code[1]PIN_40index[4]PIN_5 code[2]PIN_41index[5]PIN_6 code[3]PIN_42index[6]PIN_7d PIN_47index[7]PIN_10 index[0]PIN_1spk PIN_129 index[1]PIN_2下图为管脚定义界面4.定义完成后再次编译,再执行Programmer,选中,开始下载。

下图为编译下载界面5.下载完成后控制按键,观察音调准确,声音清晰,数码管能够正常显示音调。

实验总结根据老师的要求,我们先一起通过所学知识讨论了设计原理,不懂的问了下其他同学,最后定制出了大致计划。

在具体设计过程中,我们根据步骤逐次检验,查阅了有关资料,主要包括王金明:《Verilog HDL程序设计教程》以及潘松,黄继业,潘明的《EDA技术实用教程》在初次编写分频模块时候,使用的是比较基本的计数器分频法,编写程序后在modelsim软件中进行了仿真,发现无法观察到分频情况。

经过分析,原因是由于分频比过大,因此在波形图中很难观察到。

而且由于预分频的占空比很小,更难以观察到高电平。

在原因找到后,为了考察程序的性能,我们将输入频率减小。

同时适当缩小分频比,这样就得到了模块仿真中的分频波形。

通过此次实验,我们不仅学会了Quartus II软件的使用方法,还对集成电路设计有了更深的认识,对专业知识得到了加强。

同时认识到了自己的不足,比如有些知识已经模糊,所以有待于复习,所谓“温故而知新”,我们要学习的东西还很多。

这次的学习将对自己以后的研究生学习和将来的工作有很大的帮助,也是一次实践的锻炼!参考文献1.王金明:《Verilog HDL程序设计教程》2.潘松,黄继业,潘明《EDA技术实用教程》3.其他网上资料附录:程序源代码//信号定义与说明://clk:用于产生各种音阶频率的基准频率;//key:电子琴音符输入端口;//speaker:用于激励扬声器的输出信号,本例中为方波信号;//med,high:分别用于显示中音,高音音符,各驱动一个数码显示管和LED来显示;//origin:为数控分频模块提供音符频率的初始值;module dianziqin(clk,key,speaker,med,high);input clk; //12MHZinput [7:0] key;output speaker;output high; //高音显示output [3:0] med; //中音显示reg [13:0] divider; //分频系数和初始值reg [13:0] origin;reg speaker;reg high;reg [3:0] med;wire preclk;assign preclk=(divider==16383)1:0; //14位,对时钟频率进行预分频 always@(posedge clk)beginif(preclk)divider=origin;elsedivider=divider+1;endalways@(posedge preclk)beginspeaker=~speaker;//进行2分频,拓宽波形,产生方波信号endparameter do=8'b00000001,re=8'b00000010,mi=8'b00000100,fa=8'b00001000,so=8'b00010000,la=8'b00100000,xi=8'b01000000,do_=8'b; //状态编码,采用独热码编码方式 always@(key) //分频比预置case(key)do: beginorigin=4917;med=1;high=0;endre: beginorigin=6167;med=2;high=0;endmi: beginorigin=7282; med=3;high=0;endfa: beginorigin=7793; med=4;high=0;endso: beginorigin=8730; med=5;high=0;endla: beginorigin=9565; med=6;high=0;endxi: beginorigin=10309; med=7;high=0;enddo_: beginorigin=10650;med=1;high=1;enddefault:begin origin=16383;high=0;endendcaseendmodule。

相关主题