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

📄 clock.v

📁 用Altera公司的QuartusII编写的电子钟程序
💻 V
字号:
module clock(clk10ms,key1,key2,key3,key4,disp,spk);
	input clk10ms,key1,key2,key3,key4;
	output [15:0] disp;
	output spk;
	reg [15:0] disp;
	
	reg clk1s,clk1m,clk1h,clk1d,set=1,run=0,num=0,alm_set=1;
	reg	lastas=1,lastkey1=1,lastkey2=1,lastkey3=1,lastkey4=1;
	reg [6:0] tenms;
	reg [5:0] s;
	reg [5:0] m=0;
	reg [4:0] h=0;
	reg [5:0] alm_m=0;
	reg [4:0] alm_h=0;
	reg [1:0] pos;
	reg [1:0] state=0;
	reg [13:0] sw;
	
	assign spk=~|({alm_h,alm_m}^{h,m});
	
	////////////////state control////////////////////////
	always@(posedge clk10ms)
	begin
		if({lastkey1,key1}==2'b10)
			state=state+1'b1;
						
		case (state)
			default:	//display clock
			begin
				set=1'b1;
				case ({key1,key2,key3,key4})
					4'b1111:
					begin
						disp[3:0]=m%4'd10;
						disp[7:4]=m/4'd10;
						disp[11:8]=h%4'd10;
						disp[15:12]=h/4'd10;
					end	
					4'b1110: 
					begin
						disp[15:12]=s/4'd10;
						disp[11:8]=s%4'd10;
						disp[7:4]=tenms/4'd10;
						disp[3:0]=tenms%4'd10;
					end	
					4'b1101: 
					begin
						disp[15:12]=alm_h/4'd10;
						disp[11:8]=alm_h%4'd10;
						disp[7:4]=alm_m/4'd10;
						disp[3:0]=alm_m%4'd10;
					end	
					4'b1011: 
					begin
						disp[15:12]=(sw/10'd1000)%4'd10;
						disp[11:8]=(sw/7'd100)%4'd10;
						disp[7:4]=(sw/4'd10)%4'd10;
						disp[3:0]=sw%4'd10;
					end	
					default:
					begin
						disp[3:0]=m%4'd10;
						disp[7:4]=m/4'd10;
						disp[11:8]=h%4'd10;
						disp[15:12]=h/4'd10;
					end
				endcase
			end
			2'b01:         //set clock
			begin
				if ({lastkey2,key2}==2'b10)
					pos=pos+1'b1;
				if(clk1s)
				case (pos)
					2'b00:	disp[3:0]=0;
					2'b01:	disp[7:4]=0;
					2'b10:	disp[11:8]=0;
					2'b11:	disp[15:12]=0;
				endcase
				else
				begin
					disp[3:0]=m%4'd10;
					disp[7:4]=m/4'd10;
					disp[11:8]=h%4'd10;
					disp[15:12]=h/4'd10;
				end
				if ({lastkey3,key3}==2'b10)
				begin
					num=1'b1;
					set=0;
				end
				else if ({lastkey4,key4}==2'b10)
				begin
					num=0;
					set=0;
				end
				else 
					set=1'b1;
			end
			2'b10:		//set alarm
			begin
				set=1'b1;
				if ({lastkey2,key2}==2'b10)
					pos=pos+1'b1;
				if(clk1s)
				case (pos)
					2'b00:	disp[3:0]=0;
					2'b01:	disp[7:4]=0;
					2'b10:	disp[11:8]=0;
					2'b11:	disp[15:12]=0;
				endcase
				else
				begin
					disp[3:0]=alm_m%4'd10;
					disp[7:4]=alm_m/4'd10;
					disp[11:8]=alm_h%4'd10;
					disp[15:12]=alm_h/4'd10;
				end
				
				if ({lastkey3,key3}==2'b10)
				begin
					num=1'b1;
					alm_set=0;
				end
				else if ({lastkey4,key4}==2'b10)
				begin
					num=0;
					alm_set=0;
				end
				else 
					alm_set=1'b1;
			end
			2'b11:		//stopwatch
			begin
				begin
					disp[15:12]=(sw/10'd1000)%4'd10;
					disp[11:8]=(sw/7'd100)%4'd10;
					disp[7:4]=(sw/4'd10)%4'd10;
					disp[3:0]=sw%4'd10;
				end	
				if({lastkey3,key3}==2'b01)
				begin
					run=1'b1;
				end
				else if({lastkey4,key4}==2'b10)
				begin
					run=0;
				end
				else if({lastkey2,key2}==2'b10)
					sw=0;
				if(run)
					if(sw<'d9999)
						sw=sw+1'b1;
					else
						sw=0;

			end	
		endcase
		lastkey1=key1;
		lastkey2=key2;
		lastkey3=key3;
		lastkey4=key4;
	end
	
	///////////////////clock///////////////////
	always@(posedge clk10ms)
	begin
		if (tenms<'d99)
			tenms=tenms+1'b1;
		else
			tenms=0;
		if (tenms=='d50)
			clk1s=0;
		if (tenms==0)
			clk1s=1'b1;
	end
	
	always@(posedge clk1s)
	begin
		if (s<'d59)
			s=s+1'b1;
		else
			s=0;
		if (s=='d30)
			clk1m=0;
		if (s==0)	
			clk1m=1'b1;
	end

	always@(posedge clk1m or negedge set)
	begin
		if(~set)
			if(~pos[1])
		begin
			if (~pos[0])
				if (~num)
					if (m>0)
						m=m-1'b1;
					else 
						m='d59;
				else
					if (m<'d59)
						m=m+1'b1;
					else
						m=0;
			else 
				if (~num)	
					if (m>'d9)
						m=m-'d10;
					else 
						m=m%'d10+'d50;
				else 
					if (m<'d50)
						m=m+'d10;
					else 
						m=m%'d10;
		end
			else;
		else
		begin
			if (m<'d59)
				m=m+1'b1;
			else
				m=0;
			if (m=='d30)
				clk1h=0;
			if (m==0)	
				clk1h=1'b1;
		end
	end
	
	always@(posedge clk1h or negedge set)
	begin
		if (~set)
			if(pos[1])
		begin
			if (~pos[0])
				if (~num)
					if (h>0)
						h=h-1;
					else 
						h='d23;
				else
					if (h<'d23)
						h=h+1;
					else
						h=0;
			else 
				if (~num)
					if (h>'d9)
						h=h-'d10;
					else 
						h=h%'d10+'d10;
				else 		
					if (h<'d10)
						h=h+'d10;
					else 
						h=h%'d10;
		end
			else;
		else
		begin
			if (h<'d23)
				h=h+1;
			else
				h=0;
			if (h=='d12)
				clk1d=0;
			if (h==0)	
				clk1d=1;
		end
	end
	///////////////////alarm//////////////////////////
	always@(posedge clk10ms)
	begin
	if({lastas,alm_set}==2'b10)
		if(~pos[1])
		begin
			if (~pos[0])
				if (~num)
					if (alm_m>0)
						alm_m=alm_m-1;
					else 
						alm_m='d59;
				else
					if (alm_m<'d59)
						alm_m=alm_m+1;
					else
						alm_m=0;
			else 
				if (~num)	
					if (alm_m>'d9)
						alm_m=alm_m-'d10;
					else 
						alm_m=alm_m%'d10+'d50;
				else 
					if (alm_m<'d50)
						alm_m=alm_m+'d10;
					else 
						alm_m=alm_m%'d10;
		end
		else
		begin
			if (~pos[0])
				if (~num)
					if (alm_h>0)
						alm_h=alm_h-1;
					else 
						alm_h='d23;
				else
					if (alm_h<'d23)
						alm_h=alm_h+1;
					else
						alm_h=0;
			else 
				if (~num)
					if (alm_h>'d9)
						alm_h=alm_h-'d10;
					else 
						alm_h=alm_h%'d10+'d10;
				else 		
					if (alm_h<'d10)
						alm_h=alm_h+'d10;
					else 
						alm_h=alm_h%'d10;
		end
	else;
	lastas=alm_set;
	end
endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -