您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 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状态转移图S0S6S3S5S7S4S2S1K_a=1K_b=1K_a=1led8s==8'b01000000K_b=1led8s==8'b00000010K_a=1K_b=12程序流程图开始初始化程序用户1发球(key1按下)移动数码管用户2接球(key2按下)蜂鸣器响,数码管反向移动Yes用户1接球(key1按下)蜂鸣器响,数码管反向移动用户2接球(key2按下)蜂鸣器响,数码管反向移动用户1接球(key1按下)蜂鸣器响,数码管反向移动YesYesYesNo用户2数码管加1用户1数码管加1No用户2数码管加1用户1数码管加1NoNo3系统模块三系统程序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)begincase(state)s7:beginif(k_a)state=s1;//甲发球;elseif(k_b)state=s4;//乙发球;elseif(speaker)speaker=1'b0;elsespeaker=1'b0;ends0:beginled7s5=7'b0111111;//第五个数码管显示数字0,表示发球权可以开始判断了;led8s=7'b00000000;score_a=0;score_b=0;//给甲乙双方的分数复位;if(k_a)beginspeaker=1'b1;//因为按键k_a要持续按着保持高电位'1',蜂鸣器鸣叫是提示可以松手了;state=s7;endelseif(k_b)beginspeaker=1'b1;state=s7;endelsestate=s0;ends1:beginled7s5=7'b0000110;//第五个数码管显示数字1,表示发球权现在是甲方的;if(led8s==8'b00000000)led8s=8'b10000000;//点亮的灯出现在最右边,即甲方发球;state=s2;if(speaker)speaker=1'b0;//将刚才鸣叫的蜂鸣器关闭;ends2:beginif(led8s==8'b00000010)beginled8s=led8s1;state=s3;//进入判断乙方接球的状态;endelsebeginled8s=led8s1;state=s7;endif(k_b)beginscore_a=score_a+1;speaker=1'b1;//若在此期间乙方抢先按键,就判断乙方输,给甲方加1分,并让蜂鸣器鸣叫;state=s7;led8s=8'b00000000;endends3:beginif(k_b)beginstate=s7;//乙方接球成功,并进入乙方发球的s7状态;led8s=8'b00000000;endelsebeginscore_a=score_a+1;speaker=1'b1;state=s7;//乙方接球不成功,则甲方加一分,并进入甲方发球的s7状态,蜂鸣器鸣叫;led8s=8'b00000000;endends4:beginled7s5=7'b1011011;//第五个数码管显示数字2,表示发球权现在是乙方的;if(led8s==8'b00000000)led8s=8'b00000001;//点亮的灯出现在最左边,即乙方发球;state=s5;if(speaker)speaker=1'b0;//将刚才鸣叫的蜂鸣器关闭;ends5:beginif(led8s==8'b01000000)beginled8s=led8s1;state=s6;//进入判断甲方接球的状态;endelsebeginled8s=led8s1;state=s7;endif(k_a)beginscore_b=score_b+1;speaker=1'b1;//若在此期间甲方抢先按键,就判断甲方输,给乙方加1分,并让蜂鸣器鸣叫;state=s7;led8s=8'b00000000;endends6:beginif(k_a)beginstate=s7;//甲方接球成功,并进入甲方发球的s7状态;led8s=8'b00000000;endelsebeginscore_b=score_b+1;speaker=1'b1;state=s7;//甲方接球不成功,则乙方加一分,并进入乙方发球的s7状态,蜂鸣器鸣叫;led8s=8'b00000000;endenddefault:state=s0;endcase//----------甲乙双方的分数各用2个数码管显示-----------------------------------------------------------------if(score_a==11&score_b==11)beginscore_a=0;score_b=0;//如果任一方得11分,一局结束,计分清零;endcase(score_a)8'b0000:beginled7s1=7'b0111111;led7s2=7'b0111111;//数码管显示0分;end8'b0001:beginled7s1=7'b0111111;led7s2=7'b0000110;//数码管显示1分;end8'b0010:beginled7s1=7'b0111111;led7s2=7'b1011011;//数码管显示2分;end8'b0011:beginled7s1=7'b0111111;led7s2=7'b1001111;//数码管显示3分;end8'b0100:beginled7s1=7'b0111111;led7s2=7'b1100110;//数码管显示4分;end8'b0101:beginled7s1=7'b0111111;led7s2=7'b1101101;//数码管显示5分;end8'b0110:beginled7s1=7'b0111111;led7s2=7'b1111101;//数码管显示6分;end8'b0111:beginled7s1=7'b0111111;led7s2=7'b0000111;//数码管显示7分;end8'b1000:beginled7s1=7'b0111111;led7s2=7'b1111111;//数码管显示8分;end8'b1001:beginled7s1=7'b0111111;led7s2=7'b1101111;//数码管显示9分;end8'b1010:beginled7s1=7'b0000110;led7s2=7'b0111111;//数码管显示10分;end8'b1011:beginled7s1=7'b0000110;led7s2=7'b0000110;//数码管显示11分;enddefault:beginled7s1=7'b0111111;led7s2=7'b0111111;//数码管显示0分;endendcasecase(score_b)8'b0000:beginled7s3=7'b0111111;led7s4=7'b0111111;//数码管显示0分;end8'b0001:beginled7s3=7'b0111111;led7s4=7'b0000110;//数码管显示1分;end8'b0010:beginled7s3=7'b0111111;led7s4=7'b1011011;//数码管显示2分;end8'b0011:beginled7s3=7'b0111111;led7s4=7'b1001111;//数码管显示3分;end8'b0100:beginled7s3=7'b0111111;led7s4=7'b1100110;//数码管显示4分;end8'b0101:beginled7s3=7'b0111111;led7s4=7'b1101101;//数码管显示5分;end8'b0110:beginled7s3=7'b0111111;led7s4=7'b1111101;//数码管显示6分;end8'b0111:beginled7s3=7'b0111111;led7s4=7'b0000111;//数码管显示7分;end8'b1000:beginled7s3=7'b0111111;led7s4=7'b1111111;//数码管显示8分;end8'b1001:beginled7s3=7'b0111111;led7s4=7'b1101111;//数码管显示9分;end8'b1010:beginled7s3=7'b0000110;led7s4=7'b0111111;//数码管显示10分;end8'b1011:beginled7s3=7'b0000110;led7s4=7'b0000110;//数码管显示11分;enddefault:beginled7s3=7'b0111111;led7s4=7'b0111111;//数码管显示0分;endendcaseendendmodule四仿真结果功能仿真是最基本的仿真验证,它只能仿真设计中的逻辑
本文标题:verilog乒乓球大作业(仿真成功)
链接地址:https://www.777doc.com/doc-6737663 .html