当前位置:   article > 正文

基于FPGA的乒乓球比赛游戏机设计Verilog代码ISE仿真_fpga乒乓球游戏机三局两胜

fpga乒乓球游戏机三局两胜

名称:基于FPGA的乒乓球比赛游戏机设计Verilog代码ISE仿真(文末获取)

软件:ISE

语言:Verilog

代码功能:

乒乓球比赛游戏机。

功能要求: 

1、设计一个由甲、乙双方参赛,有裁判的3人乒乓球游戏机。

2、用多个LED排成一条直线,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置,点亮的LED依此从左到右,或从右到左,其移动的速度应能调节;甲乙双方每隔5次自动交换发球权,拥有发球权的一方发球才有效。

3、当“球”(点亮的那LED)运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球。若击中,则球向相反方向移动;若未击中,则对方得1分;一方得分时,电路自动响铃,这期间发球无效等铃声停止后方能继续比赛,设置自动记分电路,甲、乙双方音进行记分显示每计满11分为1局

N015.jpg

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. Testbench(仿真文件)

6. 仿真图

整体仿真图

甲发球并得分,甲发球权,乙发球无效

speed_ctrl控制稍球的速度

乙发球,并得分,乙发球权,甲发球无效

乙先得11分,win_led亮

部分代码展示:

`timescale 1ns / 1ps
//游戏控制模块
module game_ctrl(
    input clk_in,
    input reset_p,//复位,裁判
    input button_posedge_1,//甲,按键1
    input button_posedge_2,//乙,按键2
 input shift_en, 
    output [7:0] led,//8个led
 output reg win_led,//一局结束指示
 output reg beep,//高电平响
    output [7:0] score_1,//分数1
    output [7:0] score_2//分数2
    );
reg [7:0] led_buf=8'd0;
//定义状态
parameter s_idle=4'd0;
parameter s_start_1=4'd1;
parameter s_start_2=4'd2;
parameter s_run_L=4'd3;
parameter s_run_R=4'd4;
parameter s_win_1=4'd5;
parameter s_win_2=4'd6;
parameter s_end=4'd7;
reg [3:0] state=4'd0;
reg [3:0] start_ball=4'd0;//发球计数,每人5次,0~4甲,5~9乙。
always@(posedge clk_in)//发球计数
if(start_ball<5)//发球计数,每人5次,0~4甲
if(button_posedge_1==1)
start_ball<=start_ball+1;
else
;
else//发球计数,每人5次,5~9乙。
if(button_posedge_2==1)
start_ball<=start_ball+1;
else
;
//状态机设计
always@(posedge clk_in)
if(reset_p==1)
    state<=s_idle;
else
    case(state)
       s_idle:begin//初始状态
            led_buf<=8'd0;
            if(start_ball<5 && button_posedge_1==1)//1号发球
                state<=s_start_1;
            else if(start_ball>4 && button_posedge_2==1)//2号发球
                state<=s_start_2;
            else
                state<=s_idle;
            end
      s_start_1:begin//1号发球起始位置
            state<=s_run_R;
            led_buf<=8'b10000000;
            end
      s_start_2:begin//2号发球起始位置
            state<=s_run_L;
            led_buf<=8'b00000001;
            end  
      s_run_R:begin//球右移
            if(shift_en)
               led_buf<=led_buf>>1;//球右移
            else
               led_buf<=led_buf;  
      
            if(button_posedge_2==1)
                if(led_buf==8'b00000001)//判断对方是否正确位置击球          
                    state<=s_run_L;//改变方向
                else
                    state<=s_win_1;//否则得分
            else if(led_buf==8'b00000000)//对方未在正确位置击球
                    state<=s_win_1;
                else
                    state<=s_run_R;
            end
      s_run_L: begin//球左移
            if(shift_en)
                led_buf<=led_buf<<1;//球左移
            else
                led_buf<=led_buf; 
                
            if(button_posedge_1==1)
                if(led_buf==8'b10000000)//判断对方是否正确位置击球           
                    state<=s_run_R;//改变方向
                else
                    state<=s_win_2;//否则得分
            else if(led_buf==8'b00000000)//对方未在正确位置击球
                    state<=s_win_2;
                else
                    state<=s_run_L;        
             end         
        s_win_1:
 if(beep_cnt>=32'd499)//响铃程持续500时钟
state<=s_idle;//返回初始状态
 else
state<=s_win_1;
        s_win_2:
 if(beep_cnt>=32'd499)//响铃程持续500时钟
state<=s_idle;//返回初始状态
 else
state<=s_win_2;
        default:;
   endcase
//计分
reg [7:0] score_1_buf=8'd0;
reg [7:0] score_2_buf=8'd0;
always@(posedge clk_in)
    if(reset_p==1)
        score_1_buf<=8'd0;
    else
  if(state==s_win_1 && beep_cnt==32'd0)
score_1_buf<=score_1_buf+8'd1;//加一分
always@(posedge clk_in)
    if(reset_p==1)
        score_2_buf<=8'd0;
    else
        if(state==s_win_2 && beep_cnt==32'd0)
            score_2_buf<=score_2_buf+8'd1;//加一分
//任何一方先记满11分获胜
reg beep_en=0;
always@(posedge clk_in)
    if(reset_p==1)begin
 win_led<=0;
 end
 else
 if(score_1_buf>=8'd11 || score_2_buf>=8'd11)begin
win_led<=1;//任何一方先记满11分获胜
end
 else begin
win_led<=0;
end
//得分自动响铃
reg [31:0] beep_cnt=32'd0;
always@(posedge clk_in)
if(reset_p==1)
beep_cnt<=32'd0;
else
if(state==s_win_1 || state==s_win_2)
beep_cnt<=beep_cnt+32'd1;
else
beep_cnt<=32'd0;
always@(posedge clk_in)
if(reset_p==1)
beep<=30;
else
if(state==s_win_1 || state==s_win_2)
beep<=1;//得分自动响铃
else
beep<=0;
assign score_1=score_1_buf;
assign score_2=score_2_buf;
assign led=led_buf | 8'b00011000;//中间2个作为中网
endmodule
源代码

 扫描文章末尾的公众号二维码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/903232
推荐阅读
相关标签
  

闽ICP备14008679号