FPGA设计(篮球进攻24秒倒计时器)

篮球进攻24秒倒计时器

1 程序设计

1.1方案设计

篮球进攻24秒倒计时器系统由5CEBA4F23C7N FPGA现场可编程逻辑器件、按键模块、LED模块、数码管显示模块、时钟模块五部分组成。

系统的工作方式为使用者通过按键复位,初始化将数码管显示为24秒倒计时,LED熄灭;若篮球比赛过程中,遇到教练需要轮换球员,通过按键传递给5CEBA4F23C7N开发板,开发板则使数码管倒计时显示暂停,轮换结束后,通过按键继续执行倒计时;当进攻时间剩余8秒后,数码管显示小数点后两位,提醒球员进攻剩余时间不多。其次当遇到进攻方投篮不进,且抢到前场篮板,则数码管回秒到14秒,延长进攻时间。最后当倒计时归零,数码管外圈全亮,LED全亮,球权交换。

图1.1 系统框图

1.2主程序流程图

图1.2系统流程图

1.3程序

module miao_24(clk, rst, pause, button, seg_a, seg_b, seg_c, seg_d,

                     seg_e, seg_f, led, data_tens, data_ones, tens, ones,

                     tens_fen, bai_fen);

input clk, rst;      //50Mhz时钟和复位

input pause, button;   //暂停和回秒

input [3:0] data_tens, data_ones;   //拨码开关回秒设置

output reg [6:0] seg_a, seg_b, seg_c, seg_d, seg_e, seg_f;//数码管

output reg [9:0] led;   //外圈LED显示

reg [25:0] cnt;     //分频计数器

output reg [3:0] tens, ones, tens_fen, bai_fen;//中间变量计数



always @(posedge clk or negedge rst)  //分频模块

begin

       if(!rst) cnt = 0;    

       else cnt = (cnt == 25'd499_999) ?  0 :  (cnt + 1); //10ms=0.01s

end



always @(posedge clk or negedge rst)

begin

if(!rst)begin //复位

       {tens, ones, tens_fen, bai_fen} = 16'h2400;

       led = 10'b0000000000;     //LED灭掉

       seg_e = 7'hFF;                         //数码管不显示

       seg_f = 7'hFF;                          //数码管不显示

       end

else if(pause == 1)begin   //暂停

       {tens, ones, tens_fen, bai_fen} = {tens, ones, tens_fen, bai_fen};

       end

else begin

       if(cnt < 25'd499_999)

              {tens, ones, tens_fen, bai_fen} = {tens, ones, tens_fen, bai_fen};

       else if(button == 1)           //回秒

              {tens, ones} = {data_tens, data_ones};

       else begin

              if(tens_fen == 0 && bai_fen == 0)begin

                     {tens_fen, bai_fen} = 8'h99;

                     if(ones == 0 && tens != 0) begin  

                            tens = tens -1;

                            ones = 9;end

                     else if(tens == 0 && ones == 0 )begin  //外圈显示功能

                                   tens = 10;

                                   ones = 10;

                                   tens_fen = 10;

                                   bai_fen = 10;

                                   seg_e = 7'hF6;

                                   seg_f = 7'hC6;

                                   led = 10'b1111111111;end //LED外圈全亮

                     else ones = ones - 1;end

              else if(bai_fen == 0 && tens_fen != 0) begin

                     tens_fen = tens_fen - 1;

                     bai_fen = 9;end

              else if(bai_fen != 10) bai_fen = bai_fen - 1;end

       end

end



always @(tens)   //     十位数码管显示

begin

       case (tens)

                     0:seg_a=8'hC0;

                     1:seg_a=8'hF9;

                     2:seg_a=8'hA4;

                     3:seg_a=8'hB0;

                     4:seg_a=8'h99;

                     5:seg_a=8'h92;

                     6:seg_a=8'h82;

                     7:seg_a=8'hF8;

                     8:seg_a=8'h80;

                     9:seg_a=8'h90;

                     10:seg_a=8'hF6;

                     default:seg_a=8'hFF;

       endcase

end



always @(ones)  //     个位数码管显示

begin

       case (ones)

                     0:seg_b=8'hC0;

                     1:seg_b=8'hF9;

                     2:seg_b=8'hA4;

                     3:seg_b=8'hB0;

                     4:seg_b=8'h99;

                     5:seg_b=8'h92;

                     6:seg_b=8'h82;

                     7:seg_b=8'hF8;

                     8:seg_b=8'h80;

                     9:seg_b=8'h90;

                     10:seg_b=8'hF6;

                     default:seg_b=8'hFF;

       endcase

end



always @(tens_fen)   //     十分位数码管显示

begin

if(tens != 0 && tens < 10)                            //十位大于0的时候不显示后两位

       seg_c = 8'hFF;

else if(tens == 0 && ones >= 8)            //滤掉09-08那段显示

       seg_c = 8'hFF;

else if(tens == 0 && ones < 8) begin //8秒后数据进来

              case (tens_fen)

                     0:seg_c=8'hC0;

                     1:seg_c=8'hF9;

                     2:seg_c=8'hA4;

                     3:seg_c=8'hB0;

                     4:seg_c=8'h99;

                     5:seg_c=8'h92;

                     6:seg_c=8'h82;

                     7:seg_c=8'hF8;

                     8:seg_c=8'h80;

                     9:seg_c=8'h90;

                     default:seg_c=8'hFF;

              endcase

       end

else seg_c = 8'hF6;                                       //倒计时完后的外圈数码管亮起

end



always @(bai_fen)    //     百分位数码管显示

begin

if(tens != 0 && tens < 10)                            //十位大于0的时候不显示后两位

       seg_d = 8'hFF;                                             

else if(tens == 0 && ones >= 8)            //滤掉09-08那段显示

       seg_d = 8'hFF;

else if(tens == 0 && ones < 8)begin     //8秒后数据进来

              case (bai_fen)

                     0:seg_d=8'hC0;

                     1:seg_d=8'hF9;

                     2:seg_d=8'hA4;

                     3:seg_d=8'hB0;

                     4:seg_d=8'h99;

                     5:seg_d=8'h92;

                     6:seg_d=8'h82;

                     7:seg_d=8'hF8;

                     8:seg_d=8'h80;

                     9:seg_d=8'h90;

                     default:seg_d=8'hFF;

              endcase

       end

else seg_d = 8'hF0;                                       //倒计时完后的外圈数码管亮起

end

endmodule

1.4程序分析综合

图1.3 分析综合图

2 测试程序设计

2.1测试程序

`timescale 1 ps/ 1 ps

module miao_24_v();

reg clk;

reg rst;

reg pause; 

reg button;

reg [3:0] data_tens;

reg [3:0] data_ones;                                        

wire [9:0]  led;

wire [3:0]  tens;

wire [3:0]  ones;

wire [3:0]  tens_fen;

wire [3:0]  bai_fen;

wire [6:0]  seg_a;

wire [6:0]  seg_b;

wire [6:0]  seg_c;

wire [6:0]  seg_d;

wire [6:0]  seg_e;

wire [6:0]  seg_f;                        

miao_24 i1 ( 

       .bai_fen(bai_fen),

       .button(button),

       .clk(clk),

       .data_ones(data_ones),

       .data_tens(data_tens),

       .led(led),

       .ones(ones),

       .pause(pause),

       .rst(rst),

       .seg_a(seg_a),

       .seg_b(seg_b),

       .seg_c(seg_c),

       .seg_d(seg_d),

       .seg_e(seg_e),

       .seg_f(seg_f),

       .tens(tens),

       .tens_fen(tens_fen)

);

always #10 clk=~clk; //时钟翻转

initial                                               

begin                                                 

   clk=1;           

       rst=0;                         //复位按下                

       pause=0;                          

       button=0;                  

       #100;

       rst=1;                        

       #60000;

       pause = 1;                  //暂停按下

       #100;

       pause = 0;                 

       #40000;

       button = 1;                 //回秒开启

       data_tens = 3;            //设置回秒十位

       data_ones = 9;            //设置回秒个位

       #100;

       button = 0;

       #100;

end                                                   

endmodule

2.2 测试程序的设置

图2.1测试程序设置界面

图2.2测试程序设置界面

图2.3测试程序设置界面

图2.4测试程序设置界面

3 功能仿真

图3.1 复位波形仿真图

图3.2 暂停波形仿真图

 

图3.3 回秒波形仿真图

4 引脚设定

表4.1 引脚设定表

Pin_Name

Direction

Location

Pin_Name

Direction

Location

clk

Input

PIN_M9

seg_a[3]

Output

PIN_V16

rst

Input

PIN_P22

seg_a[2]

Output

PIN_Y17

pause

Input

PIN_AB12

seg_a[1]

Output

PIN_W16

button

Input

PIN_AB13

seg_a[0]

Output

PIN_Y16

Led[9]

Output

PIN_L1

seg_b[6]

Output

PIN_AB21

Led[8]

Output

PIN_L2

seg_b[5]

Output

PIN_AB22

Led[7]

Output

PIN_U1

seg_b[4]

Output

PIN_V14

Led[6]

Output

PIN_U2

seg_b[3]

Output

PIN_Y14

Led[5]

Output

PIN_N1

seg_b[2]

Output

PIN_AA10

Led[4]

Output

PIN_N2

seg_b[1]

Output

PIN_AB17

Led[3]

Output

PIN_Y3

seg_b[0]

Output

PIN_Y19

Led[2]

Output

PIN_W2

seg_c[6]

Output

PIN_U22

Led[1]

Output

PIN_AA1

seg_c[5]

Output

PIN_AA17

Led[0]

Output

PIN_AA2

seg_c[4]

Output

PIN_AB18

data_ones[3]

Output

PIN_T12

seg_c[3]

Output

PIN_AA18

data_ones[2]

Output

PIN_T13

seg_c[2]

Output

PIN_AA19

data_ones[1]

Output

PIN_V13

seg_c[1]

Output

PIN_AB20

data_ones[0]

Output

PIN_U13

seg_c[0]

Output

PIN_AA20

data_tens[3]

Output

PIN_AA13

seg_d[6]

Output

PIN_AA22

data_tens[2]

Output

PIN_AA14

seg_d[5]

Output

PIN_Y21

data_tens[1]

Output

PIN_AB15

seg_d[4]

Output

PIN_Y22

data_tens[0]

Output

PIN_AA15

seg_d[3]

Output

PIN_W21

seg_a[6]

Output

PIN_V19

seg_d[2]

Output

PIN_W22

seg_a[5]

Output

PIN_V18

seg_d[1]

Output

PIN_V21

seg_a[4]

Output

PIN_U17

seg_d[0]

Output

PIN_U21

seg_e[6]

Output

PIN_P9

seg_f[6]

Output

PIN_W19

seg_e[5]

Output

PIN_Y15

seg_f[5]

Output

PIN_C2

seg_e[4]

Output

PIN_U15

seg_f[4]

Output

PIN_C1

seg_e[3]

Output

PIN_U16

seg_f[3]

Output

PIN_P14

seg_e[2]

Output

PIN_V20

seg_f[2]

Output

PIN_T14

seg_e[1]

Output

PIN_Y20

seg_f[1]

Output

PIN_M8

seg_e[0]

Output

PIN_U20

seg_f[0]

Output

PIN_N9

5 硬件调试效果

图5.1 在8秒前隐藏后两位数码管

图5.2 在8秒后显示后两位数码管

图5.3 自行设置回秒(剩余时间)

图5.4 倒计时结束后外圈亮起和LED全亮

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值