verilog乒乓球大作业仿真成功.docx

上传人:b****3 文档编号:3947078 上传时间:2022-11-26 格式:DOCX 页数:18 大小:648.89KB
下载 相关 举报
verilog乒乓球大作业仿真成功.docx_第1页
第1页 / 共18页
verilog乒乓球大作业仿真成功.docx_第2页
第2页 / 共18页
verilog乒乓球大作业仿真成功.docx_第3页
第3页 / 共18页
verilog乒乓球大作业仿真成功.docx_第4页
第4页 / 共18页
verilog乒乓球大作业仿真成功.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

verilog乒乓球大作业仿真成功.docx

《verilog乒乓球大作业仿真成功.docx》由会员分享,可在线阅读,更多相关《verilog乒乓球大作业仿真成功.docx(18页珍藏版)》请在冰豆网上搜索。

verilog乒乓球大作业仿真成功.docx

verilog乒乓球大作业仿真成功

-标准化文件发布号:

(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

 

verilog乒乓球大作业(仿真成功)

一任务描述

1设计要求

左、右双方各持一按键作为“球拍”,实验板上一行8只发光二极管为乒乓球台,其中那只发光的发光二极管代表乒乓球所在位置。

设计如图1所示的乒乓球游戏实物图的模拟控制器。

发球方最后一位LED点亮,按下键表示发球,亮的灯依次向对方移动,当到达对方最后一位时0.5s内对方必须按下按键表示接球,接球后LED灯向对方移动,否则输球。

接球时,LED没有亮到最后一位时就按下接球按键为犯规。

输球或者犯规,对方加1分,率先加到11分者游戏胜出这一局。

2设计思路

考虑到游戏的复杂度,采用状态机来实现这些模式转换。

用到8个状态,如下所示:

状态

功能

S0

复位状态,也是判断发球权的状态

S1

甲方发球

S2

球从甲方向乙方右移,若此时乙方接球就给甲方加一分,并将球权给甲方

S3

开始判断乙方是否在0.5S内接球

S4

乙方发球

S5

球从乙方向甲方左移,若此时甲方接球就给乙方加一分,并将球权给乙方

S6

开始判断甲方是否在0.5S内接球

S7

用于接球后判断发球

程序还加入了蜂鸣、用数码管显示分数和发球权等功能。

 

二结构框图

1状态转移图

K_a=1

led8s==8'b01000000

led8s==8'b00000010

K_b=1

K_a=1

K_b=1

K_b=1

K_a=1

S7

S6

S3

S1

S5

S2

S4

S0

2程序流程图

3系统模块

三系统程序

modulepingpangok(state,clk2hz,rst,k_a,k_b,led8s,led7s1,led7s2,led7s3,led7s4,led7s5,speaker);

//clk2hz指一个2Hz的时钟输入,rst异步复位,k_a和k_b是比赛双方按键,speaker是蜂鸣器

//led8s是一排8个发光二极管代表球场,led7s1~4是4个显示分数的数码管,led7s5是显示发球权的数码管

inputclk2hz,rst,k_a,k_b;

output[7:

0]led8s;

output[6:

0]led7s1,led7s2,led7s3,led7s4,led7s5;

outputspeaker;

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;

regspeaker;

parameters0=3'b000,//复位状态,也是判断发球权的状态;

s1=3'b001,//甲方发球;

s2=3'b010,//球从甲方向乙方右移,若此时乙方接球就给甲方加一分,并将球权给甲方;

s3=3'b011,//开始判断乙方是否在0.5S内接球;

s4=3'b100,//乙方发球;

s5=3'b101,//球从乙方向甲方左移,若此时甲方接球就给乙方加一分,并将球权给乙方;

s6=3'b110;//开始判断甲方是否在0.5S内接球;

s7=3'b111;//用于判断接球后发球;

//----------------游戏逻辑控制核心----------------------------------------------------------------------------

always@(posedgeclk2hz)begin

case(state)

s7:

begin

if(k_a)

state<=s1;//甲发球;

elseif(k_b)

state<=s4;//乙发球;

elseif(speaker)

speaker=1'b0;

else

speaker=1'b0;

end

s0:

begin

led7s5<=7'b0111111;//第五个数码管显示数字0,表示发球权可以开始判断了;

led8s<=7'b00000000;

score_a<=0;

score_b<=0;//给甲乙双方的分数复位;

if(k_a)

begin

speaker<=1'b1;//因为按键k_a要持续按着保持高电位'1',蜂鸣器鸣叫是提示可以松手了;

state<=s7;

end

elseif(k_b)

begin

speaker<=1'b1;

state<=s7;

end

else

state<=s0;

end

s1:

begin

led7s5<=7'b0000110;//第五个数码管显示数字1,表示发球权现在是甲方的;

if(led8s==8'b00000000)

led8s<=8'b10000000;//点亮的灯出现在最右边,即甲方发球;

state<=s2;

if(speaker)

speaker<=1'b0;//将刚才鸣叫的蜂鸣器关闭;

end

s2:

begin

if(led8s==8'b00000010)

begin

led8s<=led8s>>1;

state<=s3;//进入判断乙方接球的状态;

end

else

begin

led8s<=led8s>>1;

state<=s7;

end

if(k_b)

begin

score_a<=score_a+1;

speaker<=1'b1;//若在此期间乙方抢先按键,就判断乙方输,给甲方加1分,并让蜂鸣器鸣叫;

state<=s7;

led8s<=8'b00000000;

end

end

s3:

begin

if(k_b)

begin

state<=s7;//乙方接球成功,并进入乙方发球的s7状态;

led8s<=8'b00000000;

end

else

begin

score_a<=score_a+1;

speaker<=1'b1;

state<=s7;//乙方接球不成功,则甲方加一分,并进入甲方发球的s7状态,蜂鸣器鸣叫;

led8s<=8'b00000000;

end

end

s4:

begin

led7s5<=7'b1011011;//第五个数码管显示数字2,表示发球权现在是乙方的;

if(led8s==8'b00000000)

led8s<=8'b00000001;//点亮的灯出现在最左边,即乙方发球;

state<=s5;

if(speaker)

speaker<=1'b0;//将刚才鸣叫的蜂鸣器关闭;

end

s5:

begin

if(led8s==8'b01000000)

begin

led8s<=led8s<<1;

state<=s6;//进入判断甲方接球的状态;

end

else

begin

led8s<=led8s<<1;

state<=s7;

end

if(k_a)

begin

score_b<=score_b+1;

speaker<=1'b1;//若在此期间甲方抢先按键,就判断甲方输,给乙方加1分,并让蜂鸣器鸣叫;

state<=s7;

led8s<=8'b00000000;

end

end

s6:

begin

if(k_a)

begin

state<=s7;//甲方接球成功,并进入甲方发球的s7状态;

led8s<=8'b00000000;

end

else

begin

score_b<=score_b+1;

speaker<=1'b1;

state<=s7;//甲方接球不成功,则乙方加一分,并进入乙方发球的s7状态,蜂鸣器鸣叫;

led8s<=8'b00000000;

end

end

default:

state<=s0;

endcase

//----------甲乙双方的分数各用2个数码管显示-----------------------------------------------------------------

if(score_a==11&score_b==11)

begin

score_a<=0;

score_b<=0;//如果任一方得11分,一局结束,计分清零;

end

case(score_a)

8'b0000:

begin

led7s1<=7'b0111111;

led7s2<=7'b0111111;//数码管显示0分;

end

8'b0001:

begin

led7s1<=7'b0111111;

led7s2<=7'b0000110;//数码管显示1分;

end

8'b0010:

begin

led7s1<=7'b0111111;

led7s2<=7'b1011011;//数码管显示2分;

end

8'b0011:

begin

led7s1<=7'b0111111;

led7s2<=7'b1001111;//数码管显示3分;

end

8'b0100:

begin

led7s1<=7'b0111111;

led7s2<=7'b1100110;//数码管显示4分;

end

8'b0101:

begin

led7s1<=7'b0111111;

led7s2<=7'b1101101;//数码管显示5分;

end

8'b0110:

begin

led7s1<=7'b0111111;

led7s2<=7'b1111101;//数码管显示6分;

end

8'b0111:

begin

led7s1<=7'b0111111;

led7s2<=7'b0000111;//数码管显示7分;

end

8'b1000:

begin

led7s1<=7'b0111111;

led7s2<=7'b1111111;//数码管显示8分;

end

8'b1001:

begin

led7s1<=7'b0111111;

led7s2<=7'b1101111;//数码管显示9分;

end

8'b1010:

begin

led7s1<=7'b0000110;

led7s2<=7'b0111111;//数码管显示10分;

end

8'b1011:

begin

led7s1<=7'b0000110;

led7s2<=7'b0000110;//数码管显示11分;

end

default:

begin

led7s1<=7'b0111111;

led7s2<=7'b0111111;//数码管显示0分;

end

endcase

case(score_b)

8'b0000:

begin

led7s3<=7'b0111111;

led7s4<=7'b0111111;//数码管显示0分;

end

8'b0001:

begin

led7s3<=7'b0111111;

led7s4<=7'b0000110;//数码管显示1分;

end

8'b0010:

begin

led7s3<=7'b0111111;

led7s4<=7'b1011011;//数码管显示2分;

end

8'b0011:

begin

led7s3<=7'b0111111;

led7s4<=7'b1001111;//数码管显示3分;

end

8'b0100:

begin

led7s3<=7'b0111111;

led7s4<=7'b1100110;//数码管显示4分;

end

8'b0101:

begin

led7s3<=7'b0111111;

led7s4<=7'b1101101;//数码管显示5分;

end

8'b0110:

begin

led7s3<=7'b0111111;

led7s4<=7'b1111101;//数码管显示6分;

end

8'b0111:

begin

led7s3<=7'b0111111;

led7s4<=7'b0000111;//数码管显示7分;

end

8'b1000:

begin

led7s3<=7'b0111111;

led7s4<=7'b1111111;//数码管显示8分;

end

8'b1001:

begin

led7s3<=7'b0111111;

led7s4<=7'b1101111;//数码管显示9分;

end

8'b1010:

begin

led7s3<=7'b0000110;

led7s4<=7'b0111111;//数码管显示10分;

end

8'b1011:

begin

led7s3<=7'b0000110;

led7s4<=7'b0000110;//数码管显示11分;

end

default:

begin

led7s3<=7'b0111111;

led7s4<=7'b0111111;//数码管显示0分;

end

endcase

end

endmodule

四仿真结果

功能仿真是最基本的仿真验证,它只能仿真设计中的逻辑功能。

通过功能仿真,可以验证整个系统的逻辑功能是否正确。

用户可以通过观看仿真的波形来对系统的逻辑功能进行分析,并可以以此为依据,对设计进行必要的修改和完善。

由于本系统的状态情况较为复杂,下面就几种典型的情况进行系统的综合和仿真:

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