基于FPGA的数字钟设计

这篇具有很好参考价值的文章主要介绍了基于FPGA的数字钟设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

这篇文章通过VHDL代码实现数字钟的功能,绑定引脚就可以看到实际的效果。

一、代码

//右下角坐标,如何改变时间尺度
module CLOCK1(
    input                clk  ,    //50Mhz系统时钟	  
    input                add,    //按下加一
    input                sub,     //按下减一
	 input                en, //确认	
	 input                out,
	 input       [7:0]    key,  
	 input       [3:0]    type,
	 input        countmode,
	 input        rem_button,
	 input        backcountkey,
	 input        i_know_botton,
    output  reg  [7:0]   sel,//数码管位选(选择当前要显示的数码管)
	 output  reg  [7:0]   seg//数码管段选(当前要显示的内容)
  
 );
	 reg [31:0]			 cnt_clock;
	 reg [15:0]        cnt_second=0;    //秒计数
	 reg [15:0]        cnt_minute=0;   //分计数
	 reg [15:0]        cnt_hour=0;    //时计数	 
	 reg [15:0]        second=0;    //秒计数
	 reg [15:0]        minute=0;   //分计数
	 reg [15:0]        hour=0;    //时计数
	 reg [15:0]        day=28;    //天计数
	 reg [15:0]        month=9;    //月计数
	 reg [15:0]        year=2021;    //月计数
	 reg  [31:0]      divider_cnt;//25000-1
	 reg               clk_1K;
    reg  [3:0]       data_tmp;//数据缓存
    reg [2:0]        clk_1s;	
    reg[31:0]     display;
    reg           data0=0;

	 reg [31:0]    setnum=0;
    reg [31:0]    cnt_clock_half=0; 	
    reg     clk_half;
    reg [31:0]    cnt_n;

//产生一秒时钟信号开始
always@(posedge clk)
begin
	if(cnt_clock == 31'd24999999)
	   begin
		cnt_clock <= 15'd0;	
		
		end
	else
	   begin
		cnt_clock <= cnt_clock + 1'b1;	
		
		end
end

always@(posedge clk)
begin
	if(cnt_clock == 31'd24999999)
		clk_1s <= ~clk_1s;
	else
		clk_1s <= clk_1s;	
end	
//产生一秒时钟信号结束

//按键消抖模块开始
reg [3:0] keyval= 0;
 parameter DURATION = 24'd50_000;
assign ken_enable = key[0] |key[1]|key[2] |key[3];
//always @(posedge clk)  //按键的计数
//begin
//		if(ken_enable == 1&&keyval==0) 
//		begin
//			if(cnt_n == DURATION)
//			begin
//				cnt_n <= cnt_n;
//				if(key[0])
//					keyval=1;
//				else if(key[1])
//					keyval=2;
//				else if(key[2])
//					keyval=3;
//				else if(key[3])
//					keyval=4;
//			end
//			else 
//				cnt_n <= cnt_n + 1'b1;
//		end
//		else if(ken_enable == 0)
//		begin
//			cnt_n <= 16'b0;
//			keyval=0;
//		end
//			
//end  
  
//按键消抖模块结束 
reg [3:0] keyval2=0; 
//时间计算模块开始
//always@(posedge clk_1s)
reg [31:0] cnt1s = 0;
reg flag1s=0;
reg flag_stop=0;
reg last_backcountkey;

reg  last_i_know_botton;
reg clock_time_arrflag=0;
always@(posedge clk)
begin
	 cnt1s=cnt1s+1;
	 if(cnt1s==49_999_999)
	 begin
		cnt1s=0;
		flag1s=1;
	 end
	 	 
	 	if(ken_enable == 1&&keyval==0) 
		begin
			if(cnt_n == DURATION)
			begin
				cnt_n <= cnt_n;
				if(key[0])
					keyval=1;
				else if(key[1])
					keyval=2;
				else if(key[2])
					keyval=3;
				else if(key[3])
					keyval=4;
			end
			else 
				cnt_n <= cnt_n + 1'b1;
		end
		else if(ken_enable == 0)
		begin
			cnt_n <= 16'b0;
		end
	 
	 if(flag1s==1)  //一秒钟后进入的模块
	 begin 
	 flag1s=0;
	 

	 if(type==6&&backcountkey==1)
	 begin
	 
		if(cnt_second==0)
		begin
			if(cnt_minute==0)
			begin
				if(cnt_hour>0)
				begin
					cnt_hour=cnt_hour-1;
					cnt_minute=59;
					cnt_second=59;
				end
			end
			else
			begin
				cnt_minute=cnt_minute-1;
				cnt_second=59;
			end
		end
		else
			cnt_second=cnt_second-1;
		if(cnt_second==0&&cnt_minute==0&&cnt_hour==0)
			flag_stop=1;
		else
			flag_stop=0;
			
	 end
	 
	 
		 second=second+1;
		 if(second==31'd60) 
		 begin
		 second=0;
		 minute=minute+1;
		 end
		 
		 if(minute==31'd60)
		 begin
		 minute=0;
		 hour=hour+1;
		 end
		 
		 if(hour == 31'd24)
		 begin	
		 hour=0;
		 day=day+1;
		 end
	 if(month == 31'd1)  //1月
	 begin	 
		   if(day == 31'd32)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
	 end	 
	 
	 if(month == 31'd2)  //2月特殊处理 
	 begin
        if(year%4==0&&day==30)
		  begin
		       day=1;
		       month=month+1;
		  end
		  if(year%4!=0&&day==29)
		  begin
		       day=1;
		       month=month+1;
		  end
	 end	
	 
	if(month == 31'd3)  //3月
	begin	
		   if(day == 31'd32)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
   end
	
	if(month == 31'd4)  //4月
	begin	
		   if(day == 31'd31)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
   end
	
	if(month == 31'd5)  //5月
	begin	
		   if(day == 31'd32)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
	end
	
	if(month == 31'd6)  //6月
	begin	
		   if(day == 31'd31)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
	end
	
	if(month == 31'd7)  //7月
	begin	
		   if(day == 31'd32)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
	end
	
	if(month == 31'd8)  //8月
	begin	
		   if(day == 31'd32)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
	end
	
	if(month == 31'd9)  //9月
	   begin	
		   if(day == 31'd31)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
	end
	
	if(month == 31'd10)  //10月
	   begin	
		   if(day == 31'd32)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
	end
	
	if(month == 31'd11)  //11月
	begin	
		   if(day == 31'd31)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
	end
	
	if(month == 31'd12)  //12月
	begin	
		   if(day == 31'd32)
		     	 begin	
		       day=1;
		       month=month+1;
		       end		
	end
	
	if(month == 31'd13)
	begin	
		month=1;
		year=year+1;
	end
	
	if(countmode==0&type!=5)
	begin	
	count_dis_num=0;	
	end
	
	//闹钟模式
	if(alarm_s!=0||alarm_minute!=0||alarm_hour!=0)	
	begin
     if(alarm_s==second&&alarm_minute==minute&&alarm_hour==hour)
      begin
		clock_time_arrflag=1;
		end	
	end
	
	if(i_know_botton!=last_i_know_botton)
	begin
	    clock_time_arrflag=0;
	end
	
	last_i_know_botton=i_know_botton;
	
	//闹钟模式
	
	
	//按键控制加减部分
	
	if(keyval==1) 
	begin
			if(type==1||type==3||type==7||type==8)
			begin
				if(setnum==2)
						setnum <= setnum;
				else
						setnum <= setnum+1;
			end		
			if(type==5)
			begin
				if(count_dis_num==49)
						count_dis_num <= count_dis_num;
					else
						count_dis_num <= count_dis_num+1;
			end		
	end
	
	else if(keyval==2) 
	begin
			if(type==1||type==3||type==7||type==8)
			begin
				if(setnum==0)
					setnum <= setnum;
				else
					setnum <= setnum-1;
		   end
			
			if(type==5)
			begin
				if(count_dis_num==0)
						count_dis_num <= count_dis_num;
					else
						count_dis_num <= count_dis_num-1;
			end
	end
	
	else if(keyval==3) 
	begin
	
	    if(type==1)
		 begin
         if(setnum==0) year=year+1;
			if(setnum==1) month=month+1;
			if(setnum==2) day=day+1;
		 end
		 
		 if(type==3)
		 begin
         if(setnum==0) hour=hour+1;
			if(setnum==1) minute=minute+1;
			if(setnum==2) second=second+1;
		 end
		 
		 if(type==7)
		 begin
         if(setnum==0) cnt_hour=cnt_hour+1;
			if(setnum==1) cnt_minute=cnt_minute+1;
			if(setnum==2) cnt_second=cnt_second+1;
		 end
		 
		 if(type==8)
		 begin
         if(setnum==0) alarm_hour=alarm_hour+1;
			if(setnum==1) alarm_minute=alarm_minute+1;
			if(setnum==2) alarm_s= alarm_s+1;
		 end
		 
	end	
	else if(keyval==4) 
	begin
		 if(type==1)
		 begin
         if(setnum==0) year=year-1;
			if(setnum==1) month=month-1;
			if(setnum==2) day=day-1;
		end
		
		if(type==3)
		 begin
         if(setnum==0) hour=hour-1;
			if(setnum==1) minute=minute-1;
			if(setnum==2) second=second-1;
		 end
		 
		 if(type==7)
		 begin
         if(setnum==0) cnt_hour=cnt_hour-1;
			if(setnum==1) cnt_minute=cnt_minute-1;
			if(setnum==2) cnt_second=cnt_second-1;
		 end
		 
		 	if(type==8)
		 begin
         if(setnum==0) alarm_hour=alarm_hour-1;
			if(setnum==1) alarm_minute=alarm_minute-1;
			if(setnum==2) alarm_s= alarm_s-1;
		 end
		 
		 
	end
	keyval=0;
	end
	//按键控制加减结束	
end

//时间计算模块结束

//	分频计数器计数模块
	always@(posedge clk)
	if(divider_cnt == 15'd24999)
		divider_cnt <= 15'd0;
	else
		divider_cnt <= divider_cnt + 1'b1;
//1K扫描时钟生成模块		
	always@(posedge clk)
	if(divider_cnt == 15'd24999)
		clk_1K <= ~clk_1K;
	else
		clk_1K <= clk_1K;		
//数码管位选模块		
always@(posedge clk_1K)  
	if(sel == 8'b0111_1111)
		sel <= 8'b1111_1110;
	else		sel = (sel << 1) | 8'b0000_0001;
//数码管段选
always@(sel)
		case(sel)
			8'b1111_1110:data_tmp = display[3:0];
			8'b1111_1101:data_tmp = display[7:4];	
			
			8'b1111_1011:data_tmp = display[11:8];
			8'b1111_0111:data_tmp = display[15:12];	
			
			8'b1110_1111:data_tmp = display[19:16];	
		   8'b1101_1111:data_tmp = display[23:20];
			
			8'b1011_1111:data_tmp = display[27:24];	
		   8'b0111_1111:data_tmp = display[31:28];			
			default:data_tmp = data0;
		endcase
always@(data_tmp)
	case(data_tmp)
			4'h0 : seg = ~8'b0011_1111; //显示"0"
			4'h1 : seg = ~8'b0000_0110; //显示"1"
			4'h2 : seg = ~8'b0101_1011; //显示"2"
			4'h3 : seg = ~8'b0100_1111; //显示"3"
			4'h4 : seg = ~8'b0110_0110; //显示"4"
			4'h5 : seg = ~8'b0110_1101; //显示"5"
			4'h6 : seg = ~8'b0111_1101; //显示"6"
			4'h7 : seg = ~8'b0000_0111; //显示"7"
			4'h8 : seg = ~8'b0111_1111; //显示"8"
			4'h9 : seg = ~8'b0110_1111; //显示"9"
			4'h10 : seg = ~8'b0011_1111; //显示"-"
			default :seg = ~8'b0000_0000;
	endcase				  		  
//数码管模块结束	



//一秒时钟产生
	always@(posedge clk)
begin
	if(cnt_clock_half == 31'd24999999)
	   begin
		cnt_clock_half <= 15'd0;	
		end
	else
	   begin
		cnt_clock_half <= cnt_clock_half + 1'b1;			
		end
end	
always@(posedge clk)
begin
	if(cnt_clock_half == 15'd24999999)
		clk_half <= ~clk_half;
	else
		clk_half <= clk_half;	
end		
//一秒时钟结束

//年月日显示模块开始
 	always@(posedge clk)
begin
    //模式0
	if(type == 31'd0)  
	   begin	
		display[31:28]=year/1000;
		display[27:24]=year/100%10;	
		
		display[23:20]=year/10%10;
		display[19:16]=year%10;
		
		display[15:12]=month/10;
		display[11:8]=month%10;
		
		display[7:4]=day/10;
		display[3:0]=day%10;
		end
	// display[31:28]=clk_half;  //测试 使用
	
	//模式1
   if(type==31'd1&&clk_half==1)
	   begin	
		display[31:28]=year/1000;
		display[27:24]=year/100%10;	
		
		display[23:20]=year/10%10;
		display[19:16]=year%10;
		
		display[15:12]=month/10;
		display[11:8]=month%10;
		
		display[7:4]=day/10;
		display[3:0]=day%10;
		end
	 if(type==31'd1&&clk_half==0&&setnum==0)
	   begin	
		display[31:28]=15'd11;
		display[27:24]=15'd11;
		
		display[23:20]=15'd11;
		display[19:16]=15'd11;
		
		display[15:12]=month/10;
		display[11:8]=month%10;
		
		display[7:4]=day/10;
		display[3:0]=day%10;
		end
		
	  if(type==31'd1&&clk_half==0&&setnum==1)
	   begin	
		display[31:28]=year/1000;
		display[27:24]=year/100%10;	
		
		display[23:20]=year/10%10;
		display[19:16]=year%10;
		
		display[15:12]=15'd11;
		display[11:8]=15'd11;
		
		display[7:4]=day/10;
		display[3:0]=day%10;
		end
		
		if(type==31'd1&&clk_half==0&&setnum==2)
	   begin	
		display[31:28]=year/1000;
		display[27:24]=year/100%10;	
		
		display[23:20]=year/10%10;
		display[19:16]=year%10;
		
		display[15:12]=month/10;
		display[11:8]=month%10;
		
		display[7:4]=15'd11;
		display[3:0]=15'd11;
		end

		//模式2
		if(type == 31'd2&&clock_time_arrflag==0)  
	   begin	
		display[31:28]=hour/10;
		display[27:24]=hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=minute/10;
		display[15:12]=minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=second/10;
		display[3:0]=second%10;
		end
		
		//模式2
		if(type == 31'd2&&clock_time_arrflag==1&&clk_half==0)  
	   begin	
		display[31:28]= alarm_hour/10;
		display[27:24]= alarm_hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]= alarm_minute/10;
		display[15:12]= alarm_minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]= alarm_s/10;
		display[3:0]= alarm_s%10;
		end
		
		//模式2
		if(type == 31'd2&&clock_time_arrflag==1&&clk_half==1)  
	   begin	
		display[31:28]=31'd10;
		display[27:24]=31'd10;
		
		display[23:20]=31'd10;
		
		display[19:16]=31'd10;
		display[15:12]=31'd10;;
		
		display[11:8]=31'd10;
		
		display[7:4]=31'd10;
		display[3:0]=31'd10;
		end
		
		
		//模式3
		
		if((type == 31'd3)&&clk_half==1)  //模式0显示年月日
	   begin	
		display[31:28]=hour/10;
		display[27:24]=hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=minute/10;
		display[15:12]=minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=second/10;
		display[3:0]=second%10;
		end
		

		
		if((type == 31'd3)&&clk_half==0&&setnum==0)  //模式0显示年月日
	   begin	
		display[31:28]=15'd11;
		display[27:24]=15'd11;
		
		display[23:20]=31'd10;
		
		display[19:16]=minute/10;
		display[15:12]=minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=second/10;
		display[3:0]=second%10;
		end
		

		
		if((type == 31'd3)&&clk_half==0&&setnum==1)  //模式0显示年月日
	   begin	
		display[31:28]=hour/10;
		display[27:24]=hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=15'd11;
		display[15:12]=15'd11;
		
		display[11:8]=31'd10;
		
		display[7:4]=second/10;
		display[3:0]=second%10;
		end
			
		if((type == 31'd3)&&clk_half==0&&setnum==2)  //模式0显示年月日
	   begin	
		display[31:28]=hour/10;
		display[27:24]=hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=minute/10;
		display[15:12]=minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=15'd11;
		display[3:0]=15'd11;
		end
				
		//模式4
		if(type == 31'd4)  //模式0显示年月日
	   begin	
		display[31:28]=timer_minute/10;
		display[27:24]=timer_minute%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=timer_s/10;
		display[15:12]=timer_s%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=timer_decimal/10;
		display[3:0]=timer_decimal/10;
		end
		
		//模式5
		if(type == 31'd5)  //模式0显示年月日
	   begin	
		display[31:28]=count_dis_num%10;
				
		display[23:20]=31'd10;
		
		display[19:16]=rem_timer_s[count_dis_num]/10;
		display[15:12]=rem_timer_s[count_dis_num]%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=rem_timer_decimal[count_dis_num]/10;
		display[3:0]=rem_timer_decimal[count_dis_num]/10;
		end
		
		
		if(type == 31'd6)  
	   begin	
		display[31:28]=cnt_hour/10;
		display[27:24]=cnt_hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=cnt_minute/10;
		display[15:12]=cnt_minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=cnt_second/10;
		display[3:0]=cnt_second%10;
		end
		
		
		//模式7
		if((type == 31'd7)&&clk_half==1)  //模式0显示年月日
	   begin	
		display[31:28]=cnt_hour/10;
		display[27:24]=cnt_hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=cnt_minute/10;
		display[15:12]=cnt_minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=cnt_second/10;
		display[3:0]=cnt_second%10;
		end
		
		if((type == 31'd7)&&clk_half==0&&setnum==0)  //模式0显示年月日
	   begin	
		display[31:28]=15'd11;
		display[27:24]=15'd11;
		
		display[23:20]=31'd10;
		
		display[19:16]=cnt_minute/10;
		display[15:12]=cnt_minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=cnt_second/10;
		display[3:0]=cnt_second%10;
		end
		
		if((type == 31'd7)&&clk_half==0&&setnum==1)  //设置倒计时
	   begin	
		display[31:28]=cnt_hour/10;
		display[27:24]=cnt_hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=15'd11;
		display[15:12]=15'd11;
		
		display[11:8]=31'd10;
		
		display[7:4]=cnt_second/10;
		display[3:0]=cnt_second%10;
		end
		
		if((type == 31'd7)&&clk_half==0&&setnum==2)  //模式0显示年月日
	   begin	
		display[31:28]=cnt_hour/10;
		display[27:24]=cnt_hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=cnt_minute/10;
		display[15:12]=cnt_minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=15'd11;
		display[3:0]=15'd11;
		end
		
      //模式八
		if(type == 31'd8)  
	   begin	
		display[31:28]=alarm_hour/10;
		display[27:24]=alarm_hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]= alarm_minute/10;
		display[15:12]= alarm_minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]= alarm_s/10;
		display[3:0]= alarm_s%10;
		end
		
		if((type == 31'd8)&&clk_half==0&&setnum==0)  //模式0显示年月日
	   begin	
		display[31:28]=15'd11;
		display[27:24]=15'd11;
		
		display[23:20]=31'd10;
		
		display[19:16]=alarm_minute/10;
		display[15:12]=alarm_minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=alarm_s/10;
		display[3:0]=alarm_s%10;
		end
		
		if((type == 31'd8)&&clk_half==0&&setnum==1)  //设置倒计时
	   begin	
		display[31:28]=alarm_hour/10;
		display[27:24]=alarm_hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=15'd11;
		display[15:12]=15'd11;
		
		display[11:8]=31'd10;
		
		display[7:4]=alarm_s/10;
		display[3:0]=alarm_s%10;
		end
		
		if((type == 31'd8)&&clk_half==0&&setnum==2)  //模式0显示年月日
	   begin	
		display[31:28]=alarm_hour/10;
		display[27:24]=alarm_hour%10;	
		
		display[23:20]=31'd10;
		
		display[19:16]=alarm_minute/10;
		display[15:12]=alarm_minute%10;
		
		display[11:8]=31'd10;
		
		display[7:4]=15'd11;
		display[3:0]=15'd11;
		end
		
		
end 

//年月日显示模块结束  

//拓展模块秒表开始
reg [31:0]			 timer_cnt;
reg [31:0]			 timer_basic;
reg [31:0]			 timer_decimal;
reg [31:0]			 timer_s;
reg [31:0]			 timer_minute;
reg [31:0]			 timer_hour;

reg [7:0] count_dis_num=0;
reg last_rem_button;
reg [6:0] i;
reg [6:0]          rem_timer_number=0;
reg [31:0]			 rem_timer_decimal [0:50];
reg [31:0]			 rem_timer_s  [0:50];
reg [31:0]			 rem_timer_minute  [0:50];
reg [31:0]			 rem_timer_hour  [0:50];

	always@(posedge clk)
begin
	if(timer_cnt == 31'd249999)
	   begin
		timer_cnt <= 15'd0;	
		
		end
	else
	   begin
		timer_cnt <= timer_cnt + 1'b1;	
		
		end
end
always@(posedge clk)
begin
	if(timer_cnt == 31'd249999)
		timer_basic <= ~timer_basic;
	else
		timer_basic <= timer_basic;	
end	
always@(posedge timer_basic)
begin
    
    timer_decimal=timer_decimal+1;
	 
	 if(timer_decimal==31'd100) //百分秒
	 begin
	 timer_decimal=0;
	 timer_s=timer_s+1;
	 end   
	 
	 if(timer_s==31'd60)  //秒
	 begin
	 timer_s=0;
	 timer_minute=timer_minute+1;
	 end
	 
	 if(timer_minute==31'd60)  //分
	 begin
	 timer_minute=0;
	 timer_hour=timer_hour+1;
	 end
	 
	  if(timer_hour==31'd24)  //时
	 begin
	 timer_hour=0;
	 end
	 
	 if(countmode==0&type!=5)
	 begin	 
	 timer_decimal=0;
	 timer_s=0;
	 timer_minute=0;
	 timer_hour=0;
	 rem_timer_number=0;

	 end
	 
	 if(rem_button!=last_rem_button)    //计时寄存器记录
	 begin 
	 rem_timer_decimal[rem_timer_number]=timer_decimal;	 
	 rem_timer_s[rem_timer_number]=timer_s;	 
	 rem_timer_minute[rem_timer_number]=timer_minute;	 
	 rem_timer_hour[rem_timer_number]= timer_hour;
	 
	 rem_timer_decimal[rem_timer_number+1]=0;	 
	 rem_timer_s[rem_timer_number+1]=0;	 
	 rem_timer_minute[rem_timer_number+1]=0;	 
	 rem_timer_hour[rem_timer_number+1]= 0;
	 
	 rem_timer_decimal[rem_timer_number+2]=0;	 
	 rem_timer_s[rem_timer_number+2]=0;	 
	 rem_timer_minute[rem_timer_number+2]=0;	 
	 rem_timer_hour[rem_timer_number+2]= 0;
	 
	 rem_timer_number=rem_timer_number+1;
	 
	 end	 
    last_rem_button=rem_button;
end
//拓展模块秒表开始
reg [31:0]			 alarm_cnt;
reg [31:0]			 alarm_basic;
reg [31:0]			 alarm_decimal;
reg [31:0]			 alarm_s;
reg [31:0]			 alarm_minute;
reg [31:0]			 alarm_hour;
//拓展模块闹钟开始


//拓展模块闹钟结束
  
endmodule 

总结

代码运行成功,就可以实现了计时(年月日/时分秒)、秒表、倒计时、闹钟的全部功能。文章来源地址https://www.toymoban.com/news/detail-511388.html

到了这里,关于基于FPGA的数字钟设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • EDA实验(Quartus Ⅱ+fpga) (五)---多功能数字钟设计

    本实验代码为初学FPGA所写,逻辑不太清晰,请跳往下面网址查看最新的模块化设计数字钟,更易看懂 模块化多功能数字钟设计 前言: 本文主要介绍了EDA原理与应用这门课程的相关实验及代码。使用的软件是Quartus Ⅱ,该实验使用fpga芯片为cycloneⅤ 5CSEMA5F31C6。 (1)了解数字钟的

    2024年02月06日
    浏览(87)
  • 数电课设数字钟设计(基于quartus)

            数字钟是一种利用数字电路技术实现时、分、秒计时的钟表。与机械钟相比具有更高的准确性和直观性,具有更长的使用寿命,已得到广泛的使用。数字钟的综合性较强,将数字钟作为数电实验大作业的选题不仅可以加深对数电相关理论知识如计数器、组合逻辑电

    2024年02月05日
    浏览(52)
  • 年轻人的第一个数字钟!适用于FPGA的数字钟Verilog实现

    因为闲。 当然也不是很闲,初衷是因为本科时上过的数电实验课最后的大作业就是在 FPGA 上实现一个数字钟,这个作业当时困扰了我们班的诸多同学(难以置信,我们只是学材料的弱小可怜又无助{{{(_)}}}。最终,大部分同学在 拷贝一位学长的代码 一位学长的帮助下顺利通过

    2024年02月11日
    浏览(47)
  • FPGA的数字钟带校时闹钟报时功能VHDL

    名称:基于FPGA的数字钟具有校时闹钟报时功能 软件:Quartus 语言:VHDL 要求:   1、计时功能:这是数字钟设计的基本功能,每秒钟更新一次,并且能在显示屏上显示当前的时间。   2、闹钟功能:如果当前的时间与闹钟设置的时间相同,则扬声器发出闹音。   3、校时设置:用户可

    2024年02月04日
    浏览(42)
  • 实验 7 数字钟设计

    7.1 实 验 目 的 设计一个具有时功能和校的数字钟。 7.2 实 验 仪 器 与 器 材 1. EDA 开发软件 一 套 2.微机 一 台 3.实验开发系统 一 台 4.打印机 一 台 5.其他器件与材料 若 干 7.3 实 验 说 明 用 数码管显示小时 、 分 钟 和 秒钟。 三 个 按键用于时钟校准。 K1 用 与切换

    2024年01月22日
    浏览(41)
  • 电子设计数字钟,multisim仿真·

    设计步骤(分模块叙述,并附上各模块与总体电路图) 1.计时模块,显示模块,调时模块设计 计数器模块由七片74LS160的芯片组成,两片为“秒”,两片为“分”,两片为“时”,还有一片作为“星期”,七个数码管显示器用来显示数字。‘秒’和‘分’采用60进制。通过异步

    2024年02月11日
    浏览(43)
  • FPGA-DE2-115-实验二-模块化多功能数字钟

    前言: 本文主要介绍了集成电路EDA这门课程的相关实验及代码。使用的软件是Quartus Ⅱ,该实验使用fpga芯片为cyclone IV EP4CE115F29C7。 本次实验我们需要实现生活中常见的电子手表的所有功能。 我们知道: 电子手表有五个功能,包括:时间显示功能,夜光模式功能,计时功能,闹钟功能

    2024年02月04日
    浏览(74)
  • 数电仿真实验-数字钟的设计

    1、掌握任意模值计数器的设计方法 2、掌握multisim仿真软件对电路进行仿真验证的方法。 3、掌握数字综合系统设计的方法,能够对整体电路进行功能测试及故障检测。

    2023年04月26日
    浏览(47)
  • 【verilog】多功能数字钟的设计

    掌握数字钟的工作原理。 掌握计数器级联构成更大模值计数器的方法。  能用verilog描述简单的时序逻辑电路。         多功能数字钟应该具有的基本功能有:显示时-分-秒、整点报时、小时和分钟可调等。首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的

    2024年02月04日
    浏览(61)
  • 【基于51单片机的数字钟】

    掌握单片机 C 语言判断语句、分支语句以及子程序调用等编程知识 此程序调试时间方式为先暂停再调时,故有调秒的功能。 (1) 实现正确稳定地显示小时(两位数)、分钟(两位数)、秒钟(两位数),同时数 码管应无闪烁问题 (2) 通过按键分别实现时、分、秒信息的调整,方便用户

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包