📄 clock.v
字号:
module clock(clk10ms,key1,key2,key3,key4,disp,spk);
input clk10ms,key1,key2,key3,key4;
output [15:0] disp;
output spk;
reg [15:0] disp;
reg clk1s,clk1m,clk1h,clk1d,set=1,run=0,num=0,alm_set=1;
reg lastas=1,lastkey1=1,lastkey2=1,lastkey3=1,lastkey4=1;
reg [6:0] tenms;
reg [5:0] s;
reg [5:0] m=0;
reg [4:0] h=0;
reg [5:0] alm_m=0;
reg [4:0] alm_h=0;
reg [1:0] pos;
reg [1:0] state=0;
reg [13:0] sw;
assign spk=~|({alm_h,alm_m}^{h,m});
////////////////state control////////////////////////
always@(posedge clk10ms)
begin
if({lastkey1,key1}==2'b10)
state=state+1'b1;
case (state)
default: //display clock
begin
set=1'b1;
case ({key1,key2,key3,key4})
4'b1111:
begin
disp[3:0]=m%4'd10;
disp[7:4]=m/4'd10;
disp[11:8]=h%4'd10;
disp[15:12]=h/4'd10;
end
4'b1110:
begin
disp[15:12]=s/4'd10;
disp[11:8]=s%4'd10;
disp[7:4]=tenms/4'd10;
disp[3:0]=tenms%4'd10;
end
4'b1101:
begin
disp[15:12]=alm_h/4'd10;
disp[11:8]=alm_h%4'd10;
disp[7:4]=alm_m/4'd10;
disp[3:0]=alm_m%4'd10;
end
4'b1011:
begin
disp[15:12]=(sw/10'd1000)%4'd10;
disp[11:8]=(sw/7'd100)%4'd10;
disp[7:4]=(sw/4'd10)%4'd10;
disp[3:0]=sw%4'd10;
end
default:
begin
disp[3:0]=m%4'd10;
disp[7:4]=m/4'd10;
disp[11:8]=h%4'd10;
disp[15:12]=h/4'd10;
end
endcase
end
2'b01: //set clock
begin
if ({lastkey2,key2}==2'b10)
pos=pos+1'b1;
if(clk1s)
case (pos)
2'b00: disp[3:0]=0;
2'b01: disp[7:4]=0;
2'b10: disp[11:8]=0;
2'b11: disp[15:12]=0;
endcase
else
begin
disp[3:0]=m%4'd10;
disp[7:4]=m/4'd10;
disp[11:8]=h%4'd10;
disp[15:12]=h/4'd10;
end
if ({lastkey3,key3}==2'b10)
begin
num=1'b1;
set=0;
end
else if ({lastkey4,key4}==2'b10)
begin
num=0;
set=0;
end
else
set=1'b1;
end
2'b10: //set alarm
begin
set=1'b1;
if ({lastkey2,key2}==2'b10)
pos=pos+1'b1;
if(clk1s)
case (pos)
2'b00: disp[3:0]=0;
2'b01: disp[7:4]=0;
2'b10: disp[11:8]=0;
2'b11: disp[15:12]=0;
endcase
else
begin
disp[3:0]=alm_m%4'd10;
disp[7:4]=alm_m/4'd10;
disp[11:8]=alm_h%4'd10;
disp[15:12]=alm_h/4'd10;
end
if ({lastkey3,key3}==2'b10)
begin
num=1'b1;
alm_set=0;
end
else if ({lastkey4,key4}==2'b10)
begin
num=0;
alm_set=0;
end
else
alm_set=1'b1;
end
2'b11: //stopwatch
begin
begin
disp[15:12]=(sw/10'd1000)%4'd10;
disp[11:8]=(sw/7'd100)%4'd10;
disp[7:4]=(sw/4'd10)%4'd10;
disp[3:0]=sw%4'd10;
end
if({lastkey3,key3}==2'b01)
begin
run=1'b1;
end
else if({lastkey4,key4}==2'b10)
begin
run=0;
end
else if({lastkey2,key2}==2'b10)
sw=0;
if(run)
if(sw<'d9999)
sw=sw+1'b1;
else
sw=0;
end
endcase
lastkey1=key1;
lastkey2=key2;
lastkey3=key3;
lastkey4=key4;
end
///////////////////clock///////////////////
always@(posedge clk10ms)
begin
if (tenms<'d99)
tenms=tenms+1'b1;
else
tenms=0;
if (tenms=='d50)
clk1s=0;
if (tenms==0)
clk1s=1'b1;
end
always@(posedge clk1s)
begin
if (s<'d59)
s=s+1'b1;
else
s=0;
if (s=='d30)
clk1m=0;
if (s==0)
clk1m=1'b1;
end
always@(posedge clk1m or negedge set)
begin
if(~set)
if(~pos[1])
begin
if (~pos[0])
if (~num)
if (m>0)
m=m-1'b1;
else
m='d59;
else
if (m<'d59)
m=m+1'b1;
else
m=0;
else
if (~num)
if (m>'d9)
m=m-'d10;
else
m=m%'d10+'d50;
else
if (m<'d50)
m=m+'d10;
else
m=m%'d10;
end
else;
else
begin
if (m<'d59)
m=m+1'b1;
else
m=0;
if (m=='d30)
clk1h=0;
if (m==0)
clk1h=1'b1;
end
end
always@(posedge clk1h or negedge set)
begin
if (~set)
if(pos[1])
begin
if (~pos[0])
if (~num)
if (h>0)
h=h-1;
else
h='d23;
else
if (h<'d23)
h=h+1;
else
h=0;
else
if (~num)
if (h>'d9)
h=h-'d10;
else
h=h%'d10+'d10;
else
if (h<'d10)
h=h+'d10;
else
h=h%'d10;
end
else;
else
begin
if (h<'d23)
h=h+1;
else
h=0;
if (h=='d12)
clk1d=0;
if (h==0)
clk1d=1;
end
end
///////////////////alarm//////////////////////////
always@(posedge clk10ms)
begin
if({lastas,alm_set}==2'b10)
if(~pos[1])
begin
if (~pos[0])
if (~num)
if (alm_m>0)
alm_m=alm_m-1;
else
alm_m='d59;
else
if (alm_m<'d59)
alm_m=alm_m+1;
else
alm_m=0;
else
if (~num)
if (alm_m>'d9)
alm_m=alm_m-'d10;
else
alm_m=alm_m%'d10+'d50;
else
if (alm_m<'d50)
alm_m=alm_m+'d10;
else
alm_m=alm_m%'d10;
end
else
begin
if (~pos[0])
if (~num)
if (alm_h>0)
alm_h=alm_h-1;
else
alm_h='d23;
else
if (alm_h<'d23)
alm_h=alm_h+1;
else
alm_h=0;
else
if (~num)
if (alm_h>'d9)
alm_h=alm_h-'d10;
else
alm_h=alm_h%'d10+'d10;
else
if (alm_h<'d10)
alm_h=alm_h+'d10;
else
alm_h=alm_h%'d10;
end
else;
lastas=alm_set;
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -