解析:
需要实现一个时钟。分别建立一个60计数和12计数的BCD时钟.
代码:
module top_module(
input clk,
input reset,
input ena,
output pm,
output [7:0] hh,
output [7:0] mm,
output [7:0] ss);
reg[2:0] enable;
//秒分时 使能
assign enable[0] = ena;
assign enable[1] = ena&&(ss==8'h59);
assign enable[2] = ena&&(ss==8'h59)&&(mm==8'h59);
//分别调用12,60计数器
cont60 u1(clk,reset,enable[0],ss);
cont60 u2(clk,reset,enable[1],mm);
cont12 u3(clk,reset,enable[2],hh);
//AM\PM指示,在11:59:59时取反即可
always@(posedge clk)
begin
if(reset) pm<=1'b0;
else if((hh==8'h11)&&(mm==8'h59)&&(ss==8'h59))
pm=~pm;
end
endmodule
//60计数器
module cont60(
input clk,
input reset,
input ena,
output [7:0] q );
always@(posedge clk)
begin
if(reset) q<=8'b0;
else if (ena)
begin
if(q==8'h59) q<=8'b0;
else
begin
if(q[3:0]==4'b1001)
begin
q[3:0]<=4'b0;
q[7:4]<=q[7:4]+1'b1;
end
else q[3:0]=q[3:0]+1'b1;
end
end
end
endmodule
//12计数器
module cont12(
input clk,
input reset,
input ena,
output [7:0] q );
always@(posedge clk)
begin
if(reset) q<=8'h12;
else if(ena)
begin
if(q==8'h12) q<=8'h1;
else if(q[3:0]==4'h9)
begin
q[7:4]<=q[7:4]+1'b1;
q[3:0]<=4'b0;
end
else q[3:0]<=q[3:0]+1'b1;
end
end
endmodule