**
一、目的:
实现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
三、总结
总的来说这些代码是最基本的,入门就需要掌握,小白可以看看试着谢谢,加油,赶路人!