自己编的数字钟,哪里分享,初学不要笑我欧
可以显示时,分,秒,具有五个按键,一个复位,一个小时加,一个小时减,一个分钟加,一个分钟减。 module clk_1k(inputclk, outputCPout);reg Cout;
reg CP_En;
always @(posedge clk ) //将50MHz分频为1kHz
begin
if(Cout==32'd25000)
begin
Cout<=32'd0;
CP_En<=~CP_En;
end
else
Cout<=Cout+32'd1;
end
assign CPout=CP_En;
endmodule
module ctl( clk,S1,S2,S3,S4,RST,Hour1,Minute1,Second1,Hour2,Minute2,Second2,LED );
input clk,S1,S2,S3,S4,RST;
//CPout=50M,Cpout=1kHz,S1和S2分别用来调整小时和分钟,RST用来进行复位
output Hour1,Hour2;//小时显示数
output Minute1,Minute2;//分显示数
output Second1,Second2;//秒显示数
output LED;//整点报时灯
reg Hour11,Hour21;
reg Minute11,Minute21;
reg Second11,Second21;
reg LED1;
reg S1_r,S1_n,S2_r,S2_n,RST_r,RST_n;//用于按键去抖动
reg S3_r,S3_n,S4_r,S4_n;
reg cnt; //按键去抖动计数用
reg Cout;
reg Clk_En;//用于分频,产生1HZ的记时时钟
always @ (posedge clk)
cnt <= cnt+1'b1; //循环计数
always @(posedge clk)
if(cnt==20'hfffff)
begin
S1_n<=S1;
S2_n<=S2;
RST_n<=RST;
S3_n<=S3;
S4_n<=S4;
end
always @(posedge clk)
begin
S1_r<=S1_n;
S2_r<=S2_n;
RST_r<=RST_n;
S3_r<=S3_n;
S4_r<=S4_n;
end
wire S1_f=(~S1_n)&S1_r;
wire S2_f=(~S2_n)&S2_r;
wire S3_f=(~S3_n)&S3_r;
wire S4_f=(~S4_n)&S4_r;
wire RST_f=(~RST_n)&RST_r;//按键去抖动所用
always@(posedge clk)
begin
if(S1_f==1)//对小时的控制
begin
if((Hour11<4'b1001)&&(Hour21<4'b0010))
begin
Hour11<=Hour11+4'b0001;
end
else if((Hour11<4'b0011)&&(Hour21==4'b0010))
Hour11<=Hour11+4'b0001;
else
begin
Hour11<=4'b0000;
if(Hour21<4'b0010)
Hour21<=Hour21+4'b0001;
else
begin
Hour21<=4'b0000;
end
end
end
if(S3_f==1)//对小时的控制
begin
if(Hour11>4'b0000)
begin
Hour11<=Hour11-4'b0001;
end
else if((Hour11==4'b0000)&&(Hour21>4'b0000))
begin
Hour11<=4'b1001;
Hour21<=Hour2-4'b0001;
end
else
begin
Hour11<=4'b0011;
Hour21<=4'b0010;
end
end
if(S2_f==1)//对分钟的控制
begin
if(Minute11<4'b1001)
Minute11<=Minute11+4'b0001;
else
begin
Minute11<=4'b0000;
if(Minute21<4'b0101)
Minute21<=Minute21+4'b0001;
else
Minute21<=4'b0000;
end
end
if(S4_f==1)//对分钟的控制
begin
if(Minute11>4'b0000)
Minute11<=Minute11-4'b0001;
else
if((Minute21>4'b0000)&&(Minute11==4'b0000))
begin
Minute21<=Minute21-4'b0001;
Minute11<=4'b1001;
end
else
begin
Minute21<=4'b0101;
Minute11<=4'b1001;
end
end
if(RST_f==1)//清零
begin
Hour11<=4'b0000;
Minute11<=4'b0000;
Second11<=4'b0000;
Hour21<=4'b0000;
Minute21<=4'b0000;
Second21<=4'b0000;
end
Cout<=(Cout==26'd5000_0000)?26'd0:(Cout + 26'd1);
Clk_En<=(Cout==26'd5000_0000)?1'b1:1'b0;//分频,产生1Hz的时钟信号
if(Clk_En)
begin
begin
if(Second11<4'b1001)//时间自动运行
begin
Second11<=Second11+4'b0001;
end
else
begin
Second11<=4'b0000;
if(Second21<4'b0101)
begin
Second21<=Second21+4'b0001;
end
else
begin
Second21<=4'b0000;
end
end
end
begin
if((Second21==4'b0101)&&(Second11==4'b1001))
begin
if(Minute11<4'b1001)
begin
Minute11<=Minute11+4'b0001;
end
else
begin
Minute11<=4'b0000;
if(Minute21<4'b0101)
begin
Minute21<=Minute21+4'b0001;
end
else
begin
Minute21<=4'b0000;
end
end
end
end
begin
if((Second21==4'b0101)&&(Second11==4'b1001)&&(Minute21==4'b0101)&&(Minute11==4'b1001))
begin
if((Hour11<4'b1001)&&(Hour21<4'b0010))
begin
Hour11<=Hour11+4'b0001;
end
else if((Hour11<4'b0011)&&(Hour21==4'b0010))
Hour11<=Hour11+4'b0001;
else
begin
Hour11<=4'b0000;
if(Hour21<4'b0010)
Hour21<=Hour21+4'b0001;
else
Hour21<=4'b0000;
end
end
end
if((Minute21==4'b0101)&&(Minute11==4'b1001)&&(Second11>4'b0101)&&(Second21==4'b0101))//整点倒计时
begin
if(LED1==1)
LED1<=0;
else
LED1<=1;
end
else
LED1<=0;
end
end
assign Second1=Second11;
assign Second2=Second21;
assign Minute1=Minute11;
assign Minute2=Minute21;
assign Hour1=Hour11;
assign Hour2=Hour21;
assign LED=LED1;
endmodule
module display( clk,Hour1,Minute1,Second1,Hour2,Minute2,Second2,SEL,LEDAG);
inputclk;
inputHour1,Minute1,Second1,Hour2,Minute2,Second2;
output SEL;
reg SEL_n;
output LEDAG;
reg SEL_r;
reg Led;
parameter seg0 = 8'hc0,//共阳七段数码管的值seg0 = 8'h3f,
seg1 = 8'hf9,//seg1 = 8'h06,
seg2 = 8'ha4,//seg2 = 8'h5b,
seg3 = 8'hb0,//seg2 = 8'h4f,
seg4 = 8'h99,//seg4 = 8'h66,
seg5 = 8'h92,//seg5 = 8'h6d,
seg6 = 8'h82,//seg6 = 8'h7d,
seg7 = 8'hf8,//seg7 = 8'h07,
seg8 = 8'h80,//seg8 = 8'h7f,
seg9 = 8'h90,//seg9 = 8'h6f;
dian = 8'h7f;
always @(posedge clk )
begin
if(SEL_r==3'b000) //判断位选SEL的值,并将此位上的值输出到数码管
case(Second1)
4'b0000: Led <= seg0;
4'b0001: Led <= seg1;
4'b0010: Led <= seg2;
4'b0011: Led <= seg3;
4'b0100: Led <= seg4;
4'b0101: Led <= seg5;
4'b0110: Led <= seg6;
4'b0111: Led <= seg7;
4'b1000: Led <= seg8;
4'b1001: Led <= seg9;
default: Led <= seg0;
endcase
if(SEL_r==3'b001)
case(Second2)
4'b0000: Led <= seg0;
4'b0001: Led <= seg1;
4'b0010: Led <= seg2;
4'b0011: Led <= seg3;
4'b0100: Led <= seg4;
4'b0101: Led <= seg5;
4'b0110: Led <= seg6;
4'b0111: Led <= seg7;
4'b1000: Led <= seg8;
4'b1001: Led <= seg9;
default: Led <= seg0;
endcase
if(SEL_r==3'b010)
Led<=dian;
if(SEL_r==3'b011)
case(Minute1)
4'b0000: Led <= seg0;
4'b0001: Led <= seg1;
4'b0010: Led <= seg2;
4'b0011: Led <= seg3;
4'b0100: Led <= seg4;
4'b0101: Led <= seg5;
4'b0110: Led <= seg6;
4'b0111: Led <= seg7;
4'b1000: Led <= seg8;
4'b1001: Led <= seg9;
default: Led <= seg0;
endcase
if(SEL_r==3'b100)
case(Minute2)
4'b0000: Led <= seg0;
4'b0001: Led <= seg1;
4'b0010: Led <= seg2;
4'b0011: Led <= seg3;
4'b0100: Led <= seg4;
4'b0101: Led <= seg5;
4'b0110: Led <= seg6;
4'b0111: Led <= seg7;
4'b1000: Led <= seg8;
4'b1001: Led <= seg9;
default: Led <= seg0;
endcase
if(SEL_r==3'b101)
Led<=dian;
if(SEL_r==3'b110)
case(Hour1)
4'b0000: Led <= seg0;
4'b0001: Led <= seg1;
4'b0010: Led <= seg2;
4'b0011: Led <= seg3;
4'b0100: Led <= seg4;
4'b0101: Led <= seg5;
4'b0110: Led <= seg6;
4'b0111: Led <= seg7;
4'b1000: Led <= seg8;
4'b1001: Led <= seg9;
default: Led <= seg0;
endcase
if(SEL_r==3'b111)
case(Hour2)
4'b0000: Led <= seg0;
4'b0001: Led <= seg1;
4'b0010: Led <= seg2;
4'b0011: Led <= seg3;
4'b0100: Led <= seg4;
4'b0101: Led <= seg5;
4'b0110: Led <= seg6;
4'b0111: Led <= seg7;
4'b1000: Led <= seg8;
4'b1001: Led <= seg9;
default: Led <= seg0;
endcase
end
always @(posedge clk )
SEL_r<=SEL_r+3'b001;
always @(posedge clk )
begin
case(SEL_r)
3'b000:SEL_n<=8'b0111_1111;
3'b001:SEL_n<=8'b1011_1111;
3'b010:SEL_n<=8'b1101_1111;
3'b011:SEL_n<=8'b1110_1111;
3'b100:SEL_n<=8'b1111_0111;
3'b101:SEL_n<=8'b1111_1011;
3'b110:SEL_n<=8'b1111_1101;
3'b111:SEL_n<=8'b1111_1110;
endcase
end
assign LEDAG=Led;
assign SEL=SEL_n;
endmodule 感谢分享 可以使用NIOsII 试一试
页:
[1]