




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数字电路与逻辑设计实验报告北京邮电大学信息工程简易钢琴游戏姓 名: ×××学 号: ×××指导教师:×××2021年10月28日一、 任务要求31、 基本要求32、提高要求3二、 系统设计41、 设计思路42、 总体框架53、 分块设计6 1hz分频器65hz分频器6200hz分频器6500hz分频器6扬声器7倒计时器7计分器8数码管显示控制器8序列发生器98×8点阵10三、 仿真波形与波形分析111、 分频器波形分析112、 扬声器波形分析113、 倒计时器波形分析124、 计分器波形分析12
2、5、 数码管显示控制器波形分析136、 序列发生器波形分析157、8×8点阵波形分析15四、 源程序16五、 功能说明与资源利用情况171、 功能说明172、 资源利用情况17六、 故障及问题分析171、3000代码量的意义172、 音符消失vs计分183、 超声波or次声波184、 防抖“防”出的规律185、 滚动pk独立186、 sos19七、 总结和结论191、总结192、感悟19八、 附录201、 任务要求设计制作一个简易钢琴游戏机。1、 基本要求用8×8点阵进行游戏显示。用btn1btn7七个按键模拟钢琴演奏时的“1 2 3 4 5 6 7:”七个音符,点阵的第一
3、列对应音符“1”,第二列对应音符“2”,以此类推,低中高音自定。光点在点阵第一行随机出现,逐点下落,下落速度为0.2秒/行。在光点下落到点阵最后一行之前的过程中,如果按下与该列点阵相应的音符键,该光点消失,蜂鸣器演奏相应的音符声音,计分器加1。如果在光点下落到最后一行依然没有进行相应的按键操作,该光点消失,计分器不加分,计分器由数码管显示。每隔1秒在点阵的不同列的第一行出现一个光点。游戏时间为30秒,数码管倒计时显示。 2、提高要求光点在点阵某行随机出现,然后逐点下落。下落速度随机变化。光点按照存储的乐曲顺序和速度出现。自拟其他功能。2、 系统设计1、 设计思路图一:总体设计思路图通过控制分频
4、器不同的分频系数来达到发出不同频率的声音。通过序列发生器产生音符的顺序,然后再传递给点阵显示。通过分频器分频出1hz和5hz的信号,用来控制光点的出现与下落。通过循环计数器计分,并把结果传输给数码管显示控制器。通过循环计数器倒计时,并把结果传输给数码管显示控制器。通过数码管显示控制器统一控制6个数码管显示分数和倒计时。2、 总体框架图二:总体框架图说明:super:项目名称;clk:50m系统时钟;clear:复位信号;btn6.0:七个音符“1,2,3,4,5,6,7”分别对应的按键;a6.0:数码管显示数字控制信号;cat5.0:数码管选通信号;hang_out7.0:控制点阵每一行的显示
5、内容;lie_out7.0:控制点阵进行“行扫描”;beep:控制蜂鸣器发声信号;3、 分块设计 1hz分频器图三:1hz分频器clk:50mhz系统时钟;clkout:1hz脉冲,用于控制每隔1s出现一个光点;5hz分频器clk:50mhz系统时钟;clkout:5hz脉冲,用于控制每隔0.2s光点下落一行;200hz分频器clk:50mhz系统时钟;clkout:200hz脉冲,用于控制消除按键抖动;500hz分频器clk:50mhz系统时钟;clkout:500hz脉冲,用于控制点阵和数码管的扫描;扬声器图四:扬声器clk:50m系统时钟;btn6.0:分别对应按键btn7btn1,按下
6、不同按键,得到不同的分频系数;clkout:根据btn6.0的状态输出不同频率的脉冲,控制扬声器发出不同频率的声音;倒计时器图五:倒计时器计分器图六:计分器btn6.0:对应btn7btn1七个按键;clk:200hz时钟;clear:复位信号,对应按键btn0;i2.0:前一个光点出现在哪一列,取值范围“000111”;j2.0:当前光点出现在哪一列,取值范围“000111”;q4.0:当前得分,取值范围“00001110”;数码管显示控制器图七:数码管显示控制器clk:500hz时钟;p4.0:倒计时剩余秒数;q4.0:当前总得分;cat5.0:数码管选通信号,逐个扫描6个数码管;a6.0
7、:控制七个共阴极的二极管的亮灭组合成所需数字;序列发生器图八:序列发生器clk:1hz时钟;clear:异步复位键;q2.0:输出新的光点应该在哪一列出现;8×8点阵图九:8×8点阵clk1:1hz时钟;clk2:5hz时钟;clk3:500hz时钟;clear:复位信号;q2.0:由序列发生器传输而来的音符顺序;btn6.0:对应btn7btn1,按键对应列的光点消失(如果该光点存在的话);hang_out7.0:控制点阵每一行的内容;lie_out7.0:控制点阵进行“行扫描”;i1_out:输出前一个音符所在的列;i2_out:输出当前音符所在的列;3、 仿真波形与波
8、形分析1、 分频器波形分析图十:分频器波形clkout的周期为clk的2倍,分频系数为2,分频脉冲稍有延时。2、 扬声器波形分析图十一:扬声器波形根据不同的btn,决定不同的分频系数,从而得到不同的分频脉冲。3、 倒计时器波形分析图十二:倒计时波形clk为1hz时钟,clk的上升沿来到时,p减1,初始值为30,当减到0时,重新从30减起;clear为异步复位信号。4、 计分器波形分析图十三:计分器波形分析当btn=“1000000”and i=1 or j=1 => q<=q+1;当btn=“0100000”and i=1 or j=1 => q<=q+1;当btn=“
9、0010000”and i=1 or j=1 => q<=q+1;当btn=“0001000”and i=1 or j=1 => q<=q+1;当btn=“0000100”and i=1 or j=1 => q<=q+1;当btn=“0000010”and i=1 or j=1 => q<=q+1;当btn=“0000001”and i=1 or j=1 => q<=q+1;q<=q+1;其他任何情况q均不会变化;clear为异步复位信号。5、 数码管显示控制器波形分析图十四:数码管显示控制器波形分析剩余时间p由倒计时器模块传递
10、过来,当前得分q由计分器模块传递过来,cat作为选通信号,以500hz的频率不断扫描6个数码管,最左两个显示分数,最右两个显示剩余时间。6、 序列发生器波形分析图十五:序列发生器波形分析clk为1hz时钟,clk上升沿来到,则q变化;改变q的变化规律,就可以存储不同的乐曲的乐谱。clear为异步复位信号。7、8×8点阵波形分析图十六:8×8点阵波形分析i1_out,i2_out,j_out分别表示前一个音符、当前音符、音符当前位置,i1_out,i2_out随1hz时钟变化,j_out随5hz时钟变化,通过枚举的办法将8×8×5=320种情况全部罗列出来
11、;lie_out随着500hz的clk3逐行扫描点阵,同时hang_out控制该行显示内容。4、 源程序参见附录。5、 功能说明与资源利用情况1、 功能说明顺序按下btn7btn1键可以奏出“1,2,3,4,5,6,7”七个中音音符;btn0为系统复位键,按下btn0,系统回复初始状态;光点每隔一秒按照预先已经存储好的音符顺序在第一行出现,每隔0.2秒向下移动一格,同一时刻允许有两个光点出现;当光点下落到最后一行之前,按下对应的btn键,光点消失,计数器加分,蜂鸣器奏出相应音符;按下非对应的键,光点不消失,计数器不加分,蜂鸣器奏出相应音符;光点下落到最后一行时仍然没有按下相应按键,则光点消失,
12、计分器不加分。游戏时间30秒结束后,自动重新开始。2、 资源利用情况itemvaluequartues ii version9.0familymax iideviceepm1270t144c5total logic element685/1270 (54%)total pins39/116 (34%)6、 故障及问题分析1、3000代码量的意义问题:音符要随机出现,并且因为音符出现时间1s和下落时间0.2s的关系,决定了在同一时刻必须允许两列同时存在亮点,那该怎么办呢?解决办法:用变量i,j,k分别存储前一个音符的列位置、当前音符的列位置、音符当前的下落到哪一行。因为前后两个点的行间隔恒为5,
13、所以用一个k值便可存储两个点的行位置。i,j随着1hz的时钟每一秒变化一次,i<=j;j<=q;(其中q为序列发生器模块传递过来的音符,也是每一秒变化一次)。k值随5hz的时钟每0.2秒加1,控制着光点的下落,当k=5时,k<=1。这样,通过判断i,j,k的8×8×5=320种组合,就可以实时的显示下落的点阵。2、 音符消失vs计分问题:想要让音符消失,则需要在按下相应按键的瞬间将i或者j置零。然而,计分器的计分工作原理是比较按键情况与i和j的组合情况,如果按键瞬间就将i或j置零的话,那么虽然光点会消失,但是计数器却永远不会加分。解决办法:每个0.2秒就将
14、i和j的值传递给计分器,这样等到按下按键将i或j置零时,也不影响计分器的正常工作。3、 超声波or次声波问题:课题要求按下不同按键的时候,蜂鸣器要发出不同频率的声音,这个可以通过改变分频系数解决。然后,当完全不按键的时候(也就是要求蜂鸣器不发声的时候),分频系数是多少呢?解决办法:一开始同学建议将分频系数设为很大或者很小,分出超声波或者次声波,这样就可以“瞒天过海”了。后来请教老师才知道,当完全不按键的时候可以绕过分频系数,直接将蜂鸣器信号置零,这样就不会响了,茅塞顿开。4、 防抖“防”出的规律问题:在给btn7btn1按键加上防抖模块之前,每按一次键,计分器都是不规则的加数,这当然是抖动的缘
15、故。但是,当我加上防抖模块之后,每按一次键,计分器却非常精准的加5,而我程序设计的是加1呀!解决办法:经过向同学请教,发现问题出现在我去除抖动模块的时钟和检测去抖动后信号的时钟频率不一致所致,而后者频率恰好是前者的5倍,所以才会出现每按一次加5的“异象”,把前后频率统一之后,问题就解决了。5、 滚动pk独立问题:我已开始着手写模块的时候是这样的:先写模块a,再写模块b,然后把模块a与模块b组合中大模块c,然后再写模块d,然后将c于d组合,再接着写e就像雪球“滚动式”地前进。后来觉得前进的阻力越来越大。解决办法:原来我一开始对模块化的理解是错误的。模块化应该是这样的:写模块a,b,c,d,最后再
16、一次性组合。按照正确的思路,我重新了各个模块的程序,实现了课题要求。6、 sos问题:点阵音符下落的时候,有时候会周期性的在中图向右拐一格再回到原来的列,有时候向左拐,有时候向右拐,拐出的时间也是不确定的。每按一次复位键,拐的情况也是有所变化。解决办法:暂无。幸好多按几次复位键之后,点阵的显示总有正常的情况。7、 总结和结论1、总结作品已基本实现课题的基本要求,实现了提高功能中的“光点按照存储的乐曲顺序”出现。(ps:孙老师,验收的时候忘了跟你说我实现了这个附加功能了)其中,光点的不时混乱跳跃最后也没能解决。当倒计时到0时,也没能让系统停止工作,而是自动重新开始了,这点也是不尽人意。2、感悟虽
17、然我在软件和硬件中较为喜欢前者,但是这也不阻碍我花费大量的时间和精力去完成任务。最终发现,虽然我不热爱它,但我做得也不差嘛。同学的帮助(包括其他班的)对我来说也是很重要,当然我也非常享受帮助同学们所带来的乐趣。人各有所长嘛最后感谢孙老师的解答疑问哦我记得我好像问了许多问题啦8、 附录以下是各模块源代码1、 分频器(以1hz分频为例子)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity div_1s isport ( clk: in std_logic; clkout: out std_l
18、ogic); constant divide :integer:=50000000; -此为分频系数end div_1s;architecture div10_arch of div_1s issignal t: std_logic;beginprocess(clk)variable count: integer range 0 to (divide-2)/2);beginif (clk'event and clk='1') thenif (count = (divide-2)/2) thencount := 0;t <= not t;elsecount := c
19、ount + 1;end if;end if;end process;clkout <= t;end;2、 扬声器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yangshengqi isport(btn:in std_logic_vector(6 downto 0); -对应7个按键(btn7btn0) clk:in std_logic;-50mhz clkout:out std_logic); -输出给蜂鸣器的信号end yangshengqi;architecture
20、play of yangshengqi issignal f:integer range 1 to 150000;signal count:integer range 1 to 150000;signal b:std_logic;begin choose:process(btn) begin case btn is when "0000001" =>f<=47779; -f为分频系数 when "0000010" =>f<=42566; when "0000100" =>f<=37922; when
21、 "0001000" =>f<=35793; when "0010000" =>f<=31888; when "0100000" =>f<=28409; when "1000000" =>f<=25310; -when "10000000" =>f<=23912; when others =>f<=150000; end case; end process choose; cnt:process(f,count,clk,bt
22、n,b) begin if clk'event and clk='1' then if count=f or count>f then count<=1; if f=150000 then b<='0' else b<=not b; end if; else count<=count+1; end if; end if; clkout<=b; end process cnt;end play;3、 倒计时器library ieee;use ieee.std_logic_1164.all;entity daojishi
23、isport(clk:in std_logic; -1sclear:in std_logic;p:out std_logic_vector(4 downto 0);end daojishi;architecture a of daojishi issignal p_temp:std_logic_vector(4 downto 0); beginp1:process(clk,clear)begin if(clear='1') then p_temp<="11110"elsif clk'event and clk='1' thenc
24、ase p_temp iswhen "11110" => p_temp<="11101"when "11101" => p_temp<="11100"when "11100" => p_temp<="11011"when "11011" => p_temp<="11010"when "11010" => p_temp<="11001"wh
25、en "11001" => p_temp<="11000"when "11000" => p_temp<="10111"when "10111" => p_temp<="10110"when "10110" => p_temp<="10101"when "10101" => p_temp<="10100"when "10100&
26、quot; => p_temp<="10011"when "10011" => p_temp<="10010"when "10010" => p_temp<="10001"when "10001" => p_temp<="10000"when "10000" => p_temp<="01111"when "01111" => p_t
27、emp<="01110"when "01110" => p_temp<="01101"when "01101" => p_temp<="01100"when "01100" => p_temp<="01011"when "01011" => p_temp<="01010"when "01010" => p_temp<="0
28、1001"when "01001" => p_temp<="01000"when "01000" => p_temp<="00111"when "00111" => p_temp<="00110"when "00110" => p_temp<="00101"when "00101" => p_temp<="00100"when
29、"00100" => p_temp<="00011"when "00011" => p_temp<="00010"when "00010" => p_temp<="00001"when "00001" => p_temp<="00000"when "00000" => p_temp<="11110"when others => p_
30、temp<="11110"end case;end if;end process p1;p<=p_temp;end a;4、 计分器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jifenqi isport(btn:in std_logic_vector(6 downto 0);clk:in std_logic;clear:in std_logic;i,j:in std_logic_vector(2 downto 0); -有点阵模块传递过来的前一个
31、和现在音符所在的列q:out std_logic_vector(4 downto 0); -当前得分end jifenqi;architecture a of jifenqi issignal q_temp:std_logic_vector(4 downto 0);beginprocess(clk)beginif clear='1' then q_temp<="00000"elsif clk'event and clk='1' thenif (btn(6)='1')and(i="001")or
32、(j="001")or (btn(5)='1')and(i="010")or(j="010")or (btn(4)='1')and(i="011")or(j="011")or (btn(3)='1')and(i="100")or(j="100")or (btn(2)='1')and(i="101")or(j="101")or (btn(1)='1
33、')and(i="110")or(j="110")or (btn(0)='1')and(i="111")or(j="111")then q_temp<=q_temp+1;end if;end if;end process;q<=q_temp;end a;5、 数码管显示控制器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shumaguan_display isport
34、(clk:in std_logic; ->=500hzp:in std_logic_vector(4 downto 0); -计时器传递过来的剩余时间q:in std_logic_vector(4 downto 0); -计分器传递过来的分数cat:out std_logic_vector(5 downto 0); -数码管选通信号a:out std_logic_vector(6 downto 0) -数码管信号);end shumaguan_display;architecture a of shumaguan_display issignal i:std_logic_vector(2
35、 downto 0);beginp1:process(clk)beginif clk'event and clk='1' thencase i iswhen "000" => i<="001"cat<="011111"case q iswhen "00000" => a<="0000000"when "00001" => a<="0000000"when "00010"
36、=> a<="0000000"when "00011" => a<="0000000"when "00100" => a<="0000000"when "00101" => a<="0000000"when "00110" => a<="0000000"when "00111" => a<="0000000"
37、;when "01000" => a<="0000000"when "01001" => a<="0000000" -9when "01010" => a<="0110000" -10when "01011" => a<="0110000"when "01100" => a<="0110000"when "01101"
38、 => a<="0110000"when "01110" => a<="0110000"when "01111" => a<="0110000"when "10000" => a<="0110000"when "10001" => a<="0110000"when "10010" => a<="0110000&quo
39、t;when "10011" => a<="0110000"when "10100" => a<="1101101" -20when "10101" => a<="1101101"when "10110" => a<="1101101"when "10111" => a<="1101101"when "11000" =
40、> a<="1101101"when "11001" => a<="1101101"when "11010" => a<="1101101"when "11011" => a<="1101101"when "11100" => a<="1101101"when "11101" => a<="1101101"
41、 -29when "11110" => a<="1111001"when others => a<="0000000"end case;when "001" => i<="010"cat<="101111"case q iswhen "00000" => a<="1111110"when "00001" => a<="0110000"
42、;when "00010" => a<="1101101"when "00011" => a<="1111001"when "00100" => a<="0110011"when "00101" => a<="1011011"when "00110" => a<="1011111"when "00111" =>
43、a<="1110000"when "01000" => a<="1111111"when "01001" => a<="1111011" -9when "01010" => a<="1111110"when "01011" => a<="0110000"when "01100" => a<="1101101"wh
44、en "01101" => a<="1111001"when "01110" => a<="0110011"when "01111" => a<="1011011"when "10000" => a<="1011111"when "10001" => a<="1110000"when "10010" => a&l
45、t;="1111111"when "10011" => a<="1111011" -19when "10100" => a<="1111110"when "10101" => a<="0110000"when "10110" => a<="1101101"when "10111" => a<="1111001"when
46、 "11000" => a<="0110011"when "11001" => a<="1011011"when "11010" => a<="1011111"when "11011" => a<="1110000"when "11100" => a<="1111111"when "11101" => a<
47、="1111011"-29when "11110" => a<="1111110"when others => a<="0000000"end case;when "010" => i<="011"cat<="110111"a<="0000000"when "011" => i<="100"cat<="111011&quo
48、t;a<="0000000"when "100" => i<="101"cat<="111101"case p iswhen "00000" => a<="0000000"when "00001" => a<="0000000"when "00010" => a<="0000000"when "00011" =>
49、 a<="0000000"when "00100" => a<="0000000"when "00101" => a<="0000000"when "00110" => a<="0000000"when "00111" => a<="0000000"when "01000" => a<="0000000"when
50、 "01001" => a<="0000000" -9when "01010" => a<="0110000" -10when "01011" => a<="0110000"when "01100" => a<="0110000"when "01101" => a<="0110000"when "01110" =>
51、; a<="0110000"when "01111" => a<="0110000"when "10000" => a<="0110000"when "10001" => a<="0110000"when "10010" => a<="0110000"when "10011" => a<="0110000"whe
52、n "10100" => a<="1101101" -20when "10101" => a<="1101101"when "10110" => a<="1101101"when "10111" => a<="1101101"when "11000" => a<="1101101"when "11001" =>
53、a<="1101101"when "11010" => a<="1101101"when "11011" => a<="1101101"when "11100" => a<="1101101"when "11101" => a<="1101101" -29when "11110" => a<="1111001"w
54、hen others => a<="0000000"end case;when "101" => i<="110"cat<="111110"case p iswhen "00000" => a<="1111110"when "00001" => a<="0110000"when "00010" => a<="1101101"when
55、 "00011" => a<="1111001"when "00100" => a<="0110011"when "00101" => a<="1011011"when "00110" => a<="1011111"when "00111" => a<="1110000"when "01000" => a<
56、="1111111"when "01001" => a<="1111011" -9when "01010" => a<="1111110"when "01011" => a<="0110000"when "01100" => a<="1101101"when "01101" => a<="1111001"when &q
57、uot;01110" => a<="0110011"when "01111" => a<="1011011"when "10000" => a<="1011111"when "10001" => a<="1110000"when "10010" => a<="1111111"when "10011" => a<=&q
58、uot;1111011" -19when "10100" => a<="1111110"when "10101" => a<="0110000"when "10110" => a<="1101101"when "10111" => a<="1111001"when "11000" => a<="0110011"when &quo
59、t;11001" => a<="1011011"when "11010" => a<="1011111"when "11011" => a<="1110000"when "11100" => a<="1111111"when "11101" => a<="1111011"-29when "11110" => a<=&
60、quot;1111110"when others => a<="0000000"end case;when others => i<="000"end case;end if;end process p1;end a;6、 序列发生器library ieee;use ieee.std_logic_1164.all;entity shunxu isport(clk:in std_logic; -1sclear:in std_logic;-i_out:out integer;q:out std_logic_vector(2
61、downto 0);end shunxu;architecture a of shunxu issignal i:integer range 1 to 30;beginp1:process(clk)beginif clear='1' then i<=1;q<="000"elsif clk'event and clk='1' thencase i iswhen 1 => q<="001"when 2 => q<="010"when 3 => q<=&
62、quot;011"when 4 => q<="100"when 5 => q<="101"when 6 => q<="110"when 7 => q<="111"when 8 => q<="001"when 9 => q<="010"when 10 => q<="011"when 11 => q<="100"when 12 =>
63、; q<="101"when 13 => q<="110"when 14 => q<="111"when 15 => q<="001"when 16 => q<="010"when 17 => q<="011"when 18 => q<="100"when 19 => q<="101"when 20 => q<="110&qu
64、ot;when 21 => q<="111"when 22 => q<="001"when 23 => q<="010"when 24 => q<="011"when 25 => q<="100"when 26 => q<="101"when 27 => q<="110"when 28 => q<="111"when 29 => q<="001"when 30 => q<="010"when others => q<=&qu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院规范用工合同范本
- 与物业签订广告合同范本
- 浠水购房合同范本
- 银行居间付款合同范本
- 修建乡村公路合同范本
- 医院日常装饰维修合同范本
- 协调服务合同范本
- 公房买给个人合同范本
- 上海吊车租用合同范本
- 北京绿化合同范本
- 2024年江苏农牧科技职业学院单招职业适应性测试题库及参考答案
- 患者转运意外应急预案
- 大学生国防教育教案第四章现代战争
- 人教版初中化学实验目录(总表)
- AS9100航空航天质量管理体系-要求培训教材
- 第2课+古代希腊罗马【中职专用】《世界历史》(高教版2023基础模块)
- Q-GDW 11711-2017 电网运行风险预警管控工作规范
- 《桃树下的小白兔》课件
- 电工仪表与测量(第六版)中职技工电工类专业全套教学课件
- 强调句(完整版)-高三英语市公开课一等奖省赛课获奖课件
- 2022年4月自考00277行政管理学试题及答案含解析
评论
0/150
提交评论