⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ping.txt

📁 乒乓球Verilog HDL编程 大家互相学习
💻 TXT
字号:
我写的乒乓球游戏机VERILOG程序

//**********************table tennis game***********************
//***********************************************************
//*********************designed by liupeng**********************
//**************************2007.11.22**************************

//信号说明:
/*   clk : 主时钟
  reset : 复位信号,高有效
  in1 : 甲挥拍信号,输入
  in2 : 乙挥拍信号,输入
  ball : 乒乓球运动轨迹,共10位,只接中间8位至LED
right1 : 甲拥有发球权指示信号 
right2 : 乙拥有发球权指示信号
score1 : 甲的得分
score2 : 乙的得分   */ 



module tennis(clk,reset,in1,in2,ball,right1,right2,score1,score2);
  input in1,in2,clk,reset;
  output [5:0] score1,score2;
  output right1,right2;
  output [9:0] ball;

  reg [2:0] count;
  reg [5:0] score1,score2;
  reg right1,right2,ldir,rdir,temp;
  reg [9:0] ball;

  always @(posedge clk)
  begin
    if(reset==1)//状态清零
    begin
      score1<=6'b000000;
      score2<=6'b000000;
      count<=0;
      ball<=10'b0100000000;
    end
    else if(ball[8] && in1)//甲正常击球
    begin
      ball<=10'b0010000000;
      rdir<=1;
      ldir<=0;
    end
    else if(ball[1] && in2)//乙正常击球
    begin
      ball<=10'b0000000100;
      rdir<=0;
      ldir<=1;
    end
    else if(ball[0] || ball[9])//球出界
    begin
      rdir<=0;
      ldir<=0;
      if(count<4)//每五次发球后交换发球权
        count<=count+1;
      else if(count==3'b100)
        begin
        count=0;
        temp=right2;
        right2=right1;
        right1=temp;
        end
      if(right1)//甲拥有发球权
        ball<=10'b0100000000;
      else//乙拥有发球权
        ball<=10'b0000000010;
      if(ball[0])//乙失球,甲加分
      begin
        if(score1[3:0]==4'b1001)
          begin
          score1[3:0]<=4'b0000;
          score1[5:4]<=score1[5:4]+1;
          end
        else if(score1==6'b100001)
          begin
          score1<=6'b000000;
          score2<=6'b000000; 
          count<=0;
          end
        else
          score1[3:0]<=score1[3:0]+1;
      end
      else if(ball[9])//甲失球,乙加分
      begin
        if(score2[3:0]==4'b1001)
          begin
          score2[3:0]<=4'b0000;
          score2[5:4]<=score2[5:4]+1;
          end
        else if(score2==6'b100001)
          begin
          score1<=6'b000000;
          score2<=6'b000000; 
          count<=0;
          end
        else
          score2[3:0]<=score2[3:0]+1;
      end
    end

  else if(rdir && !ball[8])//球正常向右移动
    begin
      if(!in1 && !in2)//当甲与乙均没有提前击球时
        ball<=ball>>1;
      else if(in1 && !in2)//甲提前击球
        begin
            rdir<=0;
            ldir<=0;
        if(count<4)//每五次发球后交换发球权
            count<=count+1;
        else if(count==3'b100)
          begin
            count=0;
            temp=right2;
            right2=right1;
            right1=temp;
          end
        if(right1)//甲拥有发球权
            ball<=10'b0100000000;
        else//乙拥有发球权
            ball<=10'b0000000010;
        if(score2[3:0]==4'b1001)//乙加分
          begin
            score2[3:0]<=4'b0000;
            score2[5:4]<=score2[5:4]+1;
          end
        else if(score2==6'b100001)
          begin
            score1<=6'b000000;
            score2<=6'b000000; 
            count<=0;
          end
        else
            score2[3:0]<=score2[3:0]+1;
        end
      else if(!in1 && in2)//乙提前击球
        begin
            rdir<=0;
            ldir<=0;
        if(count<4)//每五次发球后交换发球权
            count<=count+1;
        else if(count==3'b100)
          begin
            count=0;
            temp=right2;
            right2=right1;
            right1=temp;
          end
        if(right1)//甲拥有发球权
            ball<=10'b0100000000;
        else//乙拥有发球权
            ball<=10'b0000000010;
        if(score1[3:0]==4'b1001)//甲加分
          begin
            score1[3:0]<=4'b0000;
            score1[5:4]<=score1[5:4]+1;
          end
        else if(score1==6'b100001)
          begin
            score1<=6'b000000;
            score2<=6'b000000; 
            count<=0;
          end
        else
            score1[3:0]<=score1[3:0]+1;
        end
      else if(in1 && in2)//甲乙均提前击球
        begin
            rdir<=0;
            ldir<=0;
        if(count<4)//每五次发球后交换发球权
            count<=count+1;
        else if(count==3'b100)
          begin
            count=0;
            temp=right2;
            right2=right1;
            right1=temp;
          end
        if(right1)//甲拥有发球权
            ball<=10'b0100000000;
        else//乙拥有发球权
            ball<=10'b0000000010;
        if(score1[3:0]==4'b1001)//各加一分
          begin
            score1[3:0]<=4'b0000;
            score1[5:4]<=score1[5:4]+1;
          end
        else if(score1==6'b100001)
          begin
            score1<=6'b000000;
            score2<=6'b000000; 
            count<=0;
          end
        else
            score1[3:0]<=score1[3:0]+1;
        if(score2[3:0]==4'b1001)
          begin
            score2[3:0]<=4'b0000;
            score2[5:4]<=score2[5:4]+1;
          end
        else if(score2==6'b100001)
          begin
            score1<=6'b000000;
            score2<=6'b000000; 
            count<=0;
          end
        else
            score2[3:0]<=score2[3:0]+1;
        end
    end         
    
    else if(ldir && !ball[1])//球正常向左移动     
    begin
      if(!in1 && !in2)//甲乙均未提前击球
        ball<=ball<<1;
      else if(in1 && !in2)//甲提前击球
        begin
            rdir<=0;
            ldir<=0;
        if(count<4)//每五次发球后交换发球权
            count<=count+1;
        else if(count==3'b100)
          begin
            count=0;
            temp=right2;
            right2=right1;
            right1=temp;
          end
        if(right1)//甲拥有发球权
            ball<=10'b0100000000;
        else//乙拥有发球权
            ball<=10'b0000000010;
        if(score2[3:0]==4'b1001)//乙加分
          begin
            score2[3:0]<=4'b0000;
            score2[5:4]<=score2[5:4]+1;
          end
        else if(score2==6'b100001)
          begin
            score1<=6'b000000;
            score2<=6'b000000; 
            count<=0;
          end
        else
            score2[3:0]<=score2[3:0]+1;
        end
      else if(!in1 && in2)//乙提前击球
        begin
            rdir<=0;
            ldir<=0;
        if(count<4)//每五次发球后交换发球权
            count<=count+1;
        else if(count==3'b100)
          begin
            count=0;
            temp=right2;
            right2=right1;
            right1=temp;
          end
        if(right1)//甲拥有发球权
            ball<=10'b0100000000;
        else//乙拥有发球权
            ball<=10'b0000000010;
        if(score1[3:0]==4'b1001)//甲加分
          begin
            score1[3:0]<=4'b0000;
            score1[5:4]<=score1[5:4]+1;
          end
        else if(score1==6'b100001)
          begin
            score1<=6'b000000;
            score2<=6'b000000; 
            count<=0;
          end
        else
            score1[3:0]<=score1[3:0]+1;
        end
      else if(in1 && in2)//甲乙均提前击球,各加一分
        begin
            rdir<=0;
            ldir<=0;
        if(count<4)//每五次发球后交换发球权
            count<=count+1;
        else if(count==3'b100)
          begin
            count=0;
            temp=right2;
            right2=right1;
            right1=temp;
          end
        if(right1)//甲拥有发球权
            ball<=10'b0100000000;
        else//乙拥有发球权
            ball<=10'b0000000010;
        if(score1[3:0]==4'b1001)
          begin
            score1[3:0]<=4'b0000;
            score1[5:4]<=score1[5:4]+1;
          end
        else if(score1==6'b100001)
          begin
            score1<=6'b000000;
            score2<=6'b000000; 
            count<=0;
          end
        else
            score1[3:0]<=score1[3:0]+1;
        if(score2[3:0]==4'b1001)
          begin
            score2[3:0]<=4'b0000;
            score2[5:4]<=score2[5:4]+1;
          end
        else if(score2==6'b100001)
          begin
            score1<=6'b000000;
            score2<=6'b000000; 
            count<=0;
          end
        else
            score2[3:0]<=score2[3:0]+1;
        end
    end   
    
  if(ball==10'b0000000000)
    begin
      right1<=1;
      right2<=0;
      ball<=10'b0100000000;
    end
  end

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -