FPGA篮球计分设计

消抖模块

module key_module
(
    //输入端口
    clk,rst_n,KEY,
    //输出端口
    key_out
);  
 
//---------------------------------------------------------------------------
//--    外部端口声明
//---------------------------------------------------------------------------
input                        clk;                //时钟的端口
input                        rst_n;                //复位的端口,低电平复位
input             [3:0]        KEY;                    //对应板上的KEY
output             [3:0]        key_out;                //消抖完成输出按键

//---------------------------------------------------------------------------
//--    内部端口声明
//---------------------------------------------------------------------------
reg        [26:0]    time_cnt;            //用来计数按键延迟的定时计数器
reg        [26:0]    time_cnt_n;            //time_cnt的下一个状态
reg         [3:0]             key_reg;                //用来接收按键信号的寄存器
reg         [3:0]             key_reg_n;            //key_reg的下一个状态


//设置定时器的时间为20ms,计算方法为  (20*10^6)ns / (1/50)ns  50MHz为开发板晶振
parameter SET_TIME_20MS = 27'd1_000_000;    
//parameter SET_TIME_20MS = 27'd1_0;    

//---------------------------------------------------------------------------
//--    逻辑功能实现    
//---------------------------------------------------------------------------
//时序电路,用来给time_cnt寄存器赋值
always @ (posedge clk, negedge rst_n)
begin
    if(!rst_n)                                //判断复位
        time_cnt <= 27'h0;                //初始化time_cnt值
    else
        time_cnt <= time_cnt_n;            //用来给time_cnt赋值
end

//组合电路,实现20ms的定时计数器
always @ (*)
begin
    if(time_cnt == SET_TIME_20MS)        //判断20ms时间
        time_cnt_n = 27'h0;                //如果到达20ms,定时计数器将会被清零
    else
        time_cnt_n = time_cnt + 1'b1;//如果未到20ms,定时计数器将会继续累加
end

//时序电路,用来key_reg寄存器赋值
always @ (posedge clk, negedge rst_n)
begin
    if(!rst_n)                                //判断复位
        key_reg <= 4'b0000;                    //初始化key_reg值
    else
        key_reg <= key_reg_n;            //用来给key_reg赋值
end

//组合电路,每20ms接收一次按键的值
always @ (*)
begin
    if(time_cnt == SET_TIME_20MS)        //判断20ms时间
        key_reg_n <= KEY;                    //如果到达20ms,接收一次按键的值
    else
        key_reg_n <= key_reg;            //如果未到20ms,保持原状态不变
end

assign key_out = key_reg & (~key_reg_n);//判断按键有没有按下

endmodule
分屏模块

module div(clk,ext_rst_n,mclk
    );
    input           clk    ;//输入时钟
    input           ext_rst_n      ;//复位端口
    output      reg mclk           ;//输出1Hz
    
    reg      [31:0] cnt            ;//存放计数器的值
    parameter TIME=   32'd5000_0000;//时钟100MHz
//分频模块,使得输入时钟为25MHz输出时钟为1Hz
    always@ (posedge clk or negedge ext_rst_n)begin
        if(!ext_rst_n)begin
            mclk <=1'b0;
            cnt <=32'd0;
        end
        else if(cnt ==TIME-1'b1)begin
            mclk <=~mclk;
            cnt <=1'b0;
        end
        else begin
            cnt <=cnt + 1'b1;
        end
    end
endmodule

控制模块

module control(clk,ext_rst_n,switch1,switch2,en_cnt,en_24s
    );
    input       clk;        //输入时钟
    input       ext_rst_n  ;        //复位信号
    input       switch1    ;        //暂停开关
    input       switch2    ;        //24s使能开关
    output  reg en_cnt     ;        //暂停计数使能位
    output  reg en_24s     ;        //24s使能位
    
    reg  [31:0] cnt        ;        //存放计数器的值
    parameter TIME = 32'd10000_0000;
    //数码管特殊状态闪烁计数器模块
    always@(posedge clk or negedge ext_rst_n)begin
        if(ext_rst_n==1'b0)begin
            cnt <=25'd0;
        end
        else if(cnt ==TIME-1'b1)begin
            cnt <=1'b0;
        end
        else begin
            cnt <=cnt + 1'b1;
        end
    end
    //停止计数器计时模块
    always @(posedge clk or negedge ext_rst_n)begin
        if(ext_rst_n==1'b0)begin
            en_cnt<=1'b0;
        end
        else if(switch1==1'b0)begin
            en_cnt<=1'b1;
        end
        else begin
            en_cnt<=1'b0;
        end
    end
    //开启24s倒计时
    always@(posedge clk or negedge ext_rst_n)begin
        if(ext_rst_n==1'b0)begin
            en_24s <=1'b0;
        end
        else if(switch2==1'b0)begin
            en_24s <=1'b1;
        end
        else begin
            en_24s <=1'b0;
        end
    end
endmodule
12分钟模块

module counter_12min(clk,mclk,ext_rst_n,en_24s,en_cnt,times_12m,led
    );
    input           clk       ;//系统时钟
    input           mclk              ;//时钟信号
    input           ext_rst_n         ;//复位信号
    input           en_24s            ;//24s使能位
    input           en_cnt            ;//计数器停止使能位
    output reg[15:0]times_12m         ;//15-12分高位 11-8 分低位 7-4秒高位 3-0秒低位
    output          led               ;//led指示状态
    
    assign led =(times_12m==16'h0000);
    
    //计数器模块高位 分钟计时
    always@(posedge mclk or negedge ext_rst_n)begin
        if(!ext_rst_n)b

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值