设为首页 加入收藏

TOP

FPGA:乒乓球比赛模拟机的设计(二)
2023-07-23 13:26:01 】 浏览:454
Tags:FPGA
1]}] set_property IOSTANDARD LVCMOS33 [get_ports {LEDBit[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {LEDBit[6]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED1[7]}] set_property PACKAGE_PIN B4 [get_ports {LED0[0]}] set_property PACKAGE_PIN A4 [get_ports {LED0[1]}] set_property PACKAGE_PIN A3 [get_ports {LED0[2]}] set_property PACKAGE_PIN B1 [get_ports {LED0[3]}] set_property PACKAGE_PIN A1 [get_ports {LED0[4]}] set_property PACKAGE_PIN B3 [get_ports {LED0[5]}] set_property PACKAGE_PIN B2 [get_ports {LED0[6]}] set_property PACKAGE_PIN D5 [get_ports {LED0[7]}] set_property PACKAGE_PIN D4 [get_ports {LED1[0]}] set_property PACKAGE_PIN E3 [get_ports {LED1[1]}] set_property PACKAGE_PIN D3 [get_ports {LED1[2]}] set_property PACKAGE_PIN F4 [get_ports {LED1[3]}] set_property PACKAGE_PIN F3 [get_ports {LED1[4]}] set_property PACKAGE_PIN E2 [get_ports {LED1[5]}] set_property PACKAGE_PIN D2 [get_ports {LED1[6]}] set_property PACKAGE_PIN H2 [get_ports {LED1[7]}] set_property PACKAGE_PIN G2 [get_ports {LEDBit[0]}] set_property PACKAGE_PIN C2 [get_ports {LEDBit[1]}] set_property PACKAGE_PIN C1 [get_ports {LEDBit[2]}] set_property PACKAGE_PIN H1 [get_ports {LEDBit[3]}] set_property PACKAGE_PIN G1 [get_ports {LEDBit[4]}] set_property PACKAGE_PIN F1 [get_ports {LEDBit[5]}] set_property PACKAGE_PIN E1 [get_ports {LEDBit[6]}] set_property PACKAGE_PIN G6 [get_ports {LEDBit[7]}] set_property IOSTANDARD LVCMOS33 [get_ports reset] set_property PACKAGE_PIN P2 [get_ports reset]

设计要求

  1. 主要功能
    1. 模拟乒乓球比赛,用发光二极管(LED)模拟乒乓球运动轨迹,由甲乙双方参赛;
    2. 用8个LED灯表示球桌,其中点亮的LED来回移动表示乒乓球的运动,球速可以调节;
    3. 当球移动到最左侧或最右侧时,表示一方的击球位置。如果提前击球,或未及时击球,则对方得一分;
    4. 甲乙得分使用数码管计分,一局11球;
    5. 用发光二极管表示甲乙的发球权,每5分交换发球权。
  2. 附加功能
    1. 用发光二极管提示甲乙的接球和发球;
    2. 比赛结束后,用数码管动态显示胜利的一方。

工作原理

本电路由时钟分频模块,玩家控制器模块,分数处理模块,游戏控制模块,乒乓球运动控制模块和数码管显示模块组成。

  1. 比赛开始前,可以通过reset开关重置比赛;
  2. 比赛进行时,甲乙两位选手通过扳动开关来实现挥动球拍和控制球速的效果。当乒乓球到击球位置时,若选手未及时击球,或提前击球,则输掉一球,对方加一分。每打5球,就交换一次球权,共打11球,数码管上会显示当前得分,分高者获胜;
  3. 比赛结束后,数码管会显示箭头来表示一方的获胜;
  4. 另外还有4个LED来表示双方的发球和接球。
  5. 系统方框图:


各部分模块具体功能及设计思路

游戏控制器模块

  1. 模块功能:控制整个模拟器各组件状态;
  2. 设计思路:该模块主要是用于控制比赛的进行。在设计中,使用status表示当前的比赛状态。010表示A发球,001表示B发球,110表示玩家A接球,101表示玩家B接球。这样的规定能够有效区分乒乓球不同的运动状态,并判定发/击球的有效性,同时显示在LED灯上来提示选手。另外再用accurateBallLocation [32:0]来表示球的精确位置,范围为$1000_{10} - 9000_{10} $,这样使球在LED显示的误差范围内,可以被击中。
  3. 代码:
点击查看代码
`timescale 1ns / 1ps



module GameController(  //全局状态控制器
    input CLK, 
    input reg hitA, //玩家A输入
    input [1: 0] speedA, //玩家A速度
    input reg hitB,  //玩家B输入
    input [1: 0] speedB,  //玩家B速度
    input reg serviceSide, //发球方
    input reg reset,    //重置
    output reg [2: 0] status, //全局状态
    output reg [7: 0] ballLocation, //球位置
    output reg getScoreA,   //A得分
    output reg getScoreB    //B得分
    );

    reg hitATrigger;
    reg hitBTrigger;
    reg [2: 0] speed;
    reg [15: 0] accurateBallLocation;
    reg resetTrigger;
    // reg serviceSide;


    initial begin   //初始化变量
        hitATrigger = 'b0;
        hitBTrigger = 'b0;
        status = 'b010;
        accurateBallLocation = 'd2000;
        speed = 'd2;
        // serviceSide = 'b0;

        getScoreA = 'b0;
        getScoreB = 'b0;
        resetTrigger = 'b0;
    end



    always @(posedge CLK) begin     //根据报告所述转换状态
        if(resetTrigger == 'b0 && reset == 'b1) begin
            hitATrigger = 'b0;
            hitBTrigger = 'b0;
            status = 'b010;
            accurateBallLocation = 'd2000;
            speed = 'd2;
            // serviceSide = 'b0;

            getScoreA = 'b0;
            getScoreB = 'b0;
        end
        else begin
            if(status == 'b010 ||
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇FPGA按键消抖 下一篇初试高云FPGA

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目