消抖模块
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