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

📄 clock.v

📁 verilog编写实用多功能电子表
💻 V
字号:
//多功能数字钟
/*信号定义
clk:时钟信号,频率为4Hz;
clk_1k:产生闹铃声、报时音的时钟信号,频率为1024Hz;
mode:功能控制信号;为0:计时功能;
				为1:闹铃功能;
				为2:手动校对功能;
				为3:秒表				////////
turn:在手动校对时,选择是调整小时(1),还是分钟(0),若长时间按
      住该键,可使秒信号清零,用于精确调时;
change:手动调整时,每按一次,计数器加1,按住不放,则连续加1;
start_end:在秒表功能时,按一次启动,再按一次停止;	////////
ms_num:毫秒计数;
hour,min,sec,_10ms_num:时,分,秒,毫秒显示信号;		////////
alert:扬声器驱动信号;
LD_alert:闹铃功能设置显示信号;
LD_hour:小时调整显示信号;
LD_min:分钟调整显示信号;
LD_10ms:秒表功能显示信号;			////////
*/
module clock(clk,clk_1k,mode, change,turn,alert,start_end,
	hour,min,sec,ms_num,_10ms_num,LD_alert,LD_hour,LD_min,LD_10ms);		////
input clk,clk_1k,mode,change,turn,start_end;		////
output alert,LD_alert,LD_hour,LD_min,LD_10ms;		////
output[7:0]hour,min,sec,ms_num,_10ms_num;			////
reg[7:0]hour,min,sec,_10ms_num,hour1,min1,sec1,ahour,amin;		////
reg[2:0]ms_num,m;			////
reg[1:0]fm,num1,num2,num3,num4;
reg[1:0]loop1,loop2,loop3,loop4,sound;
reg LD_hour,LD_min,LD_10ms;		////
reg clk_1Hz,clk_2Hz,clk_100Hz,minclk,hclk;		//??
reg alert1,alert2,ear;
reg count1,count2,counta,countb;	//??
reg cn1,cn2;		//??
wire ct1,ct2,cta,ctb,m_clk,h_clk;	//??

always@(posedge clk_1k)
begin
	if(ms_num==5) begin ms_num<=0;clk_100Hz<=~clk_100Hz; end
	else ms_num<=ms_num+1;
end

always@(posedge start_end)	//秒表计时
	LD_10ms<=~LD_10ms;

always@(posedge clk_100Hz)
	if(LD_10ms)	
	begin
		if(_10ms_num==8'h99) begin _10ms_num<=0;end
		else 
			begin
				if(_10ms_num[3:0]==9)
					begin _10ms_num[3:0]<=0;_10ms_num[7:4]<=_10ms_num[7:4]+1;end
				else _10ms_num[3:0]<=_10ms_num[3:0]+1;
			end
	end


always@(posedge clk)
begin
	clk_2Hz<=~clk_2Hz;
	if(sound==3) begin sound<=0;ear<=1;end	//??
	else begin sound<=sound+1;ear<=0;end	//??
end

always@(posedge clk_2Hz)		//由4Hz的输入时钟产生1Hz的时基信号
	clk_1Hz<=~clk_1Hz;

always@(posedge mode)		//mode信号控制系统的功能转换
begin if(m==3) m<=0;else m<=m+1;end			////

always@(posedge turn)
fm<=~fm;			//??

always			//产生count1,count2,counta,countb四个信号
begin 
	case(m)
	3:
		////
	2:begin if(fm)
		begin count1<=change;{LD_min,LD_hour}<=2;end
		else
		begin counta<=change;{LD_min,LD_hour}<=1;end
		{count2,countb}<=0;
	end
	1:begin if(fm)
		begin count2<=change;{LD_min,LD_hour}<=2;end
		else
		begin countb<=change;{LD_min,LD_hour}<=1;end
		{count1,counta}<=2'b00;
	end
	default:{count1,count2,counta,countb,LD_min,LD_hour}<=0;
	endcase
	end

always@(negedge clk)
	//如果长时间按下“change"键,则生成”num1"信号用于连续快速加1?
if(count2) begin
			if(loop1==3) num1<=1;
			else
			begin loop1<=loop1+1;num1<=0;end
			end
else		begin loop1<=0;num1<=0;end

always@(negedge clk)
if(countb)	begin
			if(loop2==3) num2<=1;
			else
			begin loop2<=loop2+1;num2<=0;end
			end
else		begin loop2<=0;num2<=0;end

always @(negedge clk)
if(count1)	begin
			if(loop3==3) num3<=1;
			else 
			begin loop3<=loop3+1;num3<=0;end
			end
else		begin loop3<=0;num3<=0;end

always @(negedge clk)
if(counta)	begin
			if(loop4==3) num4<=1;
			else 
			begin loop4<=loop4+1;num4<=0;end
			end
else		begin loop4<=0;num4<=0;end

assign ct1=(num3&clk)|(!num3&m_clk);
assign ct2=(num1&clk)|(!num1&count2);
assign cta=(num4&clk)|(!num4&h_clk);
assign ctb=(num2&clk)|(!num2&countb);

always@(posedge clk_1Hz)
		if(!(sec1^8'h59)|turn&(!m))
			begin
			sec1<=0;if(!(turn&(!m)))minclk<=1;
			end
		else begin
			if(sec1[3:0]==4'b1001)
			begin sec1[3:0]<=4'b0000;sec1[7:4]<=sec1[7:4]+1;end
			else sec1[3:0]<=sec1[3:0]+1;minclk<=0;
		end

assign m_clk=minclk||count1;

always@(posedge ct1)	//分计时和分调整
		begin
		if(min1==8'h59) begin min1<=0;hclk<=1;end
		else begin
			if(min1[3:0]==9)
			begin min1[3:0]<=0;min1[7:4]<=min1[7:4]+1;end
		else min1[3:0]<=min1[3:0]+1;hclk<=0;
		end
		end

assign h_clk=hclk||counta;

always@(posedge cta)	//小时计时和小时调
		if(hour1==8'h23) hour1<=0;
		else if (hour1[3:0]==9)
		begin hour1[7:4]<=hour1[7:4]+1;hour1[3:0]<=0;end
		else hour1[3:0]<=hour1[3:0]+1;

always@(posedge ct2)	//定时功能中的分钟调节
		if(amin==8'h59) amin<=0;
		else if (amin[3:0]==9)
		begin amin[7:4]<=amin[7:4]+1;amin[3:0]<=0;end
		else amin[3:0]<=amin[3:0]+1;

always@(posedge ctb)	//定时功能中的小时调节
		if(ahour==8'h23) ahour<=0;
		else if (ahour[3:0]==9)
		begin ahour[7:4]<=ahour[7:4]+1;ahour[3:0]<=0;end
		else ahour[3:0]<=ahour[3:0]+1;

always			//闹铃功能
	if((min1==amin)&&(hour1==ahour)&&(amin|ahour)&&(!change))
	if(sec1<8'h20) alert1<=1;	//控制闹铃时间长短
	else alert1<=0;
	else alert1<=0;
	
always		//时,分,秒的显示控制
	case(m)
	3'b00:begin hour<=hour1;min<=min1;sec<=sec1;end		//计时状态
	3'b01:begin hour<=ahour;min<=amin;sec<=8'hzz;end	//定时状态
	3'b10:begin hour<=hour1;min<=min1;sec<=8'hzz;end	//校时状态	
	endcase

assign LD_alert=(ahour|amin)?1:0;
assign alert=((alert1)?clk_1k&clk:0)|alert2;

always
begin
	if((min1==8'h59)&&(sec1>8'h54)||(!(min1|sec1)))
	if(sec1>8'h54) alert2<=ear&clk_1k;
	else alert2<=!ear&clk_1k;
	else alert2<=0;
end
endmodule

//动态扫描显示模块
module
sel(in1,in2,in3,in4,in5,in6,in7,in8,clk,ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8,a,b,c,d,e,f,g);
input clk;
input [3:0] in1,in2,in3,in4,in5,in6,in7,in8;
output ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8,
	a,b,c,d,e,f,g;
reg ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8,
	a,b,c,d,e,f,g;
reg[3:0] temp,flag;
always@(posedge clk)
begin
{ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8}=8'b00000000;
flag=flag+1;
case(flag)
0:begin temp=in1;ms1=1;end
1:begin temp=in2;ms2=1;end
2:begin temp=in3;ms3=1;end
3:begin temp=in4;ms4=1;end
4:begin temp=in5;ms5=1;end
5:begin temp=in6;ms6=1;end
6:begin temp=in7;ms7=1;end
7:begin temp=in8;ms8=1;end
endcase
case(temp)
4'd0:{a,b,c,d,e,f,g}=7'b1111110;
4'd1:{a,b,c,d,e,f,g}=7'b0110000;
4'd2:{a,b,c,d,e,f,g}=7'b1101101;
4'd3:{a,b,c,d,e,f,g}=7'b1111001;
4'd4:{a,b,c,d,e,f,g}=7'b0110011;
4'd5:{a,b,c,d,e,f,g}=7'b1011011;
4'd6:{a,b,c,d,e,f,g}=7'b1011111;
4'd7:{a,b,c,d,e,f,g}=7'b1110000;
4'd8:{a,b,c,d,e,f,g}=7'b1111111;
4'd9:{a,b,c,d,e,f,g}=7'b1111011;
default:{a,b,c,d,e,f,g}=7'b1111110;
endcase
end
endmodule

















⌨️ 快捷键说明

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