大学
EDA课程设计
姓名: 学号: 班级: 专业: 学院:
- 0 -
目 录
0 引言............................................................................................................................. - 2 -
1 设计要求..................................................................................................................... - 2 -
2 设计思路..................................................................................................................... - 2 -
3 Verilog程序 ................................................................................................................ - 3 -
4 功能仿真..................................................................................................................... - 3 -
5 总结........................................................................................................................... - 11 -
致谢...............................................................................................................................- 11 -
参考文献.......................................................................................................................- 11 -
- 1 -
基于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所示:
- 2 -
状态 S0 S1 S2
功能
复位状态,也是判断发球权的状态 甲方发球
球从甲方向乙方右移,若此时乙方接球就给甲方加一分,并将球权给甲方
S3 S4 S5
开始判断乙方是否在0.5S内接球 乙方发球
球从乙方向甲方左移,若此时甲方接球就给乙方加一分,并将球权给乙方
S6 开始判断甲方是否在0.5S内接球
表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,//球从乙方向甲方左移,若此时甲方接球就给乙方加一分,并将球权给乙方;
- 3 -
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;
- 4 -