📄 clockcalendar.v
字号:
`timescale 1ns / 100ps
module ClockCalendar(Clk,CE,Mode,SetSel,SetCP,Reset,
YMD,Weekday,
IsHour12,Hour12,AM,
Hour,Min,Sec);
input Clk,CE,SetCP,Reset;
input [1:0]Mode;
input [2:0]SetSel;
output [4:0]Hour12;
output [5:0]Hour;
output [6:0] Min,Sec;
output [2:0]Weekday;
output [23:0]YMD; //year Mon Day
output IsHour12,AM;//显示时间和闹钟时都要用它
//variable
wire [3:0]Year;
wire [4:0]Mon;
reg [5:0]Day;
wire SecCE,SecTC,MinTC,HourTC,DayTC,MonTC;
reg MinCE,HourCE,DayCE,MonCE,YearCE;
reg SecResetCP,YearCP,MonCP,DayCP,WeekdayCP,ToggleTwelveCE,HourCP,MinCP;
wire ClkMin,ClkHour,ClkDay,ClkYear;
reg ClkMon;
wire IsHour12;
assign YMD={4'h0,Year,3'h0,Mon,2'h0,Day};
// wire IsThisMode=(Mode==2'b10)?1:0;
// wire LeapYear=(Year[1:0]==2'b00 && Year[7:4]==4'b0000)?1:0;
wire LeapYear=(Year[1:0]==2'b00)?1:0;
wire [1:0]MonType= //3:大月 2:小月 1:二月 0:闰二月
(Mon==5'h01||Mon==5'h03||Mon==5'h05||Mon==5'h07||Mon==5'h08||Mon==5'h10||Mon==5'h12)?3
:((Mon==5'h04||Mon==5'h06||Mon==5'h09||Mon==5'h11)?2:((LeapYear)?1:0));
wire [5:0] DaysOfMon= // number of Days in the month 31,30,29,28
(MonType==3)?6'h31:((MonType==2)?6'h30:((MonType==1)?6'h29:6'h28));
//
always @(Mode,SetSel,Reset,SetCP,Clk,SecCE,SecTC,MinTC,HourTC,DayTC,MonTC)
if(Mode==2'b10)
case(SetSel)
1: //minute
begin
SecResetCP<=Reset;
MinCE<=SetCP; //调分时,后面所有部分不能计时了
HourCE<=1'b0;
DayCE<=1'b0;
MonCE<=1'b0;
YearCE<=1'b0;
ToggleTwelveCE<=0;
end
2: //Second
begin
SecResetCP<=~SetCP;
MinCE<=SecTC & SecCE;
HourCE<=MinTC & SecTC & SecCE;
DayCE<=HourTC & MinTC & SecTC & SecCE;
MonCE<=DayTC & HourTC & MinTC & SecTC & SecCE;
YearCE<=MonTC & DayTC & HourTC & MinTC & SecTC & SecCE;
ToggleTwelveCE<=0;
end
3: // ToggleTwelve
begin
SecResetCP<=Reset;
MinCE<=SecTC & SecCE;
HourCE<=MinTC & SecTC & SecCE;
DayCE<=HourTC & MinTC & SecTC & SecCE;
MonCE<=DayTC & HourTC & MinTC & SecTC & SecCE;
YearCE<=MonTC & DayTC & HourTC & MinTC & SecTC & SecCE;
ToggleTwelveCE<=SetCP;
end
4: //Year
begin
SecResetCP<=Reset;
MinCE<=SecTC & SecCE;
HourCE<=MinTC & SecTC & SecCE;
DayCE<=HourTC & MinTC & SecTC & SecCE;
MonCE<=DayTC & HourTC & MinTC & SecTC & SecCE;
YearCE<=SetCP;
ToggleTwelveCE<=0;
end
5: //Month
begin
SecResetCP<=Reset;
MinCE<=SecTC & SecCE;
HourCE<=MinTC & SecTC & SecCE;
DayCE<=HourTC & MinTC & SecTC & SecCE;
MonCE<=SetCP;
YearCE<=1'b0;
ToggleTwelveCE<=0;
end
6: //Day
begin
SecResetCP<=Reset;
MinCE<=SecTC & SecCE;
HourCE<=MinTC & SecTC & SecCE;
DayCE<=SetCP;
MonCE<=1'b0;
YearCE<=1'b0;
ToggleTwelveCE<=0;
end
default: //Hour
begin
SecResetCP<=Reset;
MinCE<=SecTC & SecCE;
HourCE<=SetCP;
DayCE<=1'b0;
MonCE<=1'b0;
YearCE<=1'b0;
ToggleTwelveCE<=0;
end
endcase
else //no set
begin
SecResetCP<=Reset;
MinCE<=SecTC & SecCE;
HourCE<=MinTC & SecTC & SecCE;
DayCE<=HourTC & MinTC & SecTC & SecCE;
MonCE<=DayTC & HourTC & MinTC & SecTC & SecCE;
YearCE<=MonTC & DayTC & HourTC & MinTC & SecTC & SecCE;
ToggleTwelveCE<=0;
end
//toggle TwelveHour
TFF U_TwelveHour(.Q(IsHour12),.CE(ToggleTwelveCE),.Clk(Clk),.Clr(Reset));
//Counter for Second
assign SecCE=CE;
BCD2CountTC U_Second
( .CE(SecCE),
.Clk(Clk),
.Count(Sec),
.Reset(SecResetCP),
.TC(SecTC)
);
defparam U_Second.Begin = 0;
defparam U_Second.End = 7'h59;
defparam U_Second.Size = 7;
//Counter for Minute
BCD2CountTC U_Minute
( .CE(MinCE),
.Clk(Clk),
.Count(Min),
.Reset(Reset),
.TC(MinTC)
);
defparam U_Minute.Begin = 0;
defparam U_Minute.End = 7'h59;
defparam U_Minute.Size = 7;
//Counter for Hour
BCD2CountTC U_Hour24
( .CE(HourCE),
.Clk(Clk),
.Count(Hour),
.Reset(Reset),
.TC(HourTC)
);
defparam U_Hour24.Begin = 0;
defparam U_Hour24.End = 6'h23;
defparam U_Hour24.Size = 6;
Hour24_12 U_Hour24_12(Hour,Hour12,AM);
always @(negedge Reset or posedge Clk)
if(!Reset) begin Day<=6'h01;end
else if(DayCE)
begin
if(Day==DaysOfMon) begin Day<=6'h01; end
else
if(Day[3:0]==4'h9)
begin Day[3:0]<=0;Day[5:4]<=Day[5:4]+1;end
else Day<=Day+1;
end
assign DayTC=(Day==DaysOfMon) ? 1 :0;
//counter for month
BCD2CountTC U_Month
( .CE(MonCE),
.Clk(Clk),
.Count(Mon),
.Reset(Reset),
.TC(MonTC)
);
defparam U_Month.Begin = 1;
defparam U_Month.End = 5'h12;
defparam U_Month.Size = 5;
//counter for Year
Count U_Year(.Clk(Clk),.Reset(Reset),.CE(YearCE),.Count(Year));
defparam U_Year.Size = 4;
defparam U_Year.Begin = 0;
defparam U_Year.End = 9;
wire [2:0] FirstDayOfYM;
YM_1stday U_YM_1stday({Year,Mon},FirstDayOfYM);
DayPlus1stday U_DayPlus1stday({Day,FirstDayOfYM},Weekday);
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -