reg co11,co22,co111,co222; always@(mode_flag)begin case (mode_flag) 4'b0001: begin
if(~BT2) co22<=_250ms; //小时调钟模式,有按键,则脉冲为250ms
else begin co22<=co2; //没有按键,正常计时
co11<=co1; end end 4'b0010: begin
if(~BT2) begin co11<=_250ms; //小时调钟模式,有按键,则脉冲为250ms
co22<=co2;end
else begin co11<=co1; //没有按键,正常计时
co22<=co2; end end 4'b0011: begin co22<=co2; co11<=co1;
if(~BT2) co222<=_250ms; // 闹钟小时设置信号
else co222<=set_co2;end 4'b0100: begin co22<=co2;
co11<=co1;
if(~BT2) co111<=_250ms; //闹钟分钟设置信号
else co111<=Vdd; end default :begin
co11<=co1;
co22<=co2; end
endcase end
endmodule
(4)、任意闹钟模块 :
一、设置闹钟:当对应于闹钟设置模式mode_flag=4'0011和4'b0100时,有设置信号输入时,则开始设置。 对应代码: module
set_naozhong(co111,co222,set_HH,set_HL,set_MH,set_ML,co2); input co111,co222; // 闹钟分钟,小时设置信号
output [3:0]set_HH,set_HL,set_MH,set_ML; //输出相应的闹钟设置时间 supply1 Vdd; output co2;
minute (co111,Vdd,set_MH,set_ML,co2); hour (co222,Vdd,set_HH,set_HL);
endmodule
二、闹钟响应:当正常计时达到闹钟设置得时间后,通过比较二者之间的时间,相等,则产生一个闹钟允许响应信号,在闹钟开关打开和闹钟允许响应信号同时满足的情况下,则产生闹钟响应信号,并送到相应的闹钟设备LED灯。如果闹钟档处于关闭状态,则不会产生闹钟响应信号。
响应代码如下: module naozhong
(Alarm_ctr,_1HZ,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal);
input Alarm_ctr,_1HZ;
input [3:0] set_HH,set_HL,set_MH,set_ML; input [3:0] HH24,HL24,MH24,ML24; output nao_signal; reg signal; reg nao_signal;
reg [16:0] Q; //计数,调节闹钟响应时间长度
always@(posedge _1HZ)begin
if((~signal)&&(Alarm_ctr))begin
if((set_HH==HH24)&&(set_HL==HL24)&&(set_MH==MH24)&&(set_ML==ML24))signal<=1'b1 //达到闹钟设置时间,产生闹钟允许响应信号
else signal<=1'b0;end //未达到,不产生 else if((signal)&&(Alarm_ctr))begin //闹钟开关打开和闹钟允许响应信号同时满足
nao_signal<=~nao_signal; //产生闹钟响应信号
Q=Q+nao_signal;
if(Q>=8'd720)begin //响应时间完毕,关闭闹钟允许响应信号
Q<=16'b0;
signal<=1'b0;end end else begin
signal<=1'b0;
nao_signal<=1'b0;end end
endmodule
(5)、整点报时模块 :检测分钟和秒钟计数是否都达到了59,然后再下一个秒脉冲的作用下发出整点报时信号,送到LED。并开始计数,计数达到报时信号响应次数后,终止报时信号。 部分代码如下:
always@(posedge _500ms)begin
if(((SH*10+SL)==8'd59)&&((MH*10+ML)==8'd59))begin Q1<=7'b0;
bao<=1'b1;end //允许报时
else if((Q1<10*HH+HL)&&(bao)) begin
bao_signal<=~bao_signal; // 产生报时信号
Q1<=Q1+bao_signal; //响一次计数加一
end
else if(Q1==(10*HH+HL)) //报时次数达到整点时数,终止信号
bao<=1'b0; else begin
bao_signal<=1'b0; end End
(6)、12—24小时切换模块:将24小时切换成12小时,并存入相应的寄存器。如果拨上切换显示档,则切换显示。 相应代码如下:
module hour12_24(HH24,HL24,HH12,HL12); input [3:0] HH24,HL24; output [3:0] HH12,HL12; reg [3:0] HH12,HL12;
always@(HH24 or HL24)begin if((HH24*10+HL24)<=12)
begin
HH12<=HH24; HL12<=HL24; end else
if(((HH24*10+HL24)>=13)&&((HH24*10+HL24)<=19)) begin
HH12<=4'd0;
HL12<=HL24-4'd2; end else
if(((HH24*10+HL24)>=19)&&((HH24*10+HL24)<=21)) begin
HH12<=4'd0;
HL12<=HL24+4'd8; end else begin
HH12<=HH24-4'd1; HL12<=HL24-4'd2; end end
endmodule
(7)、译码显示模块:
一、数码管显示:通过传入响应的4位十进制数,运用case语句转换输出相应的8位二进制显示码,送入数码管显示。
代码如下:
module SEG7_LUT(oSEG1,iDIG);
input[3:0]iDIG; //输入要显示的数 output[7:0]oSEG1;