time_screen_set.v
字号:
// **********************************************************************************
// FileName :time_screen_set.v
//
// Discription :时间的显示与设置模块
//
// Date :
//
// Author : dandan
// **********************************************************************************
module time_screen_set(clk_5,reset,set,mode,mode_time,hour_count,minute_count,sec_count,day_carry);
input clk_5,reset;
input set;
input [5:0] mode;
input [2:0] mode_time;
output [7:0] hour_count,minute_count,sec_count;
output day_carry;
//主状态机
parameter Time_screen=6'b000_001, //时间正常显示
Time_set=6'b000_010, //设置时间
Date_set=6'b000_100, //设置日期
Clock_set=6'b001_000, //设置闹钟
Sec_clock=6'b010_000, //秒表
O_light_set=6'b100_000; //设置整点报时
//设置时间状态机
parameter Hour_set=3'b100, //设置小时
Minute_set=3'b010, //设置分钟
Sec_set=3'b001; //设置秒
reg [7:0] hour_count,minute_count,sec_count,msec_count;
reg day_carry; //日进位
reg [3:0] set_count; //set计数器
always@(posedge clk_5)
if(reset)
begin
hour_count<=23; //为了仿真方便,从23点59分57秒开始计时
minute_count<=59;
sec_count<=56;
msec_count<=4;
day_carry<=0;
set_count<=0;
end
else
if(mode==Time_set) //设置时间状态
begin
case(mode_time)
Hour_set: //设置小时
begin
if(set) //开始设置
begin
if(!set_count) //如果set是刚被按下
begin
set_count<=set_count+1; //计数器开始计数
if(hour_count<23) hour_count<=hour_count+1; //且小时计数器+1
else hour_count<=0;
end
else if((set_count<5)&&(set_count>0)) set_count<=set_count+1;
else //如果计数器小于5,继续计数
begin //如果计数器大于5,每clk_5的
if(hour_count<23) hour_count<=hour_count+1; //上升沿小时计数器+1
else hour_count<=0;
end
end
else set_count<=0;
end
Minute_set: //设置分钟
begin
if(set) //开始设置
begin
if(!set_count) //如果set是刚被按下
begin
set_count<=set_count+1; //计数器开始计数
if(minute_count<59) minute_count<=minute_count+1;
else minute_count<=0; //且分钟计数器+1
end
else if((set_count<5)&&(set_count>0)) set_count<=set_count+1;
else //如果计数器小于5,继续计数
begin //否则每0。2s分钟+1
if(minute_count<59) minute_count<=minute_count+1;
else minute_count<=0;
end
end
else set_count<=0;
end
Sec_set: if(set) sec_count<=0; //秒清零
endcase
end
else //时间显示计数
begin
if(hour_count==23&&minute_count==59&&sec_count==59&&msec_count==4)
begin //当23:59:59时,显示00:00:00,且日进位
day_carry<=1;
hour_count<=0;
minute_count<=0;
sec_count<=0;
msec_count<=0;
end
else if(minute_count==59&&sec_count==59&&msec_count==4)
begin //当xx:59:59时,显示xx:00:00
day_carry<=0;
hour_count<=hour_count+1;
minute_count<=0;
sec_count<=0;
msec_count<=0;
end
else if(sec_count==59&&msec_count==4)
begin //当xx:xx:59时,显示xx:xx:00
day_carry<=0;
minute_count<=minute_count+1;
sec_count<=0;
msec_count<=0;
end
else if(msec_count==4)
begin //否则秒+1
day_carry<=0;
sec_count<=sec_count+1;
msec_count<=0;
end
else
begin
day_carry<=0;
msec_count<=msec_count+1;
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -