基于某Verilog地乒乓球游戏电路设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大学
EDA课程设计
:
学号:
班级:
专业:
学院:
目录
0 引言............................................................................................................................. - 1 -
1 设计要求..................................................................................................................... -
2 -
2 设计思路..................................................................................................................... - 2 -
3 Verilog程序 ................................................................................................................ - 3 -
4 功能仿真..................................................................................................................... - 3 -
5 总结........................................................................................................................... - 11 -致...............................................................................................................................- 11 -参考文献.......................................................................................................................- 11 -
基于Verilog的乒乓球游戏电路设计
0 引言
可编程器件的广泛应用,为数字系统的设计带来了极大的灵活性。
可编程器件可以通过软件编程对硬件的结构和工作方式进行重构,使得硬件的设计可以如同软件设计那样快捷方便。
高速发展的FPGA、CPLD兼有串、并行工作方式和高速、高可靠性的特点,在电子系统设计中得到了广泛应用。
通常使用硬件描述语言(Hardware Description Language,HDL)进行数字电子系统设计。
目前应用广泛的硬件描述语言有:VHDL语言,Verilog HDL语言,AHDL语言。
Verilog语言由于具有强大的行为描述能力和丰富的仿真语句从而成为系统设计领域最佳的硬件描述语言。
鉴于如上所述,本系统使用Verilog语言进行设计,采用自上向下的设计方法。
利用Quartus II 6.0 进行Verilog程序的编译与综合,然后用Modelism SE 6.0进行功能仿真和时序仿真,并使用GW48系列SOPC/EDA实验开发系统进行下载验证。
1 设计要求
图1 乒乓球游戏实物图
设计如图1所示的乒乓球游戏实物图的模拟控制器。
发球方最后一位LED点亮,按下键表示发球,亮的灯依次向对方移动,当到达对方最后一位时0.5s对方必须按下按键表示接球,接球后LED灯向对方移动,否则输球。
接球时,LED没有亮到最后一位时就按下接球按键为犯规。
输球或者犯规,对方加1分,率先加到11分者游戏胜出这一局。
2 设计思路
考虑到游戏的复杂度,采用状态机来实现这些模式转换。
用到6个状态,如表1所示:
状态功能
S0 复位状态,也是判断发球权的状态
S1 甲方发球
S2 球从甲方向乙方右移,若此时乙方接球就给甲
方加一分,并将球权给甲方
S3 开始判断乙方是否在0.5S接球
S4 乙方发球
S5 球从乙方向甲方左移,若此时甲方接球就给乙
方加一分,并将球权给乙方
表1 状态介绍
为了美化设计,加入了蜂鸣、用数码管显示分数和发球权等功能。
3 Verilog程序
module
pingpangok(state,nextstate,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是显示发球权的数码管
input clk2hz,rst,k_a,k_b;
output [7:0] led8s;
output [6:0] led7s1,led7s2,led7s3,led7s4,led7s5;
output speaker;
output [2:0] state,nextstate;
reg [7:0] led8s;
reg [6:0] led7s1,led7s2,led7s3,led7s4,led7s5;
reg [3:0] score_a,score_b;
reg [2:0] state,nextstate;
reg speaker;
parameter s0=3'b000,//复位状态,也是判断发球权的状态;
s1=3'b001,//甲方发球;
s2=3'b010,//球从甲方向乙方右移,若此时乙方接球就给甲方加一分,并将球权给甲方;
s3=3'b011,//开始判断乙方是否在0.5S接球;
s4=3'b100,//乙方发球;
s5=3'b101,//球从乙方向甲方左移,若此时甲方接球就给乙方加一分,并将球权给乙方;
s6=3'b110;//开始判断甲方是否在0.5S接球;
//----------进程块1:状态交换--------------------------------------------------------------------------------------always (posedge clk2hz or posedge rst)
begin
if(rst)
state<=s0;//rst上升沿复位
else
state<=nextstate;
end
//----------进程块2:游戏逻辑控制核心----------------------------------------------------------------------------always (state or k_a or k_b or score_a or score_b)
begin
case(state)
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',蜂鸣器鸣叫是提示可以松手了;
nextstate<=s1;
end
else if(k_b)
begin
speaker<=1'b1;
nextstate<=s4;
end
else
nextstate<=s0;
end
s1: begin
led7s5<=7'b0000110;//第五个数码管显示数字1,表示发球权现在是甲方的;
if(led8s==8'b00000000)
led8s<=8'b10000000;//点亮的灯出现在最右边,即甲方发球;
nextstate<=s2;
if(speaker)
speaker<=1'b0;//将刚才鸣叫的蜂鸣器关闭;
end
s2: begin
if(led8s==8'b00000010)
begin
led8s<=led8s>>1;
nextstate<=s3;//进入判断乙方接球的状态;
else
begin
led8s<=led8s>>1;
nextstate<=s1;
end
if(k_b)
begin
score_a<=score_a+1;
speaker<=1'b1;//若在此期间乙方抢先按键,就判断乙方输,给甲方加1分,并让蜂鸣器鸣叫;
nextstate<=s1;
led8s<=8'b00000000;
end
end
s3: begin
if(k_b)
begin
nextstate<=s4;//乙方接球成功,并进入乙方发球的s4状态;
led8s<=8'b00000000;
end
else
begin
score_a<=score_a+1;
speaker<=1'b1;
nextstate<=s1;//乙方接球不成功,则甲方加一分,并进入甲方发球的s1状态,蜂鸣器鸣叫;
led8s<=8'b00000000;
end
end
s4: begin
led7s5<=7'b1011011;//第五个数码管显示数字2,表示发球权现在是乙方的;
if(led8s==8'b00000000)
led8s<=8'b00000001;//点亮的灯出现在最左边,即乙方发球;
nextstate<=s5;
if(speaker)
speaker<=1'b0;//将刚才鸣叫的蜂鸣器关闭;
end
s5: begin
if(led8s==8'b01000000)
led8s<=led8s<<1;
nextstate<=s6;//进入判断甲方接球的状态;
end
else
begin
led8s<=led8s<<1;
nextstate<=s4;
end
if(k_a)
begin
score_b<=score_b+1;
speaker<=1'b1;//若在此期间甲方抢先按键,就判断甲方输,给乙方加1分,并让蜂鸣器鸣叫;
nextstate<=s4;
led8s<=8'b00000000;
end
end
s6: begin
if(k_a)
begin
nextstate<=s1;//甲方接球成功,并进入甲方发球的s1状态;
led8s<=8'b00000000;
end
else
begin
score_b<=score_b+1;
speaker<=1'b1;
nextstate<=s4;//甲方接球不成功,则乙方加一分,并进入乙方发球的s4状态,蜂鸣器鸣叫;
led8s<=8'b00000000;
end
end
default: nextstate<=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
4功能仿真
功能仿真是最基本的仿真验证,它只能仿真设计中的逻辑功能。
通过功能仿真,可以验证整个系统的逻辑功能是否正确。
用户可以通过观看仿真的波形来对系统的逻辑功能进行分析,并可以以此为依据,对设计进行必要的修改和完善。
由于本系统的状态情况较为复杂,下面就几种典型的情况进行系统的综合和仿真:
(1)甲方发球后,乙方提前击球,同时甲方得分。
图2为仿真结果图,观察波形可知,球从左到右,乙方提前击球后a_score+1,即甲方得分。
图2功能仿真结果01
(2)甲方发球后,乙方在最后一个LED灯亮的时候才接球。
图3为仿真结果图,观察波形可知,乙方接球后,球从右到左。
图3功能仿真结果02
(3)甲方发球后,乙方一直不接球。
图4为仿真结果图,观察波形可知,最后一个LED亮了0.5s乙方没有接球,a_score+1,即甲方得分。
图4功能仿真结果03
5总结
通过这次大作业的练习,我对EDA有了更加深入的理解,对用Verilog语言设计程序不再感到陌生。
我对设计要求进行了仔细的分析,对设计算法不断地进行优化,对程序反复地进行调试,这在很大程度上锻炼了我解决问题的能力。
另外,通过这次课程设计我的Verilog编程能力得到了很大的提高,同时熟练掌握了Quartus和Modelsim这两个EDA软件。
总之,这次课程设计让我受益匪浅,非常感老师给我们这次学习的机会。
致:
在这为期一周的课程设计中,感XX老师给予的悉心指导和帮助,以及感XX实验室提供的EDA 硬件和软件的实验环境。
参考文献:
[1]xx. xx[M].xx:xx,2008.6.。