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

📄 my_clock.v

📁 一个电子中的verilog实验源代码。适合verilog初学者学习参考
💻 V
字号:
// **********************************************************************************
// FileName		:my_clock.v
//
// Discription	:自动复位和主状态机转换模块
//
// Date			:
//
// Author		: dandan
// **********************************************************************************
module my_clock(glbclk,shift,select,set,keyin,
				mode,screen_mode,mode_time,mode_date,mode_clock,mode_sec,alm_light_on,o_light_on,reset);

input glbclk;
input shift,select,set;
input keyin;//闹钟暂停键
output [5:0] mode;//主状态
output [1:0] screen_mode;//显示状态
output [2:0] mode_time,mode_date,mode_clock,mode_sec;//设置及秒表状态
output alm_light_on,o_light_on;//闹钟开关,整点报时开关
output reset;

//主状态机
parameter	Time_screen=6'b000_001,	//时间正常显示
			Time_set=6'b000_010,	//设置时间
			Date_set=6'b000_100,	//设置日期
			Clock_set=6'b001_000,	//设置闹钟
			Sec_clock=6'b010_000, 	//秒表
			O_light_set=6'b100_000;	//设置整点报时	
//显示状态机
parameter	Screen_clock=2'b01,		//显示闹钟
			Screen_date=2'b10;		//显示日期
//设置时间状态机
parameter	Hour_set=3'b100,		//设置小时
			Minute_set=3'b010,		//设置分钟
			Sec_set=3'b001;			//设置秒
//设置日期状态机
parameter	Day_set=3'b001,			//设置日子
			Month_set=3'b010,		//设置月
			Year_set=3'b100;		//设置年
//设置闹钟状态机
parameter	Clock_on=3'b100,		//设置闹钟开关
			Clock_hour=3'b010,		//设置闹钟的小时
			Clock_minute=3'b001;	//设置闹钟的分钟
//秒表状态机
parameter 	Sec_on=3'b010,			//秒表计数开始
			Sec_stop=3'b001,		//秒表计数暂停
			Sec_reset=3'b100;		//秒表清零


//状态寄存器
reg [5:0] mode;
reg [1:0] screen_mode;
reg [2:0] mode_time;
reg [2:0] mode_date;
reg [2:0] mode_clock;
reg [2:0] mode_sec;

reg alm_light_on;					//闹钟开关
reg o_light_on;						//整点报时开关

//自动复位
reg reset;
reg [10:0] auto_reset;

//自动复位模块 (综合的时候注释掉initial) 
//initial
//    begin
//      auto_reset={$random};
 //   end
//    
always@(negedge glbclk)
    begin
      if(auto_reset>50)
      	begin
        	auto_reset<=0;
      	end
      if(auto_reset<50)
      	begin
        	auto_reset<=auto_reset+1;
        	reset<=1;
      	end
      if(auto_reset==50)
      	begin
        	reset<=0;
      	end
    end
    
//状态转换模块
always@(shift or select or set or reset)
	if(reset)
		begin
			mode=Time_screen;	//主状态寄存器
		    screen_mode=2'b00;	//显示状态寄存器
		    mode_time=Hour_set;	//时间设置寄存器
		    mode_date=Year_set;	//日期设置寄存器
		    mode_clock=Clock_on;//闹钟设置寄存器
		    mode_sec=Sec_reset;	//秒表设置寄存器
		    alm_light_on=0;		//闹钟关闭
		    o_light_on=0;		//整点报时关闭
		end
	else
		begin
			case(mode)		//主状态机
			Time_screen:	if(shift)	
								begin
									mode_time=Hour_set;								//状态转移到时间设置
									mode=Time_set;	
								end													
							else			
								begin
									mode=Time_screen;
									if(select)		screen_mode=Screen_date;		//显示日期
									else if(set)	screen_mode=Screen_clock;		//显示闹钟设置
									else			screen_mode=2'b0;				//显示时间
								end
			Time_set:		if(shift)	
								begin
									mode=Date_set;
									mode_date=Year_set;
								end													//状态转移到日期设置
							else
								begin
									mode=Time_set;					
									case(mode_time)									//时间设置
									Hour_set:										//小时设置
										begin
											if(select)	mode_time=Minute_set;
											else		mode_time=Hour_set;
										end		
									Minute_set:										//分钟设置
										begin
											if(select)	mode_time=Sec_set;
											else 		mode_time=Minute_set;
										end
									Sec_set:										//秒设置
										begin
											if(select)	mode_time=Hour_set;
											else 		mode_time=Sec_set;
										end
									default:	mode_time=Hour_set;
									endcase
								end
			Date_set:		if(shift)	
								begin
									mode=Clock_set;
									mode_clock=Clock_on;
								end													//状态转移到闹钟设置
							else		
								begin
									mode=Date_set;									//日期设置
									case(mode_date)					
									Year_set:										//年设置
										begin
											if(select)	mode_date=Month_set;
											else 		mode_date=Year_set;
										end
									Month_set:										//月设置
										begin
											if(select)	mode_date=Day_set;
											else 		mode_date=Month_set;
										end
									Day_set:										//日设置
										begin
											if(select)	mode_date=Year_set;
											else		mode_date=Day_set;
										end
									default:	mode_date=Year_set;
									endcase
								end
			Clock_set:		if(shift)	
								begin
									mode=Sec_clock;
									mode_sec=Sec_reset;
								end													//状态转移到秒表
							else		
								begin
									mode=Clock_set;									//闹钟设置
									case(mode_clock)		
									Clock_on:										//闹钟开关设置
										begin
											if(select)	mode_clock=Clock_hour;
											else
												begin
													mode_clock=Clock_on;		
													if(set)	alm_light_on=~alm_light_on;
												end
										end		
									Clock_hour:										//闹钟小时设置
											if(select)	mode_clock=Clock_minute;
											else		mode_clock=Clock_hour;
									Clock_minute:									//闹钟分钟设置
											if(select)	mode_clock=Clock_on;
											else		mode_clock=Clock_minute;
									default:	mode_clock=Clock_on;
									endcase
								end
			Sec_clock:		if(shift)	mode=O_light_set;							//状态转移到整点报时设置
							else		
								begin
									mode=Sec_clock;								
									case(mode_sec)									//秒表
									Sec_on:		if(select)		mode_sec=Sec_stop;	
												else if(set)	mode_sec=Sec_reset; 
												else			mode_sec=Sec_on;    //秒表开启
									Sec_stop:	if(set)			mode_sec=Sec_reset;	
												else			mode_sec=Sec_stop;	//秒表暂停
									Sec_reset:  if(select)		mode_sec=Sec_on;	
												else			mode_sec=Sec_reset; //秒表清零
									default:	mode_sec=Sec_reset;
									endcase
								end
			O_light_set:	if(shift)	
								begin
									mode=Time_screen;
									screen_mode=2'b00;
								end													//状态转移到正常显示时间
							else							
								begin
									mode=O_light_set;								//设置整点报时开关
									if(set)		o_light_on=~o_light_on;	
								end
			default:		mode=Time_screen;
			endcase
		end	

endmodule

⌨️ 快捷键说明

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