您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > FPGA课程设计-硬件乐曲演奏电路设计
HefeiUniversityofTechnologyFPGA···························································1···························································1···························································2(I)························································2(II)·······················································9(III)·····················································10(IV)····················································10························································11-1-FPGA(Field-ProgrammableGateArray),即现场可编程门阵列。它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA和CPLD还有一个区别:CPLD下电之后,原有烧入的逻辑结构不会消失;而FPGA下电之后,再次上电时,需要重新加载FLASH里面的逻辑代码,需要一定的加载时间。以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。集成电路设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者的不同设计而改变,所以FPGA可以完成不同的逻辑功能。FPGA的开发相对于传统PC、单片机的开发有很大不同。FPGA以并行运算为主,以硬件描述语言来实现;相比于PC或单片机的顺序操作有较大区别。本组的主要目标是用硬件设计语言设计一个硬件乐曲演奏电路,能在Basys2开发板上实际验证。发声物体振动频率决定了音调的高低。经过一定的时间间隔,以某个特定-2-的次序依次产生不同音调的声音,就能得到一段有规律的旋律。可以用无源蜂鸣器产生不同音调的声音。无源蜂鸣器上有方波(占空比50%的矩形波)时,就会有声音发出,音调的高低由方波频率决定,因此改变方波频率,就可以演奏乐曲。蜂鸣器模块已经自带放大电路,因此不需要考虑FPGA输出信号的驱动能力问题。可以用计时器产生固定的时间间隔(每一次进位相当于打一次节拍);可以将晶振的振动频率经过一定的处理(计数器分频)之后得到某个音调对应的蜂鸣器振动频率。每打一个(或两个,三个)节拍,使蜂鸣器按照不同的频率振动,就能演奏出一段旋律。(I)编写程序(a)编写music.vhd在XilinxISE中编写如下程序:-3--4--5-music.vhd描述的是演奏音乐电路的主体,产生固定的时间间隔(打节拍)及定义不同的音调对应的振动频率(给无源蜂鸣器的信号)。对标准库进行说明、定义实体名及其输入输出接口之后,在结构体中对电路的结构及行为进行描述。最后是主体music与元件music_rom的连接。该结构体有8个进程:进程1是实现一个计时器的功能,将时钟频率(50MHz)12600000分频,得到周期约为250毫秒的计时器。进位标志为cout_250ms。进程1的功能是产生固定的时间间隔,起“打节拍”的作用。进程2是实现一个计数器的功能,其时钟信号是进程1的计时器的进位次数。该计数器的时间周期即为乐曲一次播放的时间,计数的变量为addr。因为要演奏的乐曲是《祝你生日快乐》,它有24拍,而每2次进程1计时器的进位有效的时间间隔为1拍,故计数容量允许的最小值为24×2=48。这里把计数容量设为50,addr的最大值为49,其二进制形式为00110001。-6-进程3是一个计时器,将时钟信号50分频,得到周期为s的计时器,进位频率为1MHz。进程4是实现一个计数器的功能,计数容量为(value+1),每当进程3中的变量count_50为00110001时计数一次。故一个周期的时间为(value+1)×s,进位频率为1MHz/(value+1)。进程5实现的功能是在进程4的计数器计到value值时将cout置为1,其余情况置0。故cout两次被置为1的时间间隔也即为进程4计数器的时间周期(value+1)×s,频率为1MHz/(value+1)。进程6是一个条件判断,定义不同的音调对应的value值,从而得到给蜂鸣器信号(spkout)的频率。进程7实现的功能是当时钟上升沿来临时把cout的值赋给q1。进程8实现的功能是在q1=0且cout=1时将给蜂鸣器的信号spkout翻转一次。该条件满足的时间间隔与cout两次被置为1的时间间隔一致;但是由于spkout回到原来状态需要翻转2次,故spkout的频率为cout置1频率的一半。则spkout的频率为1MHz/[(value+1)×2]。下面的表格列出了常用的音高对应的发生频率、value值(十进制)和对应的douta值(在music_rom中作为某个音调的代号)音调-3.4.5.6.7.频率/Hz0330349392440494value015161431127511351135douta000010111100110111101111-7-音调123456频率/Hz523587659698784880988value955850757715637567505douta0001001000110100010101100111音调频率/Hz104611751318value477425378douta100110101000(b)编写music_rom.vhd在XilinxISE中编写如下程序:-8--9-music_rom用于谱曲,修改其中的douta值(在music_rom中作为某个音调的代号)出现的次序可以使电路演奏出不同的乐曲。(c)编写约束文件music.ucf在XilinxISE中编写如下程序:(II)在XilinxISE中新建工程,ProjectSettings按照如下设置:-10-设置完成后将步骤(I)中的三个文件添加到工程中。选中music.vhd之后点击GenerateProgrammingFile,如果没有错误就可以生成机器代码music.bit。(III)连接电路。开发板和蜂鸣器用3根杜邦线连接,JA1接蜂鸣器模块的I/O,JA6接蜂鸣器模块的VCC,JA5接蜂鸣器模块的GND;并将开发板和电脑连接。(IV)烧录与运行-11-打开烧录软件DigilentAdept,找到步骤(II)生成的music.bit,并烧录到开发板。开发板开始演奏音乐。大三上学期初步地学习了硬件描述语言,知道了如何用硬件描述语言实现一些简单的功能,但对其真正的工作原理还是一知半解。经过课程设计中查阅相关资料及利用VHDL编写程序,编译,再到烧录、运行,使我了解了利用硬件描述语言设计集成电路的整个流程。特别是在XilinxISE中查看rtl视图,可以发现,一个进程就可以看作一个电路模块;双击该模块,可以发现模块内部的电路也已经连接好。这大大加深了我对硬件描述语言的理解。纸上得来终觉浅,绝知此事要躬行。要获得对事物规律更深刻的理解,除了学好理论知识外,真正动手操作大概也是其中很重要的一部分。
本文标题:FPGA课程设计-硬件乐曲演奏电路设计
链接地址:https://www.777doc.com/doc-6166613 .html