篮球进攻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全亮