📄 alarm.v
字号:
/*闹钟定时和整点报时子模块 */
module alarm(clk_4Hz,clk_1KHz,disp_mode,sec,min,hour,set_ahr,set_amin,set,amin,ahour,alarm,ear,alarm2);
input clk_4Hz,clk_1KHz; // clk_4Hz为标准时钟信号,来自clkdiv250.v的输出;clk_1KHz为产生闹铃音、报时音的时钟信号
input[1:0] disp_mode; // 显示模式,来自route.v的输出
input set_ahr,set_amin; // 来自route.v,为设置闹钟定时中的分或小时的时钟信号
input set; // 设置计数初值信号,每按一次,计数器加1;若按住set键不放,可屏蔽闹铃音(这里只用来屏蔽闹铃音)
input[7:0] sec,min,hour;
output amin,ahour; // BCD计数器,用于设置闹钟定时中的分钟和小时
output alarm; // 输出到扬声器的信号,用于产生闹铃音和整点报时音
output alarm2,ear; // 便于仿真
reg[7:0] amin,ahour;
reg[1:0] loop1,num1; // 中间变量,用于设置初值时连续快速加1
reg[1:0] sound; // 计数器,用来确定ear为1或0
reg alarm1,alarm2,ear; // 中间变量,alarm1,alarm2分别用于产生闹铃信号和整点报时信号,ear用于产生或屏蔽整点报时音
// ----(1)闹钟定时中的小时设置
always @(posedge set_ahr)
begin
if(disp_mode==3) // =3时为闹钟定时
begin
if(ahour==8'h23) // 若计到23小时
ahour[7:0]<=0;
else
begin
if(ahour[3:0]==9)
begin
ahour[3:0]<=0;
ahour[7:4]<=ahour[7:4]+1;
end
else ahour[3:0]<=ahour[3:0]+1;
end
end
else ahour[7:0]<=0;
end
//----(2)闹钟定时中的分设置
always @(posedge set_amin)
begin
if(disp_mode==3)
begin
if(amin==8'h59) // 若计到59分
amin[7:0]<=0;
else
begin
if(amin[3:0]==9)
begin
amin[3:0]<=0;
amin[7:4]<=amin[7:4]+1;
end
else amin[3:0]<=amin[3:0]+1;
end
end
else amin[7:0]<=0;
end
//----(3)闹铃功能
always @(posedge clk_4Hz)
if(disp_mode==0) // 在正常计时状态下
if ((min==amin)&&(hour==ahour)&&(amin||ahour)&&(!set)) // 按住set键不放,可屏蔽闹铃音
if(sec<=8'h20) alarm1<=1; // 闹铃为持续20s的嘀嘀音
else alarm1<=0;
else alarm1<=0;
else alarm1<=0;
//----(4)整点报时功能
always @(posedge clk_4Hz)
begin
if(sound==3) //ear信号(周期为1s)用于产生或屏蔽整点报时音
begin
sound<=0;
ear<=1;
end
else
begin
sound<=sound+1;
ear<=0;
end
end
always @(posedge clk_4Hz) //产生整点报时信号alarm2
begin
if((min==8'h59)&&(sec>8'h55)||(!(min||sec))) //如果计到超过59分55秒,或者达到0分0秒
if(sec>8'h54) alarm2<=ear&clk_1KHz; //如果计到超过59分55秒,则产生频率为1KHz的短音(四声)
else alarm2<=!ear&clk_1KHz; //如果达到0分0秒,则产生长音(一声)
else
alarm2<=0;
end
assign alarm=((alarm1)? clk_4Hz :0) | alarm2;
// 当alarm1为1时,以4Hz的频率产生闹铃音:alarm=clk_4Hz;在scheme1中此句为assign alarm=((alarm1)? clk_4Hz&clk_1KHz :0) | alarm2;
// 当alarm1为0时,alarm=alarm2,若计到整点的时间,则产生四短一长的报时音
endmodule
/* 注1:在(2)中语句if(disp_mode==3)保证只有其值为3时,set_ahr或set_amin可设置ahour或amin;
而在其他情况下set_ahr或set_amin对ahour或amin无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -