⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clockcalendar.v

📁 数字钟可以说明的具体功能都在文件家中,请仔细参阅,希望大家可以相互学习,共同进步
💻 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 + -