Verilog 实现七段管数字时钟

功能:计时 整点报时 闹钟

module text_1106(clk,addh,shiqu,settime,naoh,naom,addm,second_1,second_2,minute_1,
minute_2,hour_1,hour_2,nao1,nao2,led1);
input clk,shiqu,addh,addm,settime,naoh,naom;//clk 时钟信号 shiqu 24 12计时转换
//addh addm 调整时间 settime 设置时间开关 naoh naom 设置闹钟时间
output reg[6:0] second_1,second_2,minute_1,minute_2,hour_1,hour_2,nao1,nao2;
//显示时分秒
output reg led1; //整点报时,指示灯亮
//七段管译码 共阴极
task seven_show;
 input [3:0]data;
 output [6:0]result;
 begin
  case(data)
   4'd0:result=7'b1000000;
   4'd1:result=7'b1111001;
   4'd2:result=7'b0100100;
   4'd3:result=7'b0110000;
   4'd4:result=7'b0011001;
   4'd5:result=7'b0010010;
   4'd6:result=7'b0000010;
   4'd7:result=7'b1111000;
	4'd8:result=7'b0000000;
   4'd9:result=7'b0011000;
   default:result=7'b0111111;
  endcase
end
endtask
reg clk1=0;//秒的时钟信号
reg naoflag=0,naof=0; //naoflag是否存在脑中的标志 naof是闹钟时间到了的标志
reg [6:1]hour=0,minute=0,second=0;
//计数 闹钟 整点报时 进制转换
always@(posedge clk) //50MHz时钟信号
	begin
	  if(settime==0)
	    begin
		   if(addh==0) begin naoflag=0;naof=0; end
			if(addm==0) begin naof=0; end
			if(naoh==1||naom==1) naoflag=1;
			//要根据不同的情况选用不同的时钟信号,所以并没有直接选用clk1
			//而是在内部分频
		   if(i<24999999) i=i+1;
			else
			   begin
				//本来计时代码有很多if,但是草靠别人的一部分,觉得这个写的特别精简
				//所以采用这种方式计时
				   i=0;clk1=~clk1;
					second=second+1;
					minute=second/60+minute;
					second=second%60;
					hour=hour+minute/60;
					minute=minute%60;
					if(shiqu) hour=hour%12;
					else hour=hour%24;
					//是否存在闹钟
					if(naoflag)
					  begin
					    if(nao_h==hour&&nao_m==minute)
							 begin
							    naof=1;//到时间闹钟显示HELLO
							 end
					  end
					  //整点报时5秒钟
					 if(minute==0&&second<=5)
					    begin
						    led1=1; //灯亮
							 if(second==5) led1=0;
						 end
				end
		  end
		else
		  begin
		  //返回设置的时间,这一段的时钟信号是50MHz,因为需要快速反应
		    if(settime)
			    begin
				  if(addh==0) begin hour=h; second=0;end
				  if(addm==0) begin minute=m; second=0; end
				 end
		  end
	end
//
reg[6:1] h=0,m=0;//记录调整的时间
reg[6:1] nao_h=0,nao_m=0;//记录闹钟的时间
always@(negedge addm)
begin
// 不同的标志位 点击addm 有不同的变化
  if(settime) m=(minute+1)%60;
  if(naom) begin nao_m=(nao_m+1)%60; end
  if(naof) begin nao_m=nao_m+1; end
end
always@(negedge addh)
begin
// 不同的标志位 点击addn 有不同的变化
//addh要考虑到24 和 12 的变化
   if(settime) 
	  begin
	   if(shiqu)
	      h=(hour+1)%12;
	    else h=(hour+1)%24;
	  end
	if(naoh) 
	  begin
	    if(shiqu) nao_h=(nao_h+1)%12;
		 else  nao_h=(nao_h+1)%24;
	  end
end
//显示模块。用不同的标志位控制显示的内容
always@(posedge clk)
begin
	 if(naof==0)//显示计时
	    begin
		     seven_show(second%10,second_1);
			  seven_show(second/10,second_2);
			  seven_show(minute%10,minute_1);
			  seven_show(minute/10,minute_2);
			  seven_show(hour%10,hour_1);
			  seven_show(hour/10,hour_2);
			  //设置闹钟时间的时候,七段管会分别显示设置的分和秒/根据标志位选择
			  if(naoh) begin  seven_show(nao_h%10,nao1);seven_show(nao_h/10,nao2);  end
			  if(naom) begin  seven_show(nao_m%10,nao1);seven_show(nao_m/10,nao2);  end
		 end
	  else//闹钟到点显示“HELLO”
	    begin
				     hour_2=7'b0000000;
				     hour_1=7'b0001001;//H
					  minute_2=7'b0000110;//E
					  minute_1=7'b1000111;//L
					  second_2=7'b1000111;//L
					  second_1=7'b1000000;//O
		 end
end
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值