注意:
1. 二进制中9后面为a,而不是10,因此十位以上的数需要将个位和十位分开讨论,即 s[3:0]==4‘d9是否成立,若成立再判断s[7:4]==4'd5是否成立
2. 此题中12表示为十六进制的 8'h12 , 而不是十进制的 8'd12
3. 复位为12:00:00,pm为0
4.时针为12后不复位到0,而复位到1
module top_module(
input clk,
input reset,
input ena,
output pm,
output [7:0] hh,
output [7:0] mm,
output [7:0] ss);
wire enam,enah,enap;
assign enam=(ss==8'h59);
assign enah=(ss==8'h59 && mm==8'h59);
assign enap=(ss==8'h59 && mm==8'h59 && hh==8'h11);
s s1(.clk(clk),.reset(reset),.ena(ena),.ss(ss));
m m1(.clk(clk),.reset(reset),.ena(enam),.mm(mm));
h h1(.clk(clk),.reset(reset),.ena(enah),.hh(hh));
p p1(.clk(clk),.reset(reset),.ena(enap),.pm(pm));
endmodule
module s(input clk, input reset, input ena, output [7:0]ss);
always@(posedge clk) begin
if(reset) ss<=0;
else if(ena) begin
if(ss[3:0]==4'd9) begin ss[3:0]<=0;
if(ss[7:4]==4'd5) ss[7:4]<=0;
else ss[7:4]++; end
else ss[3:0]++;
end
end
endmodule
module m(input clk, input reset, input ena, output [7:0]mm);
always@(posedge clk) begin
if(reset) mm<=0;
else if(ena) begin
if(mm[3:0]==4'd9) begin mm[3:0]<=0;
if(mm[7:4]==4'd5) mm[7:4]<=0;
else mm[7:4]++; end
else mm[3:0]++;
end
end
endmodule
module h(input clk, input reset, input ena, output [7:0]hh);
always@(posedge clk) begin
if(reset) hh<=8'h12;
else if(ena) begin
if(hh==8'h12) hh<=1;
else if(hh[3:0]==4'd9) begin hh[3:0]<=0; hh[7:4]++; end
else hh[3:0]++;
end
end
endmodule
module p(input clk, input reset, input ena, output pm);
always@(posedge clk) begin
if(reset) pm<=0;
else if(ena) pm=~pm;
end
endmodule