《Veriloghdl—自动化专业-简易电子琴设计.docx》由会员分享,可在线阅读,更多相关《Veriloghdl—自动化专业-简易电子琴设计.docx(10页珍藏版)》请在课桌文档上搜索。
1、谢吐文理学浣前易电8装做针4/自劭化实验目的使用VerilogHDL语言进展前端设计,并使用Quaruts软件在GW48PK2实验上实现仿真,实现硬件电子琴。电子琴要求有8个音阶,使用外部时钟信号3MHz,能同步显示音阶。设计要求1、设计一个简易电子琴。要求能演奏的音域为D调的do到E调do。2、用GW48PK2中的8个按键作为琴键。3、GW48-PK2中有蜂鸣器。4、可以使用GW48-PK2上的12MHZ作为输入时钟信号设计思路通过可编程逻辑器件(PLD)和VHDL硬件描述语言来实现电子琴的基本要求。设计的主体是数控分频器,对输入的频率按照与每个音阶对应的分频系数进展分频,得到各个音阶对应的
2、频率分别在蜂鸣器和数码管上以声音和频率数值的形式作为输出。设计组成与原理以以下图为系统的工作原理框图。模块设计1 .音名与频率的关系音乐的12平均率规定:每2个八度音(如简谱中的中音1与高音D之间的频率相差1倍。在2个八度音之间,又可分为12个半音。灵位,音符A(简谱中的低音6)的频率为440HZ,音符B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中所有的音符的频率,在这我们只需计算出中音1到高音1的频率即可。如下所示:表一简谱音名与频率的对应关系音名中音1中音2中音3中音4中音4中音6中音7同日1频率/HZ523.3587.3659.3698.5784880987.81046.
3、5由于各音符对应的频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。假设分频器时钟频率过低,那么由于分频系数过小,四舍五入取整后的误差较大;假设时钟频率过高,虽然误差变小,但分频数将变大。实际的设计应综合考虑两方面的因素,在尽量减少频率误差的前提下取适宜的时钟频率。本实验要求用12MHZ的时钟脉冲信号,所以不必考虑这方面的因素。实际上,只要各个音符间的相对频率关系不变,弹奏出来的音调听起来是不会走调的。2 .分频系数与初始值(预置数)本例设计的音乐电子琴选取12MHZ的系统时钟频率。在数控分频器模块中,由于数控分频器输出的波形是脉宽极窄的脉冲波,为了更好地驱动扬声器
4、发生,减少输出的偶次谐波分量,在到达扬声器之前需要均衡占空比,从而生成各音符对应频率的对称方波输出。这个过程实际上进展了一次二分频,频率变为原来的二分之一,即6MHZ。因此,分频系数的计算可以按照下面的方法进展。以中音1为例,对应的频率值为523.3HZ,它的分频系数应该为:Divider=6MHz523.3=6*106/523.3=11466至于其他音符,同样由上式求出对应的分频系数,这样利用程序可以轻松地得到相应的乐声。各音名对应的分频系数如下表:表二各音名对应的分频系数音名中音1中音2中音3中音4中音5中音6中音7高音1分频系数(divider)114661021691018590765
5、3681860745733由于最大的分频系数为11466,故采用14位二进制计数器已能满足分频要求。将分频系数设为0,其初始值为16383(214-1)即可,此时扬声器不会发声。对于不同的分频系数,加载不同的初始值即可。本实验参考王金明:?VerilOgHDL程序设计教程?,采用差值法进展分频。把差值作为初始值,为不同音阶的发声的来源。各音名对应的初始值如下表:表三各音名对应的初始值J5.Zz日中音1中音2中音3中音4中音5中音6中音7高音1初始值(origin)49176167728277938730956510309106503.数控分频器数控分频器是对基准频率进展分频,得到与各个音阶对应
6、的频率输出。数控分频模块是由一个初始值可变的14位加法计数器构成,该计数器的模为214=16384,当计数器记满时,产生一个进位信号,该信号就是用作发音的频率信号。其分为预分频和脉冲展宽两局部。a)预分频assignpreclk=(divider=16383)?1:0;always(posedgeelk)beginif(preclk)divider=origin;elsedivider=dividerl;endb)脉冲展宽(二分频)always(posedgepreclk)beginSPeaker=speaker;目的是将预分频产生的占空比很小的波形进展拓宽,使得波形有足够长的高电平来驱动扬声
7、器。实验仿真(一)测试使用的仪器与软件仪器康芯GW48系歹UEDA设备GW48-PK2实除电踣图和磋用范(8本实验适用模式3,其构造图如下1 .Altera公司的CyCIone系列的EP2C5T144C8芯片2 .康芯教学实验箱软件QuartusIIQuartusII是AItera公司的综合性PLD开发软件,支持原理图、VHDLVerilogHDL以及AHDL(AlteraHardwareDescriptionLangUage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程以下为使用QuartusII软件得到的RTL级视图(二)测试方法注:选择
8、模式3,此模式下按键为琴键式,适合本实验演奏。1 .翻开QuartusII软件,fiIe-NewProjectWizard-选择程序epiano2.2 .ASSignInent-Device-设置芯片为CycloneII系列的EP2C5T144C83 .定义管脚如下elkPIN_128index2PIN_3code0PIN_39index3PIN_4codelPIN_40index4PIN_5code2PIN_41index5PIN_6code3PIN_42index6PIN_7dPIN_47index7PIN_10index0PIN_1spkPIN_129indexlPIN_2以以下图为管脚
9、定义界面4 .定义完成后再次编译,再执行Programmer,选中e_piano.sof,开场下载。以以下图为编译下载界面5 .下载完成后控制按键,观察音调准确,声音清晰,数码管能够正常显示音调Q实验总结根据教师的要求,我们先一起通过所学知识讨论了设计原理,不懂的问了下其他同学,最后定制出了大致方案。在具体设计过程中,我们根据步骤逐次检验,查阅了有关资料,主要包括王金明:?VerilOgHDL程序设计教程?以及潘松,黄继业,潘明的?EDA技术实用教程?在初次编写分频模块时候,使用的是比较基本的计数器分频法,编写程序后在m。CleISinI软件中进展了仿真,发现无法观察到分频情况。经过分析,原因
10、是由于分频比过大,因此在波形图中很难观察到。而且由于预分频的占空比很小,更难以观察到高电平。在原因找到后,为了考察程序的性能,我们将输入频率减小。同时适当缩小分频比,这样就得到了模块仿真中的分频波形。通过此次实验,我们不仅学会了QUartUSII软件的使用方法,还对集成电路设计有了更深的认识,对专业知识得到了加强。同时认识到了自己的缺乏,比方有些知识已经模糊,所以有待于复习,所谓“温故而知新,我们要学习的东西还很多。这次的学习将对自己以后的研究生学习和将来的工作有很大的帮助,也是一次实践的锻炼!参考文献1 .王金明:VVerilogHDL程序设计教程?2 .潘松,黄继业,潘明?EDA技术实用教
11、程?3 .其他网上资料精索:我才像代马信号建星钝clk:帛于卢士冬曾书阶频率心泉术(阜,key:;晕/符看入端口,/speaker:用才低廨与户暮妁*信号,中,方武信号,/med,high:/,用于*藤*4,本#4,4ktt劲一小今勒*承看*LED耒*水,/origin:&破枪台发线决机信/府版率妁方外值,moduledianziqin(clk,key,speaker,med,high);inputelk;/12MHZinput7:0key;outputspeaker;/* + t*output 3:0 med;/f + X*outputhigh;reg13:0divider;reg13:0o
12、rigin;regspeaker;reghigh;reg3:0med;wirepreclk;14位,有轴停频率*晨融台频assignpreclk=(divider=16383)?1:0;always(PoSedgeelk)beginif(preclk)divider=origin;elsedivider=dividerl;endalways(posedgepreclk)beginSPeaker=-speaker;“宽波招,/金方设信号endparameterdo=8,b00000001,re=8b0010,mi=8b000100,fa=8b0010,so=8b0100,la=8blOOO,i=
13、8b010000,do-=8bl000;秋本务勒,柬帛秋急勒薛勒方Xays(key)&(此公置case(key)do:beginorigin=4917;med=l;high=O;endre:beginorigin=6167;med=2;high=O;endmi:beginorigin=7282;med=3;high=O;endfa:beginorigin=7793;med=4;high=O;endso:beginorigin=8730;med=5;high=O;endla:beginorigin=9565;med=6;high=O;endxi:beginorigin=10309;med=7;high=O;enddo_:beginorigin=10650;med=l;high=l;enddefault:beginorigin=16383;high=O;endendcaseendmodule