📄 date_screen_set.v
字号:
// **********************************************************************************
// FileName :date_screen_set.v
//
// Discription :日期的显示与设置模块
//
// Date :
//
// Author : dandan
// **********************************************************************************
module date_screen_set(clk_5,reset,set,day_carry,mode,mode_date,year_count,month_count,day_count);
input clk_5,reset;
input set;
input day_carry;
input [5:0] mode;
input [2:0] mode_date;
output [7:0] year_count,month_count,day_count;
reg [7:0] year_count,month_count,day_count;
reg [3:0] set_count;
//主状态机
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 Day_set=3'b001, //设置日子
Month_set=3'b010, //设置月
Year_set=3'b100; //设置年
always@(posedge clk_5)
if(reset)
begin
year_count<=05; //为了仿真方便,初始日期设置为05年12月31日
month_count<=12;
day_count<=31;
set_count<=0;
end
else
if(mode==Date_set) //当设置日期时
begin
case(mode_date)
Year_set: //设置年
begin
if(set) //开始设置,当set计数器计到1s时,每周期年计数器+1
begin
if(!set_count)
begin
set_count<=set_count+1;
if(year_count<99) year_count<=year_count+1;
else year_count<=0;
end
else if((set_count<5)&&(set_count>0)) set_count<=set_count+1;
else
begin
if(year_count<99) year_count<=year_count+1;
else year_count<=0;
end
end
else set_count<=0;
end
Month_set: //设置月
begin
if(set) //开始设置,当set计数器计到1s时,每周期月计数器+1
begin
if(!set_count)
begin
set_count<=set_count+1;
if(month_count<12) month_count<=month_count+1;
else month_count<=1;
end
else if((set_count<5)&&(set_count>0)) set_count<=set_count+1;
else
begin
if(month_count<12) month_count<=month_count+1;
else month_count<=1;
end
end
else set_count<=4'b0;
end
Day_set: //设置天
begin
if(set) //开始设置,当set计数器计到1s时,每周期日计数器+1
begin
if(!set_count)
begin
set_count<=set_count+1;
case(month_count)
4,6,9,11: //4,6,9,11月
begin
if(day_count<30) day_count<=day_count+1;
else day_count<=1;
end
2: //考虑到闰月
begin
if(day_count<28) day_count<=day_count+1;
else day_count<=1;
end
1,3,5,7,8,10,12://1,3,5,7,8,10,12月
begin
if(day_count<31) day_count<=day_count+1;
else day_count<=1;
end
endcase
end
else if((set_count<5)&&(set_count>0)) set_count<=set_count+1;
else
begin
case(month_count)
4,6,9,11: //4,6,9,11月
begin
if(day_count<30) day_count<=day_count+1;
else day_count<=1;
end
2: //考虑到闰月
begin
if(day_count<28) day_count<=day_count+1;
else day_count<=1;
end
1,3,5,7,8,10,12://1,3,5,7,8,10,12月
begin
if(day_count<31) day_count<=day_count+1;
else day_count<=1;
end
endcase
end
end
else set_count<=0;
end
endcase
end
else
begin
if(day_carry) //如果有日进位,日期开始计数
begin
if((day_count<30)&&(month_count==4||month_count==6||month_count==9||month_count==11))
begin //4,6,9,11月30天
day_count<=day_count+1;
end
else if((day_count<28)&&(month_count==2))
begin //2月28天
day_count<=day_count+1;
end
else if((day_count<31)&&(month_count||month_count==3||month_count==5||month_count==7||month_count==8||month_count==10||month_count==12))
begin //1,3,5,7,8,10,12月31天
day_count<=day_count+1;
end
else
begin
day_count<=1;
if(month_count<12) month_count<=month_count+1;
else//如果日期等于该月日期上限,日期归1,月计数器+1,同理年计数器+1
begin
month_count<=1;
if(year_count<99) year_count<=year_count+1;
else year_count<=0;
end
end
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -