功能:计时 整点报时 闹钟
module text_1106(clk,addh,shiqu,settime,naoh,naom,addm,second_1,second_2,minute_1,
minute_2,hour_1,hour_2,nao1,nao2,led1);
input clk,shiqu,addh,addm,settime,naoh,naom;//clk 时钟信号 shiqu 24 12计时转换
//addh addm 调整时间 settime 设置时间开关 naoh naom 设置闹钟时间
output reg[6:0] second_1,second_2,minute_1,minute_2,hour_1,hour_2,nao1,nao2;
//显示时分秒
output reg led1; //整点报时,指示灯亮
//七段管译码 共阴极
task seven_show;
input [3:0]data;
output [6:0]result;
begin
case(data)
4'd0:result=7'b1000000;
4'd1:result=7'b1111001;
4'd2:result=7'b0100100;
4'd3:result=7'b0110000;
4'd4:result=7'b0011001;
4'd5:result=7'b0010010;
4'd6:result=7'b0000010;
4'd7:result=7'b1111000;
4'd8:result=7'b0000000;
4'd9:result=7'b0011000;
default:result=7'b0111111;
endcase
end
endtask
reg clk1=0;//秒的时钟信号
reg naoflag=0,naof=0; //naoflag是否存在脑中的标志 naof是闹钟时间到了的标志
reg [6:1]hour=0,minute=0,second=0;
//计数 闹钟 整点报时 进制转换
always@(posedge clk) //50MHz时钟信号
begin
if(settime==0)
begin
if(addh==0) begin naoflag=0;naof=0; end
if(addm==0) begin naof=0; end
if(naoh==1||naom==1) naoflag=1;
//要根据不同的情况选用不同的时钟信号,所以并没有直接选用clk1
//而是在内部分频
if(i<24999999) i=i+1;
else
begin
//本来计时代码有很多if,但是草靠别人的一部分,觉得这个写的特别精简
//所以采用这种方式计时
i=0;clk1=~clk1;
second=second+1;
minute=second/60+minute;
second=second%60;
hour=hour+minute/60;
minute=minute%60;
if(shiqu) hour=hour%12;
else hour=hour%24;
//是否存在闹钟
if(naoflag)
begin
if(nao_h==hour&&nao_m==minute)
begin
naof=1;//到时间闹钟显示HELLO
end
end
//整点报时5秒钟
if(minute==0&&second<=5)
begin
led1=1; //灯亮
if(second==5) led1=0;
end
end
end
else
begin
//返回设置的时间,这一段的时钟信号是50MHz,因为需要快速反应
if(settime)
begin
if(addh==0) begin hour=h; second=0;end
if(addm==0) begin minute=m; second=0; end
end
end
end
//
reg[6:1] h=0,m=0;//记录调整的时间
reg[6:1] nao_h=0,nao_m=0;//记录闹钟的时间
always@(negedge addm)
begin
// 不同的标志位 点击addm 有不同的变化
if(settime) m=(minute+1)%60;
if(naom) begin nao_m=(nao_m+1)%60; end
if(naof) begin nao_m=nao_m+1; end
end
always@(negedge addh)
begin
// 不同的标志位 点击addn 有不同的变化
//addh要考虑到24 和 12 的变化
if(settime)
begin
if(shiqu)
h=(hour+1)%12;
else h=(hour+1)%24;
end
if(naoh)
begin
if(shiqu) nao_h=(nao_h+1)%12;
else nao_h=(nao_h+1)%24;
end
end
//显示模块。用不同的标志位控制显示的内容
always@(posedge clk)
begin
if(naof==0)//显示计时
begin
seven_show(second%10,second_1);
seven_show(second/10,second_2);
seven_show(minute%10,minute_1);
seven_show(minute/10,minute_2);
seven_show(hour%10,hour_1);
seven_show(hour/10,hour_2);
//设置闹钟时间的时候,七段管会分别显示设置的分和秒/根据标志位选择
if(naoh) begin seven_show(nao_h%10,nao1);seven_show(nao_h/10,nao2); end
if(naom) begin seven_show(nao_m%10,nao1);seven_show(nao_m/10,nao2); end
end
else//闹钟到点显示“HELLO”
begin
hour_2=7'b0000000;
hour_1=7'b0001001;//H
minute_2=7'b0000110;//E
minute_1=7'b1000111;//L
second_2=7'b1000111;//L
second_1=7'b1000000;//O
end
end
endmodule