FPGA课设:拔河游戏

 一、实验要求

用设计一拔河游戏机,要求如下:电路使用15个发光二极管表示拔河的“电子绳”,开机后只有中间一个发亮,此即拔河的中心点。游戏双方各持一个按钮,迅速地、不断地按动产生脉冲,谁按的快,亮点就向谁的一方移动,每按一次,亮点移动一次。亮点一到任一方的终端发光二极管时,这一方就获胜,此时双方按钮均无作用,输出保持,只有复位后亮点才恢复到中心。由裁判下达比赛命令后,双方才能输入信号,否则,输入无效。

 二、实验代码

源代码



module tug_of_war 
(
   input clk, reset_n, p1_btn, p2_btn, referee_cmd,
   output reg[14:0] leds
);

   parameter CENTER_LED = 7;
   parameter WAIT_CMD = 4'd0;
   parameter WAIT_INPUT = 4'd1;
   parameter RUNNING = 4'd2;
   parameter P1_WIN = 4'd3;
   parameter P2_WIN = 4'd4;
   parameter OUTPUT_HOLD = 4'd5;

   
   reg [3:0] state;    
   reg [14:0] counter; 

   always @(posedge clk, negedge reset_n) begin
      if (~reset_n) begin
         counter <= 15'd0;
         leds <= 15'b000000010000000;
         state <= WAIT_CMD;
      end
      else begin
         case (state)
            WAIT_CMD: begin
               if (referee_cmd) begin
                  state <= WAIT_INPUT;
               end
            end

            WAIT_INPUT: begin
               if (p1_btn || p2_btn) begin
                  state <= RUNNING;
               end
            end

            RUNNING: begin
               if (counter == 15'd000001) begin
                  counter <= 15'd0;

                  if (p1_btn == p2_btn) begin
                     leds <= leds;
                  end
                  else if (p1_btn > p2_btn) begin
                     leds <= {leds[13:0], 1'b0};
                  end
                  else if (p2_btn > p1_btn) begin
                     leds <= {1'b0, leds[14:1]};
                  end

                  if (leds == 15'b100000000000000 || leds == 15'b000000000000001) begin
                     if (p1_btn) begin
                        state <= P1_WIN;
                     end
                     else if (p2_btn) begin
                        state <= P2_WIN;
                     end
                  end
               end
               else begin
                  counter <= counter + 1;
               end
            end

            P1_WIN: begin
               leds <= 15'b100000000000000;
               state <= OUTPUT_HOLD;
            end

            P2_WIN: begin
               leds <= 15'b000000000000001;
               state <= OUTPUT_HOLD;
            end

            OUTPUT_HOLD: begin
               if (referee_cmd==0) begin
               leds <= 15'b000000010000000;
             end
              else if (referee_cmd==1) begin
                 leds <= leds;
               end
            end
         endcase
      end
   end

endmodule



[点击并拖拽以移动]
​

测试代码


module tb_tug_of_war;

   reg clk;
   reg reset_n;

 
   reg p1_btn;
   reg p2_btn;
   reg referee_cmd;
   wire [14:0] leds;


   tug_of_war dut (
      .clk(clk),
      .reset_n(reset_n),
      .p1_btn(p1_btn),
      .p2_btn(p2_btn),
      .referee_cmd(referee_cmd),
      .leds(leds)
   );


   always #5 clk = ~clk;

       initial begin
      reset_n = 0;
      clk = 0;

      #100;
      reset_n = 1;

      #200;
      referee_cmd = 1;

      #50;
      p2_btn = 1;

      #50;
      p1_btn = 1;
      p2_btn = 0;
      
      #50;
      p1_btn = 0;
      p2_btn = 1;
      
      #50;
      p1_btn = 1;
      p2_btn = 0;

      #170;
       p1_btn = 0;
      referee_cmd = 0;
      reset_n = 0;
      
      #100;
      referee_cmd = 1;
      reset_n = 1;

      #200;
      p1_btn = 0;
      p2_btn = 1;

      #150;
      p2_btn = 0;
      referee_cmd = 0;
      reset_n = 0;
      
      #100000;
      $finish;
   end

endmodule

       测试代码可以自己改数据,第一个是P1胜利,不是一边倒胜利,有拉锯,后面是P2胜利,一边倒胜利,如果不想,可以在测试代码加一下。

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值