电子钟程序的设计模块有时钟初始化模块时钟工作模块.docx
《电子钟程序的设计模块有时钟初始化模块时钟工作模块.docx》由会员分享,可在线阅读,更多相关《电子钟程序的设计模块有时钟初始化模块时钟工作模块.docx(11页珍藏版)》请在冰豆网上搜索。
![电子钟程序的设计模块有时钟初始化模块时钟工作模块.docx](https://file1.bdocx.com/fileroot1/2023-1/25/08ae00e7-d4d6-4f1d-bf0d-da1e628d0a34/08ae00e7-d4d6-4f1d-bf0d-da1e628d0a341.gif)
电子钟程序的设计模块有时钟初始化模块时钟工作模块
电子钟:
程序的设计模块有:
时钟初始化模块、时钟工作模块、时钟设置模块、闹钟设置模块、闰年的月份天数判断模块、数码管显示模块、闹钟铃声模块及其它的设置模块。
程序使用8个输入分别与8个按键连接,用按键8对应时钟工作状态(work_state),当work_state为0时,时钟正常工作,当work_state为1时,进入时钟设置状态。
按键7对应输入端口display_set控制时钟显示状态(display_state),每按2次(用于产生上升沿触发)则数码管的输出不同。
Display_state与work_state相结合使用,以区分设置的参数。
按键6~4对应输入个脚in_set,该参数共有三位,用以表示三个状态:
state_yorh (设置年或小时)、state_morm(设置月份或分钟)、 state_dors(设置日期或秒钟)。
按键3~2对应数值设置端口up各down。
Up用于产生上升沿触发,当down为0时,则每一个上升沿产生时,相应的参数加1,当down为1时,则每一个上升沿产生时,相应的参数减1。
按键1与输入端口clock_on相连,用于闹钟的开与关,当 clock_on为1时开闹钟,否则关闹钟。
扬声器与输出端口speaker相连,用于输出闹钟铃声。
是用GW48教学实验箱仿真的
、电子钟
module clock(work_state,clock_on,clk_6MHz,clk_4Hz,in_set,display_set,clk_1024Hz,up,down,out1,out2,out3,out4,out5,out6,out7,out8,speaker);
input work_state,clk_1024Hz,up,down,display_set,clk_6MHz,in_set,clock_on,clk_4Hz;
output out1,out2,out3,out4,out5,out6,out7,out8,speaker;
wire[2:
0] in_set;
reg[3:
0] out1,out2,out3,out4,out5,out6,out7,out8;
reg[2:
0] display_state;
reg[7:
0] hour,minute,second,year,month,day,day_max;
reg[7:
0] hour_set,minute_set,second_set,day_set,month_set,year_set,day_set_max;
integer century=20;
integer i=0;
reg speaker;
reg[7:
0] clock_hour,clock_minute,clock_second;
reg[3:
0] high,med,low;
reg[13:
0] divider,origin;
reg[7:
0] counter;
reg out;
wire carry;
//*****各初始值设置时对应的状态********//
parameter state_yorh=3'b100, //设置年或小时对应的按键状态
state_morm=3'b010, //设置月或分对应的按键状态
state_dors=3'b001; //设置日或秒对应的按键状态
//***初始化时钟:
08年08月08日00:
00:
00*****//
initial
begin
year<=8;
year_set<=8;
month<=8;
month_set<=8;
day<=8;
day_set<=8;
hour<=0;
minute<=0;
second<=0;
clock_hour<=0;
clock_minute<=0;
clock_second<=0;
display_state<=0;
end
//******电子钟正常工作状态下/work_state等于0时,时钟处于工作状态*******//
always @(posedge clk_1024Hz) //频率选择1024HZ
begin
if(i>=1023)
begin
i<=0;
if(work_state)
begin
second<=second_set;
minute<=minute_set;
hour<=hour_set;
day<=day_set;
month<=month_set;
year<=year_set;
end
else
begin
if(second>=59)
begin
second<=0;
if(minute>=59)
begin
minute<=0;
if(hour>=23)
begin
hour<=0;
if(day>=day_max)
begin
day<=1;
if(month>=12)
begin
month<=1;
if(year>=99)
year<=0;
else
year<=year+1;
end
else
month<=month+1;
end
else
day<=day+1;
end
else
hour<=hour+1;
end
else
minute<=minute+1;
end
else
second<=second+1;
end
end
else
i<=i+1;
end
//******数码管显示状态设置*******//
always @(posedge display_set)
begin
if(display_state>=2)
display_state<=0;
else
display_state<=display_state+1;
end
//*闹钟模块设置,用clock_on控制闹钟,闹钟铃声播放时间为一分钟,可手动关闭闹钟**//
always @(posedge clk_6MHz)
begin
if(clock_on)
begin
if(clock_hour==hour&&clock_minute==minute)
speaker<=out;
else speaker<=0;
end
else speaker<=0;
end
//*************设置时钟的初值*************************//
/*用up来触发,当down=0时,一个上升沿触发来时加1,否则减1.***/
always @( posedge up)
begin
if(!
work_state) //时间处于正常工作状态时,使要设置的初始值保持同步
begin
second_set<=second;
minute_set<=minute;
hour_set<=hour;
day_set<=day;
month_set<=month;
year_set<=year;
end
else
begin
if(display_state==1)//当display_state==1时,则是设置年月日的初始值,否则是设置时间.
begin
if(down==0)
begin
case(in_set)
state_yorh:
begin
if(year_set>=99)
year_set<=0;
else
year_set<=year_set+1;
end
state_morm:
begin
if(month_set>=12)
month_set<=1;
else
month_set<=month_set+1;
end
state_dors:
begin
if(day_set>=day_set_max)
day_set<=1;
else
day_set<=day_set+1;
end
endcase
end
else
begin
case(in_set)
state_yorh:
begin
if(year_set<=0)
year_set<=99;
else
year_set<=year_set-1;
end
state_morm:
begin
if(month_set<=1)
month_set<=12;
else
month_set<=month_set-1;
end
state_dors:
begin
if(day_set<=1)
day_set<=day_set_max;
else
day_set<=day_set-1;
end
endcase
end
end
else if(display_state==0)
begin
if(down==0)
begin
case(in_set)
state_yorh:
begin
if(hour_set>=23)
hour_set<=0;
else
hour_set<=hour_set+1;
end
state_morm:
begin
if(minute_set>=59)
minute_set<=0;
else
minute_set<=minute_set+1;
end
state_dors:
begin
if(second_set>=59)
second_set<=0;
else
second_set<=second_set+1;
end
endcase