欢迎来到天天文库
浏览记录
ID:16239934
大小:389.65 KB
页数:18页
时间:2018-08-08
《数字电路与逻辑设计实验报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、北京邮电大学数字电路与逻辑设计实验报告课题名称:简易钢琴游戏姓名:学号:班级:学院:实验指导教师:一.课题要求设计制作一个简易钢琴游戏机。1.原理概述:根据声乐知识,产生音乐的两个因素是音乐频率的持续时间,音乐的十二平均率规定,每两个八音度之间的频率相差一倍,在两个八音度之间,又可分为12个半音。每两个半音的频率比为4。另外,音名A(乐谱中的低音6)的频率为440HZ,音名B到C之间,E到F之间为半音,其余为全音。由此可以计算出乐谱中从低音1到高音1之间每个音名的频率如表1所示。2.基本要求:1、用8×8点阵进行游
2、戏显示。2、BTN1~BTN7七个按键模拟钢琴演奏时的“1234567”七个音符。点阵的第一列对应音符“1”,第二列对应音符“2”,依此类推,低中高音自定。3、光点在点阵第一行随机出现,逐点下落,下落速度为0.2秒/行,如图1所示。4、在光点下落到点阵最后一行之前的过程中,如果按下与该列点阵相应的音符键,该光点消失,蜂鸣器演奏相应的音符声音,计分器加1。如果在光点下落到最后一行依然没有进行相应的按键操作,该光点消失,计分器不加分。计分器由数码管显示。5、每隔1秒在点阵的不同列的第一行出现一个光点,如图2所示。6、游
3、戏时间为30秒,数码管倒计时显示。3.提高要求:1、光点在点阵某行随机出现,然后逐点下落。2、下落速度随机变化。3、光点按照存储的乐曲顺序和速度的出现。4、自拟其它功能。二.系统设计1.设计思路将整个系统分为几个模块,分别设计各个模块,最后把模块连接成系统。这种分模块设计容易实现,易于纠错,对一个模块的修改不影响其他模块,设计思路清晰明了,整个系统规整有序。将不同的模块在quartus中制作成器件,在顶层框图中用连线进行相应的连接,加上输入与输出,便完成了整个系统的设计。BTN按钮50MHz时钟输入CLK系统清零c
4、lear档位选择2.系统框图防抖模块蜂鸣器分频随机数发生器计分器与数码管扫描倒计时分频模块点阵扫描3.分块设计(1)分频器模块:把50MHz的时钟频率分别分成1kHz、5HZ和1HZ,分别用于数码管与点阵扫描、光点下落频率、随机数生成与倒计时;(2)防抖模块:用于按键的防抖;(3)随机数生成模块:每隔一秒产生一个随机数,并判断按键的正确与否;(4)倒计时模块:从30开始计时;(5)数码显示模块:记录分数,同时将分数与倒计时输出到数码管,用于显示;(6)点阵模块:根据分频得到的频率与随机数发生器产生的随机数生成两个扫
5、描频率,分别为行扫描与列扫描,输出到相应管脚;(7)蜂鸣器模块:根据按键btn1-btn7七个按钮,结合拨码开关状态(低中高),将50MHz原始时钟进行21中不同的分频,分频系数M=50M/f。将得到分频信号输出到beep管脚就能够发出相应的音符。三.仿真波形与波形分析我是分模块进行仿真的,对每个模块我都新建了一个工程进行仿真。由于50MHz时钟在Quartus中不好仿真,因此包括分频的模块如分频模块、防抖模块与蜂鸣器模块就没有做仿真了。①随机数发生器Clear是清零复位端。memorize与random是产生的两
6、个随机数,图中的随机数是循环加一的。Clk_out3是时钟输入。BTN是按键输入,若按键输入与随机数对应,则匹配值match等于1.②点阵模块Memorize与random为两个随机数,clk_out1是扫描频率,clk_out2为光点的下落频率,a为行扫描row,b为列扫描col。由于时钟频率的关系,仿真图不容易观察,并且由于程序还存在一些问题,可以看出行扫描与列扫描存在不匹配。①倒计时Clear是清零端,复位值为30。clk_out3是时钟输入,time1是个位,time2是十位,从30开始减一,直到均为零。②
7、计分器与数码管显示Clear用于清零,clk_out1作为时钟输入。Cat0是计分的个位,cat1是计分的十位,match是匹配判断值,当match在上升沿等于1时,cat0加1,若cat0等于9,则向cat1进位。四.代码源程序①防抖模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfangdouISPORT(clk_out2:INSTD_LOGIC;btn_in:instd_logic_vector(6downto0);btn:outstd_logic_vector(
8、6downto0));ENDfangdou;ARCHITECTUREbehaveOFfangdouISsignalbtntmp1,btntmp2:std_logic_vector(6downto0);BEGINPROCESS(clk_out2)--防抖BEGINIF(clk_out2'EVENTANDclk_out2='0')THENbtntmp2<=btn
此文档下载收益归作者所有