1、 数字电路与逻辑设计实验报告数字电路与逻辑设计实验报告题目:简易钢琴游戏学 院: 班 级:姓 名: 学 号:班内序号: 数字电路与逻辑设计实验报告【实验任务及要求】一基本要求:1.、用 88 点阵进行游戏显示。2、BTN1BTN7 七个按键模拟钢琴演奏时的“1 2 3 4 5 6 7”七个音符。点阵的第一列对应音符“1” ,第二列对应音符“2” ,依此类推,低中高音自定。3、光点在点阵第一行随机出现,逐点下落,下落速度为 0.2 秒 /行,如图1 所示。4、在光点下落到点阵最后一行之前的过程中,如果按下与该列点阵相应的音符键,该光点消失,蜂鸣器演奏相应的音符声音,计分器加1。如果在光点下落到最
2、后一行依然没有进行相应的按键操作,该光点消失,计分器不加分。计分器由数码管显示。5、每隔 1 秒在点阵的不同列的第一行出现一个光点,如图2 所示。二、提高要求:1、光点在点阵某行随机出现,然后逐点下落。2、下落速度随机变化。3、光点按照存储的乐曲顺序和速度的出现。4、自拟其它功能。三、创新功能:1.将游戏规则改为只有当光电下落到最后一行,并及时按键后,才能加分并发出对应数字电路与逻辑设计实验报告音 符,增加了游戏难度,使得游戏更好玩。2.游戏有两种模式,通过一个拨码开关控制,游戏中的光电是随机出现,或者是按照歌 曲小星星出现。【功能说明】本实验利用开发板模拟钢琴游戏,总体上实现了 30 秒倒计
3、时,随机出点下落,按乐曲出点下落,按键及时按下后用数码管显示计分,并使蜂鸣器发声等功能。30 秒倒计时:利用开发板的数码管模块进行输出,当接通电源后,游戏的 30 秒开始倒计时,当计时到达 0 时,停止出点,游戏结束;可以拨动 SW0(reset)从新开始游戏。随机出点下落:利用开发板的点阵输出模块,每隔一秒随机在第一行的任意一列随机出现一个光点,每隔 0.2 秒光点下落。按乐曲音符出点下落:利用开发板的点阵输出模块,按照乐曲的音符在点阵的第一行的对应位置出现光点,每隔 0.2 秒光点下落。与随机出点的功能以一个拨码开关 SW1,进行切换。按键检测:利用开发板的按键部分,分别表示 17 中音音
4、符,当光点下落到对应列的最后一行时,按下对应音符的按键,可加分,蜂鸣器发出响应音符的响声。加分:利用开发板的数码管输出模块,当按键及时按下后,数码管显示的分数对应加一。发声:利用开发板的蜂鸣器输出模块,当按键及时按下后,蜂鸣器发出该按键对应的音符的响声。【系统设计】一设计思路通过对功能的分析,可将本系统分为五个模块:点阵模块:这个部分是本系统比较重要的部分,主要控制点阵输出模块,每隔一秒在点阵的第一行输出一个光点,并每隔 0.2 秒控制整个点阵的光点下落;同时在该模块中还应判断按键是否及时按下,输出加分信号。30 秒计时以及计分模块:这个部分主要是对数码管显示的控制,进行 30 秒的倒计时并显
5、示,同时根据输入的分数,显示当前的分数。分数和时间分别使用 2 个数码管,本模块肩负着对数码管资源合理分配的责任。出点模块:这个部分主要是实现随机产生即将出点的列号(即相应的音符) ,或者按照小星星这首歌曲的音符产生音符,将该音符值传给点阵模块,控制下一秒的出点。发声模块:这个模块主要实现,按照点阵模块传入的分频基准值,对时钟分频,并输出给蜂鸣器,从而发出对应音符的声响。顶层模块:这个模块是以上几个模块的顶层控制,实现将系统的输入输出,以及分模块之间的输入输出联系起来的功能,利用 compnoent 集合以上几个模块。整体思路是分模块实现不同的子功能,在不同的模块对开发板的不同资源进行控制,最
6、后以顶层模块集合不同模块,以实现总体的功能。数字电路与逻辑设计实验报告二系统总体框图1、系统硬件结构框图2、模块划分图计分 计时Mode Reset 1 2 3 4 5 6 7顶层模块点阵控制,按键检测模块蜂鸣器发声模块随机、按乐曲出点模块计分、计时模块数字电路与逻辑设计实验报告3、模块之间信息传递关系顶层模块点阵模块计分计时模块 发声模块 出点模块Input:button,reset,mode,clkOutput:Figure,cat,col,row,out_clk,Clk,reset,scoreFigure,Cat,stopClk,reset,button,yinfu,Col,row,sc
7、ore,freq,callClk,freq,callOut_clk Clk,mode,reset,stopYinfu 数字电路与逻辑设计实验报告4、ASM 图YES启动判断是否倒计时到0NO每隔一秒出点,每隔 0.2 秒点下落判断光点是否到最后一行YES判断按键是否及时按下加一分,蜂鸣器发声,光点消失NONO结束YES数字电路与逻辑设计实验报告5.MDS 图三分模块设计(具体代码见“源程序”)1.文件名:piano_game.vhd功能:顶层模块在顶层模块中,我将分模块以 component 的形式进行声明,并利用 port map 地址映射将相关联的接口参数映射在一起。2.文件名:dianz
8、hen.vhd功能:点阵模块该模块主要完成点阵中每隔一秒出点,以及每隔 0.2 秒下落的功能;同时检测按键最后一行状态对比,判断是否加分和发声;最后输出点阵的行列信号,分数,以及发声的分频基准值。点阵的 row 分量用来扫描显示,因此存入 8 个表示选中某一行的向量 rowtemp0-rowtemp7 用来扫描显示;点阵的 col 分量用来表示每一行的状态,因此存入 8 个保存每行状态的向量 coltemp0-coltemp7。出点:该模块有一个输入信号 yinfu(0-7 的整数),表示即将出现的点在哪一列上,用 coltmp 向量来表示下一个第一行的状态,每当 1S 的时钟沿到来后,将其赋
9、给 coltemp0;下落:每当 0.2 秒的时钟沿到来后,将 coltemp6 赋给 coltemp7,coltemp5 赋给coltemp6.以此类推,实现点的下落。键盘检测、加分、发声:将输入的按键的向量与 coltemp7 相与,如果不为 0 则说明按SW1=1SW0=0SW1=1SW0=0等待出点随机出点,游戏开始按乐曲出点,游戏开始游戏结束30 秒计时结束或 SW0=130 秒计时结束或 SW0=1SW0=1then SW0=0数字电路与逻辑设计实验报告键及时按下,分数加一,同时按照相与结果输出对应音符的分频基准值。此处,应注意进行按键防抖,否则计分将出现问题。3.文件名:scor
10、etime.vhd功能:计时计分模块该模块主要完成 30 秒倒计时和分数显示的功能;最后输出数码管的字符显示向量和接地信号,以及计时到 0 的游戏结束信号。计时:进行 1S 分频,计数变量初始为 30,每当 1S 时钟到来后,计数变量减一;显示:根据计时变量,以及输入的分数值,分别用两个数码管显示计时和计分。首先,在分频进程中分出一个 address 信号,address 取 03 的整数,用来进行数码管的扫描显示。当 address=0 和 1 时,对计时的两个数码管进行扫描,当 address=2 和 3,对计分的两个数码管进行扫描,最终达到同时显示计时和计分的目的。4.文件名:tone.
11、vhd功能:出点模块该模块主要完成输出下一个点将出现在哪一个音符对应的列上的功能,包含两种方式:随机出点和按小星星歌曲出点;最后输出 yinfu(0-7 的整数)。随机出点:产生长度为 15 的 M 序列,每隔一秒产生一个符号,以该符号位首位的四位二进制数对应一个音符,这样近似 17 随机出现;按小星星乐曲音符顺序出点,将一秒规定为乐曲的一拍,按照小星星乐曲,每一秒输出一个音符,使得输出的 yinfu 变量按照歌曲变化。两种出点方式以 mode 输入区。5.文件名:speaker.vhd功能:发声模块该模块主要根据输入的分频基准值进行分频,并将分频后的时钟输出给蜂鸣器,从而发出对应音符的响声。
12、此处给出分频基准值得确定方式:数字电路与逻辑设计实验报告由于分频后对于每个音调的频率都需满足上值,而分频器是由计数原理进行实现的,因此要将频率与计数之间的关系进行推导,得到如下公式,可求出各个音调的分频基准值:(其中 为分频基准值)0512MHzff0f0512MHzff首先我先统一对所有音调进行 12 分频,即将 50MHz 的频率化归到 4MHz 左右,然后再除以每个音调传入的分频基准值 freq,便可得到相应的音调频率。本实验仅涉及到中音的七个音,分频基准值如下:音符 1 2 3 4 5 6 7分频基准值7967 7098 6323 5969 5315 4735 4217【仿真波形及波形
13、分析】1.文件名:scoretime.vhd功能:计时计分模块如图,计时计分模块的仿真波形:从图中可以看出,数码管扫描显示,当 cat=111101 和 111110 时扫描显示计时,figure 输出对应计时数值;当 cat=111011 和 110111 时扫描显示计分,figure 输出仿真设定的计分值 4.数字电路与逻辑设计实验报告从该图中可以看出,计时从 30 到 1,而后输出 stop 的游戏结束信号。2.文件名:tone.vhd功能:出点模块如图,出点模块的仿真波形:从图中可以看出,当 mode=0 时是随机出点的模式,随机输出 yinfu,可以看出 yinfu 基本是随机的。从
14、图中可以看出,当 mode=1 时是按照小星星歌曲出点,yinfu 输出按照歌曲的音符顺序输出。3.文件名:speaker.vhd功能:发声模块如图,发声模块的仿真波形:数字电路与逻辑设计实验报告从图中可以看出,只有当 call=1,即按键后才会发声,否则不会发声;且会按照输入的分频基准值,进行对应的分频。4.文件名:dianzhen.vhd功能:点阵模块如图,点阵模块的仿真波形:从图中可以看出,在 row 向量进行扫描的过程中, col 在逐渐下落(仿真设置的输入 yinfu为 2)数字电路与逻辑设计实验报告从图中可以看出,在按下按键后,score 会加一分;5.文件名:piano_game
15、.vhd功能:顶层模块由上图可以看出,顶层仿真中光点随机出现并下落,落到最后一行消失;其他功能也基本仿真成功。【源程序】1.文件名:piano_game.vhd功能:顶层模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity piano_game isport(clk_top:in std_logic;button_top: in std_logic_vector(7 downto 0); -按键输入信号reset_top : i
16、n std_logic;mode_top:in std_logic;row_top : out std_logic_vector(7 downto 0); -点阵行输出信号col_top : out std_logic_vector(7 downto 0); -点阵列输出信号figure_top: out std_logic_vector(6 downto 0); -数码管数值显示信号cats_top : out std_logic_vector(5 downto 0); -数码管接地信号out_top : out std_logic);end piano_game;architecture
17、behavier of piano_game is数字电路与逻辑设计实验报告component dianzhen is -点阵模块Port ( clk_dianzhen : in std_logic; button_dianzhen: in std_logic_vector(7 downto 0); row_dianzhen : out std_logic_vector(7 downto 0); col_dianzhen : out std_logic_vector(7 downto 0); call_dianzhen : out std_logic; freq_dianzhen : out
18、integer range 0 to 50000000; score_dianzhen : out integer range 0 to 30; stop_dianzhen : in std_logic;reset_dianzhen : in std_logic;yinfu_dianzhen: in integer range 0 to 8);end component;component scoretime is -计时计分模块Port ( clk_scoretime :in std_logic; -system clockreset_scoretime :in std_logic;add_
19、score:in integer range 0 to 30;stop_time:out std_logic;figure_scoretime: out std_logic_vector(6 downto 0); -count timecats_scoretime : out std_logic_vector(5 downto 0); end component; component speaker is -发声模块Port ( clk_speaker : in std_logic; freq_speaker : in integer range 0 to 50000000; call_spe
20、aker : in std_logic; out_speaker : out std_logic); end component; component tone is -出点模块Port ( clk_tone : in std_logic; reset_tone :in std_logic;stop_tone:in std_logic;mode_tone:in std_logic;yinfu:out integer range 0 to 7);end component;signal stop_top:std_logic;signal call_top:std_logic;signal fre
21、q_top : integer range 0 to 50000000; signal score_top:integer range 0 to 30;signal yinfu_top:integer range 0 to 8;-参量对应表数字电路与逻辑设计实验报告beginu1:dianzhen portmap(clk_dianzhen=clk_top,button_dianzhen=button_top,row_dianzhen=row_top, col_dianzhen=col_top,call_dianzhen=call_top,freq_dianzhen=freq_top,score
22、_dianzhen=score_top,stop_dianzhen=stop_top,reset_dianzhen=reset_top,yinfu_dianzhen=yinfu_top);u2:scoretime portmap(clk_scoretime=clk_top,reset_scoretime=reset_top,add_score=score_top,stop_time=stop_top,figure_scoretime=figure_top,cats_scoretime=cats_top);u4:speaker portmap(clk_speaker=clk_top,freq_s
23、peaker=freq_top,call_speaker=call_top,out_speaker=out_top);u5:tone portmap(clk_tone=clk_top,reset_tone=reset_top,stop_tone=stop_top,yinfu=yinfu_top,mode_tone=mode_top);end behavier;2.文件名:scoretime.vhd功能:计时计分模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UN
24、SIGNED.ALL;entity scoretime isPort ( clk_scoretime :in std_logic; -系统时钟reset_scoretime :in std_logic; -复位信号add_score:in integer range 0 to 30; -分数输入stop_time:out std_logic; -游戏结束信号figure_scoretime: out std_logic_vector(6 downto 0); -数码管数值输出cats_scoretime : out std_logic_vector(5 downto 0); -数码管接地输出e
25、nd scoretime;architecture behavier of scoretime issignal num_jishi:integer range 0 to 31:=30;数字电路与逻辑设计实验报告signal tmp:integer range 0 to 49999999;signal tmp1:integer range 0 to 2500;signal address: integer range 0 to 3; signal clk_tmp:std_logic;signal stop:std_logic:=0; -stop game signalbeginfenpin:p
26、rocess(clk_scoretime,reset_scoretime)beginif reset_scoretime=1 thentmp0) then数字电路与逻辑设计实验报告num_jishi case num_jishi iswhen 0= figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figur
27、e_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretimefigure_scoretimefigure_scoretimefigure_scoretimefigure_scoretimefigure_scoretimefigur
28、e_scoretimefigure_scoretimefigure_scoretimecats_scoretimecase num_jishi iswhen 0 = figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoret
29、ime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_
30、scoretimecats_scoretimecase add_score iswhen 0= figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoreti
31、me figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime cats_scoretimecase add_sc
32、ore iswhen 0= figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoreti
33、me figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime figure_scoretime cats_scoretimecoltmpcoltmpcoltmpcoltmpcoltmpcoltmpcoltmpcol
34、tmp row_dianzhen row_dianzhen row_dianzhen row_dianzhen row_dianzhen row_dianzhen row_dianzhen row_dianzhenfreq_dianzhenfreq_dianzhenfreq_dianzhenfreq_dianzhenfreq_dianzhenfreq_dianzhenfreq_dianzhenfreq_dianzhenyinfuyinfuyinfuyinfuyinfuyinfufyinfuyinfufyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyi
35、nfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfuyinfu=0;end case;end if; end process;end behavier;5.文件名:speaker.vhd功能:发声模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE
36、.STD_LOGIC_UNSIGNED.ALL;entity speaker isPort ( clk_speaker : in std_logic; -系统时钟freq_speaker : in integer range 0 to 50000000; -音符分频系数call_speaker : in std_logic; -按键检测信号out_speaker : out std_logic); -蜂鸣器发音信号end speaker;architecture piano4 of speaker issignal num0:std_logic:=0;begindivide_freq2:pro
37、cess(clk_speaker,freq_speaker) -此进程先对系统时钟进行 6 分频,再按照 tone1 输入的分频系数对 8MHz 的脉冲再次分频,得到所需要的音符频率,再进行 2 分频variable num2:integer range 0 to 6;数字电路与逻辑设计实验报告variable num1:integer range 0 to 50000000;beginif clk_speakerevent and clk_speaker=1 then num2:=num2+1; if num2=3 thenif num1freq_speaker then num1:=num
38、1+1;if num1=1 thennum0=not num0;end if;else num1:=0;end if;elsif num2=6 then num2:=0;end if; end if;end process;speakout:process(num0,call_speaker)beginif call_speaker=1 then -检测到按键即发音out_speaker=num0;else out_speaker=0; -若无按键则不发音end if;end process;end piano4;【元器件清单及资源利用情况】所用硬件:(1)计算机;(2)数字系统与逻辑实验开发
39、板(MAXII EPM1270T144C5)。开发板模块使用:(1)按键:代表钢琴的 17 个音的键;(2)拨码开关:选择随机或是按乐曲出点,复位;(3)数码管:显示 30 秒倒计时,显示分数;(4)点阵:出点下落;(6)蜂鸣器:发音。所用软件:Altera Quartus II各引脚接口如下:数字电路与逻辑设计实验报告【故障及问题分析】在实验过程中,我遇到了如下问题,经过查资料、独立思考与研究讨论,最终使得问题得到了解决:1.点阵扫描与预期不符我在点阵扫描上遇到过三个问题:第一个是扫描频率设置不合理,使得扫频太慢,一列一列输出;第二个是输出效果反向,亮灯位置与不亮灯位置恰好相反;第三个是点阵
40、输出亮度太浅,几乎看不见。通过分析,我总结出如下原因:扫描频率应设置在 1MHz 左右;由于开发板的不同,按行赋值为 0、按列赋值为 1 才会点亮其中一个点;点阵按列扫描会使得仅第一列亮度最亮,应该按行扫描才会使每个点的亮度一样亮。于是,我做了调整,使得点阵达到了输出效果。2、按键输出有噪声问题当一开始运行输出模块时,发现当按下一个键后会随机产生噪音,即有时候噪音出现、有时候无噪音,且噪音的频率不确定。经过分析与讨论,得到结论是按键与时钟不同步,使得按键归零时没有被时钟沿检测到,从而继续输出。于是我在输出进程里的时钟边沿条件下加入了检测按键是否按下(call_speaker=1)再进行输出的逻
41、辑,使得问题得到了解决。数字电路与逻辑设计实验报告3、分频计算问题 由于不同音调的音频率不一样,因而需要为各个音调进行不同分频,但若一个一个音来分频会使得程序十分复杂,于是我通过观察每个音调的理论频率发现,可以为每个音调赋以一个特定值,这个值作为分频的基数统一传递给分频模块,而分频模块只需接收此信号即可,不必考虑它的具体值。这也使得我想到要将发音模块单独分出来,这样只要为不同的音调传递不同的信号就可以很好地实现分频输出了。 4、分模块设计各接口映射重复问题一开始在设计分模块架构时是将计时和计分模块分割开的,但是在和在一起的时候才发现,计时和计分都要用到数码管,而开发版上的数码管是接在一起的,如
42、果两个文件都作为输出,则无法同时输出给数码管。于是,我将两个文件和在一起,用同一个扫描信号进行扫描,使得数码管能分别显示计时和计分,而互不干扰。5.按键防抖问题开始调试时,发现计分的值变动十分不稳定,有时候,按一次键就会加很多分,我分析认为是因为按键没有防抖的原因,于是开始尝试使用老师给的按键防抖代码,但是也一直没有尝试成功,后来,我在按键检测加分的代码中加了一个 0.2s 的时钟沿,发现按键可以正常检测并加分了。【总结与结论】本次数电综合实验,我基本完成了钢琴游戏的功能,并进行了一部分的改进,将在一列任意位置都可以消点改为仅能在最后一行消点,增加了游戏的难度,使得游戏更加好玩。同时,在随机出
43、点的模式之外,添加了按照歌曲顺序出点的模式。这次实验的过程很坎坷,不过我也因此而收获了很多。首先,通过这次数字电路设计实验,我感受到了硬件编程与软件编程的巨大差异。硬件编程强调模块和状态,它不像软件编程那样面向过程或对象,而是面向状态和模块,随意所以在实现之前应该仔细的分析系统的功能,按照功能分出合理的模块,画出对应的流程图,模块关系图以及状态图后,再开始编程设计,这样可以节省很多时间和精力,使得系统的而实现更顺利。比如,我在初始设计时,就没有搞清楚数码管的使用,而把计时和计分模块分开设计,最后发现无法同时显示,才从新把两个模块结合在一起。其次,在实践 VHDL 语言编程的过程中,我对 Qua
44、rtus II 的运用更加熟练了,对硬件编程逻辑及其调试都有了进一步认识,让我对编程本身的理解得到了升华。最深刻的一个错误是,我曾经误以为 process 类似于高级语言的函数,后来在编译中,发生了很多 process的并发的问题,比如同一个信号不能在不同的进程里赋值,还有一个进程里不能有两个时钟沿等。后来,我经过学习才知道,process 是并行的,所以才会发生以上的错误。还有,在不断调试开发板的过程中,我对数字系统结构也有了更进一步的了解和认识,认识到在一个开发板中存在着许多重要的模块,如时钟模块、数码管模块、点阵模块、蜂鸣器模块等,它们都各自实现着不同的功能,但都由芯片统一控制,这让我再
45、一次对数字电路与微机原理这些理论课学习的知识得到了求证与更深入的理解。最后,在整个设计过程中,我遇到了许多问题,也曾一度十分困惑,并陷入瓶颈,但是我始终没有选择放弃,我认为只要是自己经过思考努力,无论是否能最终最做出来理想的效果,我都会因此而收获。我也因此而明白了坚持的重要。虽然,最后我的这个系统并没有很多的扩展,但是,我想说,这些都是我经过很多次的调试思考做出来的,我无愧与这次实验和自己的努力!感谢老师在数字电路与逻辑设计这门课上对我们的指导,我们学到了很多,并且很多人都对硬件开发产生了兴趣,例如我希望能有机会用本实验开发板模拟混沌系统,对混沌数字电路与逻辑设计实验报告系统的输出(倍周期分叉、单吸引子等现象)进行求证,这将考验我综合运用所学知识的能力,但我喜欢这样的挑战。最后,谢谢老师指导与关心以及同学们的帮助!