基本功能:
1、用七段数码管分别显示年、月、日、时、分、秒的数值。时间显示为24进制;
2、可按照要求分别对年、月、日、时、分、秒进行数值设定;
3、考虑润年的设计;
4、可实现闹钟的功能。
计算时间模块:
module Time1(rst,mS,year,mon,day,hour,min,sec,msec);
input rst;
input mS;
output[3:0] mon; // 4'b1100=12
output[4:0] day; // 5'b1_1111=31
output[4:0] hour; // 5'b1_1000=24
output[5:0] min; // 6'b11_1100=60
output[5:0] sec; // 6'b11_1100=60
output[6:0] msec; // 7'b1100100=100
output[11:0] year; // 12'b1000_0011_0100=2100
reg sec_carry,min_carry,hour_carry,day_carry,mon_carry,year_carry;
reg[3:0] mon; // 4'b1100=12
reg[4:0] day; // 5'b1_1111=31
reg[4:0] hour; // 5'b1_1000=24
reg[4:0] date; // 5'b1_1111=31
reg[5:0] min; // 6'b11_1100=60
reg[5:0] sec; // 6'b11_1100=60
reg[6:0] msec; // 7'b1100100=100
reg[11:0] year; // 12'b1000_0011_0100=2100
always@(posedge mS or negedge rst)//msec
begin
if(!rst)
begin
msec<=0;
end
else
if(msec==99)
begin
msec<=0;
sec_carry=1;
end
else
begin
msec<=msec+1'b1;
sec_carry<=0;
end
end
always@(posedge sec_carry or negedge rst) //sec
begin
if(!rst)
begin
sec<=0;
end
else if(sec==59)
begin
sec<=0;
min_carry<=1'b1;
end
else
begin
sec<=sec+1'b1;
min_carry<=0;
end
end
always@(posedge min_carry or negedge rst)//min
begin
if(!rst)
begin
min<=0;
end
else
if(min==59)
begin
min<=0;
hour_carry<=1;
end
else
begin
min<=min+1'b1;
hour_carry<=0;
end
end
always@(posedge hour_carry or negedge rst) //hour
begin
if(!rst)
begin
hour<=0;
end
else
if(hour==23)
begin
hour<=0;
day_carry<=1;
end
else
begin
hour<=hour+1'b1;
day_carry<=0;
end
end
always@(posedge day_carry or negedge rst)//day
begin
if(!rst)
begin
day<=1;
end
else
if(day==date)
begin
day<=1;
mon_carry<=1;
end
else
begin
day<=day+1'b1;
mon_carry<=0;
end
end
always@(posedge mon_carry or negedge rst) //month
begin
if(!rst)
begin
mon<=1;
end
else
if(mon==12)
begin
mon<=1;
year_carry<=1;
end
else
begin
mon<=mon+1'b1;
year_carry<=0;
end
end
always@(posedge year_carry or negedge rst)//year
begin
if(!rst)
begin
year<=2000;
end
else
if(year==2199)
begin
year<=2000;
end
else
begin
year<=year+1'b1;
end
end
always@(*)
begin
case(mon)
1:date=31;
2:
begin
//if(((year_4&&!year_400)&&!year_100)||year_400)
if(!(year%400)||(!(year%4)&&(year%100)))
date=29;
else
date=28;
end
3:date=31;
4:date=30;
5:date=31;
6:date=30;
7:date=31;
8:date=31;
9:date=30;
10:date=31;
11:date=30;
12:date=31;
default:date=30;
endcase
end
endmodule
闹钟模块:
module alarm(clk,add,aSW,alP,alCR,IS_SET,IS_TURN_ON,beep,hour,min,set_hour,set_min);
input add,aSW,clk,alP,alCR;
input [4:0] hour;
input [5:0] min;
output beep,IS_SET,IS_TURN_ON;
output reg [4:0] set_hour; // 5'b1_1000=24
output reg [5:0] set_min; // 6'b11_1100=60
reg a;
reg b;
reg beep_r;
assign beep=beep_r;
assign IS_TURN_ON=b;
assign IS_SET=!alCR;
always@(posedge aSW)
begin
if(a==1)
a<=0;
else
a<=a+1'b1;
end
always@(posedge alP)
begin
b<=!b;
end
always@(posedge add)
begin
if(!alCR)
begin
if(a==0)
if(set_hour==23)
set_hour<=0;
else
set_hour=set_hour+1'b1;
if(a==1)
if(set_min==59)
set_min<=0;
else
set_min=set_min+1'b1;
end
else
begin
set_hour<=0;
set_min<=0;
end
end
always@(posedge clk)
begin
if(b&&(set_hour==hour))
if(set_min==min)
beep_r<=!beep_r;
end
endmodule