vivado-FPGA 多功能番茄钟
有一定注释,适用于学习交流。可加入手动置数功能,欢迎指教。约束文件另附,仅供救急。共勉
--数电noob留
`timescale 1ns / 1ps
//消除按键抖动
module key_value(
input wire key,
input wire clk,
output reg key_flag);
reg [20:0]delay_cnt;
reg key_reg;
always@(posedge clk )
key_reg<=key;
always@(posedge clk)
if(key!=key_reg)
delay_cnt<=750000;
else if(key==key_reg&&delay_cnt>0)
delay_cnt<=delay_cnt-1;
else
delay_cnt<=0;
always@(posedge clk)
if(delay_cnt==1&&key==1)
key_flag<=1;
else
key_flag<=0;
endmodule
module second( //秒脉冲发生
input wire clk,
output reg sec);
reg [27:0]q1;
always @(posedge clk)
begin
if(q1==500000)
begin
q1<=0;
sec<=~sec;
end
else
q1<=q1+1;
end
endmodule
module counter( //计时cnt24
input wire clk,//秒脉冲信号
input clk2,//标准时钟信号
input clear,
input stop,
output reg [3:0] cnt60_L,
output reg [3:0] cnt60_H,
output reg [3:0] cntm_L,////->cntm_L
output reg [3:0] cntm_H,
output reg led25,led5,//25--K1 5--K3
output reg [7:0] led,
output reg [3:0] cycle
);
initial begin
cnt60_L=0;
cnt60_H=0;
cntm_L=5;
cntm_H=2;
cycle=4'b0000;
end
//状态编码
parameter
[2:0]work25=3'b000;
parameter
[2:0]pause25=3'b001;
parameter
[2:0]reset25=3'b010;
parameter
[2:0]work5=3'b011;
parameter
[2:0]pause5=3'b100;
parameter
[2:0]reset5=3'b101;
parameter
[2:0]resetzhong=3'b110;
parameter
[2:0]workzhong=3'b111;
reg [2:0]cstate;
reg [2:0]nstate;
reg [2:0]en;
reg carry25=0,carry5=0;
//状态转移
always @(posedge clk2 ) //clk2 标准时钟信号
cstate<=nstate;
//次态判断
always @*
case(cstate)
work25:
begin
if(stop==1)
nstate=pause25;
else if(clear==1)
nstate=reset25;
else if(carry25==1)
nstate=work5; // 记满为1,进入计5
else
nstate=work25;
end
work5:
begin
if(stop==1)
nstate=pause5;
else if(clear==1)
nstate=reset25;
else if(carry5==1)
nstate=work25;
else
nstate=work5;
end
pause25:
begin
i