|
我用verilog语言设计的电子时钟程序,烧写到开发板中,分钟和秒钟的走时正常,可是小时的两个数码管始终没有显示,分钟计到59后,小时也不计1,始终显示00,请求那位高手帮我解决一下!万分感谢。
module clock_ver1(clr_key,clk,segdat,sl);
input clr_key;//复位信号,低电平有效
input clk;//系统时钟20MHZ
output[7:0]segdat;//八段数码管显示输出
output[5:0]sl;//数码管位选
reg[24:0]count;//对系统时钟进行计数
reg[7:0]sec,min,hou;//分、秒的八位寄存器
reg[7:0]segdat_reg;//数码管显示输出寄存器
reg[5:0]sl_reg;//数码管位选寄存器
reg[5:0]disp_dat;//数码管分、秒显示
reg second;//分频后产生1HZ的秒信号
reg cn;//秒向分的进位,高有效
reg cn_hou;//分向时进位信号
//对系统时钟进行分频,产生1HZ信号
always@(posedge clk)
begin
count<=count+1'b1;
if(count==25'd99999)
begin
count<=25'h000000;
second<=~second;
end
end
//***********************************************************************//
//利用计数器的第十二、十三位选中分、秒
always@(count[12:10])
begin
case(count[12:10])
3'b000:disp_dat<=sec[3:0];
3'b001:disp_dat<=sec[7:4];
3'b010:disp_dat<=min[3:0];
3'b011:disp_dat<=min[7:4];
3'b100:disp_dat<=hou[3:0];
3'b101:disp_dat<=hou[7:4];
default: disp_dat <= 4'bx;
endcase
end
//************************************************************************//
//八段数码管显示输出
always@(disp_dat)
begin
case(disp_dat)
4'h0:segdat_reg<=8'hc0;
4'h1:segdat_reg<=8'hf9;
4'h2:segdat_reg<=8'ha4;
4'h3:segdat_reg<=8'hb0;
4'h4:segdat_reg<=8'h99;
4'h5:segdat_reg<=8'h92;
4'h6:segdat_reg<=8'h82;
4'h7:segdat_reg<=8'hf8;
4'h8:segdat_reg<=8'h80;
4'h9:segdat_reg<=8'h90;
default: segdat_reg <= 8'hx;
endcase
/*if((count[12:11]==2'b10)&second)
segdat_reg=segdat_reg&8'b01111111;*/
end
//***************************************************************************//
//位选
always@(count[12:10])
begin
case(count[12:10])
3'b000:sl_reg<=6'b111110;
3'b001:sl_reg<=6'b111101;
3'b010:sl_reg<=6'b111011;
3'b011:sl_reg<=6'b110111;
3'b100:sl_reg<=6'b101111;
3'b101:sl_reg<=6'b011111;
default:sl_reg<=6'bx;
endcase
end
//****************************************************************************//
//秒计时
always@(posedge second )
begin
if(!clr_key)//复位
begin
sec[7:0]<=8'h0;
cn<=0;
end
else
begin
cn<=0;
sec[3:0]<=sec[3:0]+1;
if(sec[3:0]==4'd9)//秒低位计到十
begin
sec[3:0]<=4'd0;
sec[7:4]<=sec[7:4]+1;
if(sec[7:4]==4'd5 && sec[3:0]==4'd9)//秒高位计到六
begin
sec[7:4]<=4'd0;
cn<=1'd1;
end
end
end
end
//*******************************************************************//
//秒向分产生进位信号cn
always@(posedge cn)
begin
if(!clr_key)
begin
min[7:0]<=8'h0;
end
else
begin
min[3:0]<=min[3:0]+1'b1;
if(min[3:0]==4'd9)
begin
min[3:0]<=4'd0;
min[7:4]<=min[7:4]+1'b1;
if(min[7:4]==4'd5 && min[3:0] == 4'd9)
begin
min[7:4]<=4'd0;
cn_hou <= 1'd1;
end
end
end
end
//*****************************************************************
//分向时产生进位信号an
always@(posedge cn_hou)
begin
if(!clr_key)
begin
hou[7:0]<=0;
end
else
begin
hou[3:0]<=hou[3:0]+1'b1;
if(hou[3:0]==4'd9)
begin
hou[3:0]<=4'd0;
hou[7:4]<=hou[7:4]+1'b1;
end
if(hou[7:4]==4'd2 && hou[3:0]==4'd3)
begin
hou[7:0]<=8'h0;
end
else
hou[3:0]<=hou[3:0]+1'b1;
end
end
assign segdat=segdat_reg;
assign sl=sl_reg;
endmodule |
|