1、verilog乒乓球大作业仿真成功-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KIIverilog乒乓球大作业(仿真成功)一 任务描述1 设计要求左、右双方各持一按键作为“球拍”,实验板上一行8只发光二极管为乒乓球台,其中那只发光的发光二极管代表乒乓球所在位置。设计如图1所示的乒乓球游戏实物图的模拟控制器。发球方最后一位LED点亮,按下键表示发球,亮的灯依次向对方移动,当到达对方最后一位时0.5s内对方必须按下按键表示接球,接球后LED灯向对方移动,否则输球。接球时,LED没有亮到最后一位时就按下接球按键为犯规。输球或者犯规,对方加1分,率先加到1
2、1分者游戏胜出这一局。2设计思路考虑到游戏的复杂度,采用状态机来实现这些模式转换。用到8个状态,如下所示:状态功能S0复位状态,也是判断发球权的状态S1甲方发球S2球从甲方向乙方右移,若此时乙方接球就给甲方加一分,并将球权给甲方S3开始判断乙方是否在0.5S内接球S4乙方发球S5球从乙方向甲方左移,若此时甲方接球就给乙方加一分,并将球权给乙方S6开始判断甲方是否在0.5S内接球S7用于接球后判断发球程序还加入了蜂鸣、用数码管显示分数和发球权等功能。二 结构框图1 状态转移图K_a=1led8s=8b01000000led8s=8b00000010K_b=1K_a=1K_b=1K_b=1K_a=
3、1S7S6S3S1S5S2S4S02 程序流程图3 系统模块三 系统程序module pingpangok(state,clk2hz,rst,k_a,k_b,led8s,led7s1,led7s2,led7s3,led7s4,led7s5,speaker);/clk2hz指一个2Hz的时钟输入, rst异步复位, k_a和k_b是比赛双方按键, speaker是蜂鸣器/led8s是一排8个发光二极管代表球场, led7s14是4个显示分数的数码管, led7s5是显示发球权的数码管input clk2hz,rst,k_a,k_b;output 7:0 led8s;output 6:0 led7
4、s1,led7s2,led7s3,led7s4,led7s5;output speaker;output 2:0 state;reg 7:0 led8s;reg 6:0 led7s1,led7s2,led7s3,led7s4,led7s5;reg 3:0 score_a,score_b;reg 2:0 state;reg speaker;parameter s0=3b000,/复位状态,也是判断发球权的状态; s1=3b001,/甲方发球; s2=3b010,/球从甲方向乙方右移,若此时乙方接球就给甲方加一分,并将球权给甲方; s3=3b011,/开始判断乙方是否在0.5S内接球; s4=3b
5、100,/乙方发球; s5=3b101,/球从乙方向甲方左移,若此时甲方接球就给乙方加一分,并将球权给乙方; s6=3b110;/开始判断甲方是否在0.5S内接球; s7=3b111;/用于判断接球后发球;/-游戏逻辑控制核心-always (posedge clk2hz) begin case(state) s7: begin if(k_a) state=s1; /甲发球; else if(k_b) state=s4;/乙发球; else if(speaker) speaker=1b0; else speaker=1b0; end s0: begin led7s5=7b0111111;/第五
6、个数码管显示数字0,表示发球权可以开始判断了; led8s=7b00000000; score_a=0; score_b=0;/给甲乙双方的分数复位; if(k_a) begin speaker=1b1;/因为按键k_a要持续按着保持高电位1,蜂鸣器鸣叫是提示可以松手了; state=s7; end else if(k_b) begin speaker=1b1; state=s7; end else state=s0; end s1: begin led7s5=7b0000110;/第五个数码管显示数字1,表示发球权现在是甲方的; if(led8s=8b00000000) led8s=8b10
7、000000;/点亮的灯出现在最右边,即甲方发球; state=s2; if(speaker) speaker=1b0;/将刚才鸣叫的蜂鸣器关闭; end s2: begin if(led8s=8b00000010) begin led8s1; state=s3;/进入判断乙方接球的状态; end else begin led8s1; state=s7; end if(k_b) begin score_a=score_a+1; speaker=1b1;/若在此期间乙方抢先按键,就判断乙方输,给甲方加1分,并让蜂鸣器鸣叫; state=s7; led8s=8b00000000; end end
8、s3: begin if(k_b) begin state=s7;/乙方接球成功,并进入乙方发球的s7状态; led8s=8b00000000; end else begin score_a=score_a+1; speaker=1b1; state=s7;/乙方接球不成功,则甲方加一分,并进入甲方发球的s7状态,蜂鸣器鸣叫; led8s=8b00000000; end end s4: begin led7s5=7b1011011;/第五个数码管显示数字2,表示发球权现在是乙方的; if(led8s=8b00000000) led8s=8b00000001;/点亮的灯出现在最左边,即乙方发球;
9、 state=s5; if(speaker) speaker=1b0;/将刚才鸣叫的蜂鸣器关闭; end s5: begin if(led8s=8b01000000) begin led8s=led8s1; state=s6;/进入判断甲方接球的状态; end else begin led8s=led8s1; state=s7; end if(k_a) begin score_b=score_b+1; speaker=1b1;/若在此期间甲方抢先按键,就判断甲方输,给乙方加1分,并让蜂鸣器鸣叫; state=s7; led8s=8b00000000; end end s6: begin if(
10、k_a) begin state=s7;/甲方接球成功,并进入甲方发球的s7状态; led8s=8b00000000; end else begin score_b=score_b+1; speaker=1b1; state=s7;/甲方接球不成功,则乙方加一分,并进入乙方发球的s7状态,蜂鸣器鸣叫; led8s=8b00000000; end end default: state=s0; endcase/-甲乙双方的分数各用2个数码管显示- if(score_a=11 & score_b=11) begin score_a=0; score_b=0;/如果任一方得11分,一局结束,计分清零;
11、 end case(score_a) 8b0000: begin led7s1=7b0111111; led7s2=7b0111111;/数码管显示0分; end 8b0001: begin led7s1=7b0111111; led7s2=7b0000110;/数码管显示1分; end 8b0010: begin led7s1=7b0111111; led7s2=7b1011011;/数码管显示2分; end 8b0011: begin led7s1=7b0111111; led7s2=7b1001111;/数码管显示3分; end 8b0100: begin led7s1=7b011111
12、1; led7s2=7b1100110;/数码管显示4分; end 8b0101: begin led7s1=7b0111111; led7s2=7b1101101;/数码管显示5分; end 8b0110: begin led7s1=7b0111111; led7s2=7b1111101;/数码管显示6分; end 8b0111: begin led7s1=7b0111111; led7s2=7b0000111;/数码管显示7分; end 8b1000: begin led7s1=7b0111111; led7s2=7b1111111;/数码管显示8分; end 8b1001: begin
13、led7s1=7b0111111; led7s2=7b1101111;/数码管显示9分; end 8b1010: begin led7s1=7b0000110; led7s2=7b0111111;/数码管显示10分; end 8b1011: begin led7s1=7b0000110; led7s2=7b0000110;/数码管显示11分; end default: begin led7s1=7b0111111; led7s2=7b0111111;/数码管显示0分; end endcase case(score_b) 8b0000: begin led7s3=7b0111111; led7s
14、4=7b0111111;/数码管显示0分; end 8b0001: begin led7s3=7b0111111; led7s4=7b0000110;/数码管显示1分; end 8b0010: begin led7s3=7b0111111; led7s4=7b1011011;/数码管显示2分; end 8b0011: begin led7s3=7b0111111; led7s4=7b1001111;/数码管显示3分; end 8b0100: begin led7s3=7b0111111; led7s4=7b1100110;/数码管显示4分; end 8b0101: begin led7s3=7
15、b0111111; led7s4=7b1101101;/数码管显示5分; end 8b0110: begin led7s3=7b0111111; led7s4=7b1111101;/数码管显示6分; end 8b0111: begin led7s3=7b0111111; led7s4=7b0000111;/数码管显示7分; end 8b1000: begin led7s3=7b0111111; led7s4=7b1111111;/数码管显示8分; end 8b1001: begin led7s3=7b0111111; led7s4=7b1101111;/数码管显示9分; end 8b1010:
16、 begin led7s3=7b0000110; led7s4=7b0111111;/数码管显示10分; end 8b1011: begin led7s3=7b0000110; led7s4=7b0000110;/数码管显示11分; end default: begin led7s3=7b0111111; led7s4=7b0111111;/数码管显示0分; end endcase endendmodule四 仿真结果功能仿真是最基本的仿真验证,它只能仿真设计中的逻辑功能。通过功能仿真,可以验证整个系统的逻辑功能是否正确。用户可以通过观看仿真的波形来对系统的逻辑功能进行分析,并可以以此为依据,
17、对设计进行必要的修改和完善。由于本系统的状态情况较为复杂,下面就几种典型的情况进行系统的综合和仿真:A发球B未接球A发球B接球A发球B接球B再发球B发球A未接球B发球A接球B发球A接球B再发球五 总结通过这次大作业的练习,我对EDA有了更加深入的理解,对用Verilog语言设计程序不再感到陌生。我对设计要求进行了仔细的分析,对设计算法不断地进行优化,对程序反复地进行调试,这在很大程度上锻炼了我解决问题的能力。另外,通过这次课程设计我的Verilog编程能力得到了很大的提高,同时熟练掌握了Quartus这个EDA软件。总之,这次课程设计让我受益匪浅,最后非常感谢宋万杰老师平时给予我们的帮助和指导。给宋老师的意见:希望宋老师以后能将实验课平均分配给每一周,一次90分钟就好,这样我们可以及时复习每节课所学习的知识,还有助于我们消化吸收所学的知识。谢谢。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1