其他分享
首页 > 其他分享> > 实验二:功能可调综合计时器设计

实验二:功能可调综合计时器设计

作者:互联网

一、实验目的

(1)掌握QuartusII等实验工具的输入、综合、仿真、下载的使用方法
(2)掌握DE2开发版的器件功能特性和使用方法
(3)掌握Verilog HDL时序逻辑系统设计的主要方法和技术
(4)掌握并应用EDA设计的方法和流程

二、预习要求

(1)了解QuartusII等管教分配、下载的方法和流程
(2)了解开发板输入、输出显示资源的工作特性
(3)了解开发板设计、开发和测试的方法和流程

三、实验要求

设计一个可调的综合计时器。具体功能:
(1)显示小时、分、秒,提供置零功能。显示在七段管或LCD屏幕上,可以考虑24/12小时模式切换功能。
(2)能够对秒、分、小时进行分别修改,可以两位数整体修改或每位独立修改
(3)整点报时功能,整点可以显示一定形式的LED来表示。
(4)闹钟功能,设定特定时间,到时间以特定LED显示来显示闹钟。注意闹钟持续时间,也可以参考懒人闹钟模式。

四、实验代码

module test02   (KEY0,KEY1,KEY2,KEY3,sw,sw1,a,b,clk50,HEX6,HEX5,HEX4,HEX3,HEX2,HEX1,HEX0,LED0,LED1);//可调时钟
input KEY0;//复位键
input KEY1;//调小时
input KEY2;//调分
input KEY3;//调秒
input sw;//控制模式(闹钟/时钟)
input sw1;//控制模式(12/24)
input [7:0]a,b;//输入以调节闹钟的值
input clk50;//50MHZ
output[6:0] HEX6,HEX5,HEX4,HEX3,HEX2,HEX1,HEX0;//wire型七段管,分别显示AM/PM  时  分  秒
output reg LED0;//整点报时,整点时亮
output reg LED1;//闹钟时间到
reg[48:0] hex=48'b1000000100000010000001000000100000010000001000000;//00 00 00
integer i=0;
integer j=0;
integer k=0;

integer s=10;//闹钟延时10s关闭
integer t=30;//naozhong
wire clk1; //1s
reg[5:0] time0=0;//59
reg[5:0] time1=0;//59
reg[4:0] time2=0;//23
reg[5:0] alarm0=0;//59
reg[5:0] alarm1=0;//59
reg[4:0] alarm2=0;//23
reg [3:0]a0=0;
reg [3:0]a1=0;
reg [3:0]a2=0;
reg [3:0]a3=0;
reg [3:0]a4=0;
reg [3:0]a5=0;
reg [3:0]ap=0;
divclk1 A1(1,clk50,clk1);//调用1hz模块,1s
assign {HEX6,HEX5,HEX4,HEX3,HEX2,HEX1,HEX0}=hex;//显示
always@(posedge clk1)
  begin
  LED0=0;//不是整点,LED0不亮
  if(s<10)
    begin
	// if(!KEY3)
	//	begin
	//		t=0;
	//		s=0;
	//	end
	 if(t>=10)
	 begin
	   s=s+1;
		LED1=1;
	 end
	 else   //t<10
	 begin
		 t=t+1;
		 LED1=0; 
	 end
		
	 end
  else LED1=0;   //让闹钟延时10s关闭

	 if(!KEY1) //按键控制小时增加
		   begin
			  if(k<23)
			    begin
				   time2=time2+1;
					k=k+1;
				 end
			  else 
			    begin
				   time2=0;
					k=0;
				 end
			end
	else if(!KEY2) //按键控制分钟增加
		   begin
			  if(j<59)
			    begin
				   time1=time1+1;
					j=j+1;
				 end
			  else 
			    begin
				   time1=0;
					j=0;
				 end
			end
	
/*	else if(!KEY3) //秒清0
	      begin
			  time0=0;
			  i=0;
			end		
	*/
	else if(i<59) //平常计时时钟
	       begin//-----秒------
	        time0=time0+1;
		     i=i+1;
		    end
		  else 
		    begin
		     time0=0;
			  i=0;
		     if(j<59)//----分------
		      begin
		       time1=time1+1;
		       j=j+1;
		      end
			  else
			   begin
			   time1=0;
				j=0;
			   if(k<23)//----时------
			    begin
				  time2=time2+1;
				  k=k+1;
				 end 
				else
			    begin
				  time2=0;
				  k=0;
				 end
				 LED0=1;//整点时LED0亮
				 end
		 
		 end 
		 
		 if(time0==alarm0&&time1==alarm1&&time2==alarm2)//闹钟时间到
		   begin
			 LED1=1;//LED1亮
			 s=0;
		 	end
	if(sw)
      begin
	//七段管上显示
		if(!KEY0)//复位
			begin
			time0=0;
			time1=0;
			time2=0;
			a0=4'b0000;
			a1=4'b0000;
			a2=4'b0000;
			a3=4'b0000;
			a4=4'b0000;
			a5=4'b0000;
			end

			
			
	else begin
	
	a0=time0%4'b1010;//显示-----秒--------
		   
		   a1=time0/4'b1010;
		   
		   a2=time1%4'b1010;//-------分-------
		   
		   a3=time1/4'b1010;
		   
		   a4=time2%4'b1010;//--------时---------
		  
		   a5=time2/4'b1010;
			
			ap=4'b0000;
			
	end			
	
	 if(sw1)//24-12
			begin
				if(time2>=5'b01100)
				begin
				a4=(time2-12)%10;
				a5=(time2-12)/10;
				ap=4'b1011;
				end
				else
				ap=4'b1010;
			end
		
			hex[6:0]=get0(a0);
			
			hex[13:7]=get0(a1);
			
			hex[20:14]=get0(a2);
			
			hex[27:21]=get0(a3);
			
			hex[34:28]=get0(a4);
			
		   hex[41:35]=get0(a5);
			
			hex[48:42]=get0(ap);
	
	

	end
	  else//sw=0;设置闹钟 
	
	   begin 
			

		   if(a[7:4]<=2&&a[3:0]<=9&&b[7:4]<=5&&b[3:0]<=9)//
	       begin
			  if(a[7:4]==2&&a[3:0]>=4)//如果大于=24了
			   begin 
				  alarm2=0;
		        alarm1=0;
		        alarm0=0;
				 end
		    else
           begin			 
	        alarm2=a[7:4]*4'b1010+a[3:0];//设置小时
		     alarm1=b[7:4]*4'b1010+b[3:0];//设置分钟
		     alarm0=0;//使秒一直是00;
			  
			  end
			
		end
			
		  else   //---不在24小时范围内----
		   begin
		   alarm2=0;
			alarm1=0;
		   alarm0=0;

			end 

			a0=alarm0%4'b1010;//显示-----秒--------
		   
		   a1=alarm0/4'b1010;
		   
		   a2=alarm1%4'b1010;//-------分-------
		   
		   a3=alarm1/4'b1010;
		   
		   a4=alarm2%4'b1010;//--------时---------
		  
		   a5=alarm2/4'b1010;
			
			
			hex[6:0]=get0(a0);
			
			hex[13:7]=get0(a1);
			
			hex[20:14]=get0(a2);
			
			hex[27:21]=get0(a3);
			
			hex[34:28]=get0(a4);
			
		   hex[41:35]=get0(a5);
			
		end
		
			
 
	  end

function [6:0]get0;//七段管对应的7位
   input[3:0] a0;
	reg[6:0] b;
	begin
	case(a0)
  4'b0000:b=7'b1000000;
  4'b0001:b=7'b1111001;
  4'b0010:b=7'b0100100;
  4'b0011:b=7'b0110000;
  4'b0100:b=7'b0011001;
  4'b0101:b=7'b0010010;
  4'b0110:b=7'b0000010;
  4'b0111:b=7'b1111000;  
  4'b1000:b=7'b0000000;
  4'b1001:b=7'b0010000;
  4'b1010:b=7'b0001000; 
  4'b1011:b=7'b0001100;  
	default:b=7'b0111111;
	endcase 
	get0=b;
	end
	endfunction
endmodule	

五、测试

1)sw17置一 时钟模式,可以进行修改时间、整点闪灯等功能
① 时钟模式 显示当前时间 可调整为12/24小时值

② 通过按键可以改变时钟的时/分/秒

③KEY0可以将时间置零

(2)sw17置零,闹钟模式
①通过按键设置闹钟时间

②当时钟模式内的时间与闹钟设置时间相同时,LED灯亮

③懒人闹钟功能,当LED灯亮起时按下按键,等候十秒钟后再次提醒

六、反思与缺陷

数位的控制算法有缺陷,应当使每一位都不能超过9方可

标签:end,hex,可调,实验,闹钟,get0,计时器,reg,b1010
来源: https://blog.csdn.net/winter0409/article/details/111026108