篮球30s倒计时

**

一、目的:

实现30s倒计时,并且在数码管实时显示计数时间,每一秒led绿色灯闪烁一次,计时结束时数码管停止,同时红色led灯常亮。

二、代码部分:

代码主要有三个部分,时钟分频模块,数码管显示模块以及顶层模块(这里我没有去调用内部pLL)
时钟分频模块如下:
module div_25mhz( 
     input i_clk,
     input i_rst,
     output reg clk_1hz
     );
parameter clk_cnt = 24_999_999;
reg [31:0] cnt;
always @(posedge i_clk or negedge i_rst) begin
 if(!i_rst) begin
   cnt <= 32'd0;
   clk_1hz <= 0;
 end
 else if(cnt == clk_cnt) begin
   cnt <= 32'd0;
   clk_1hz <= ~clk_1hz;
 end
 else begin
   cnt <= cnt +1'b1;
   clk_1hz <= clk_1hz;
 end
end
endmodule

数码管显示模块代码如下:

module basketball_timing(
    input i_clk,
    input i_rst,
    input cnt_en,
    output reg led_zt,
    output reg led_0,
    output reg [6:0] smg_shi,
    output  reg [6:0] smg_ge
);
parameter   num_0    = 7'b100_0000,
      num_1    = 7'b111_1001,
      num_2    = 7'b010_0100,
      num_3    = 7'b011_0000,
      num_4    = 7'b001_1001,
      num_5    = 7'b001_0010,
      num_6    = 7'b000_0010,
      num_7    = 7'b111_1000,
      num_8    = 7'b000_0000,
      num_9    = 7'b001_0000;
      
reg [3:0] cnt_shi;
reg [3:0] cnt_ge;
always @(posedge i_clk or negedge i_rst) begin
   if(!i_rst) begin
     cnt_shi <= 4'd3;
     cnt_ge  <= 4'd0;
     led_0   <= 0;
     led_zt  <= 0;
   end
   else if((cnt_shi == 4'd0)&&(cnt_ge == 4'd0)) begin
     cnt_shi <= cnt_shi;
     cnt_ge  <= cnt_ge;
     led_0   <= 1;
   end
     
   else if(!cnt_en) begin
     cnt_shi <= cnt_shi;
     cnt_ge  <= cnt_ge;
     led_zt  <= 0;
   end
   else if(cnt_ge == 4'd0) begin
     cnt_shi <= cnt_shi - 1'b1;
     cnt_ge  <= 4'd9;
   end
   else begin
     cnt_shi <= cnt_shi;
     cnt_ge  <= cnt_ge - 1'b1;
     led_zt <= 1;
   end
end
always @( * ) begin
  case(cnt_shi)
   4'd0:   smg_shi <= num_0;
   4'd1:  smg_shi <= num_1;
   4'd2:  smg_shi <= num_2;
   4'd3:  smg_shi <= num_3;
   default:                ;
  endcase
end
always @( * ) begin
  case(cnt_ge)
   4'd0:   smg_ge <= num_0;
   4'd1:  smg_ge <= num_1;
   4'd2:  smg_ge <= num_2;
   4'd3:  smg_ge <= num_3;
   4'd4:   smg_ge <= num_4;
   4'd5:  smg_ge <= num_5;
   4'd6:  smg_ge <= num_6;
   4'd7:  smg_ge <= num_7;
   4'd8:   smg_ge <= num_8;
   4'd9:  smg_ge <= num_9;
   default:                ;
  endcase
end

endmodule 

顶层模块代码如下:

module basketball_timing_top(
    input i_clk,
    input i_rst,
    input cnt_en,
    output led_zt,
    output led_0,
    output  [6:0] smg_shi,
    output  [6:0] smg_ge
);
wire clk_1hz;
div_25mhz  u1(
  .i_clk(i_clk),
  .i_rst(i_rst),
  .clk_1hz(clk_1hz)
);
basketball_timing u2(
  .i_clk(clk_1hz),
  .i_rst(i_rst),
  .cnt_en(cnt_en),
  .led_zt(led_zt),
  .led_0(led_0),
  .smg_shi(smg_shi),
  .smg_ge(smg_ge)
);
endmodule

三、总结

总的来说这些代码是最基本的,入门就需要掌握,小白可以看看试着谢谢,加油,赶路人!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值