📄 my_clock.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 + -