题目描述
创建一组适合用作12小时时钟的计数器(带有am / pm指示器)。您的计数器由快速运行的时钟提供时钟,每当您的时钟增加(即每秒一次)时,便会在ena上产生一个脉冲。
重置将时钟重置为12:00 AM。 pm对于AM是0,对于PM是1。 hh,mm和ss是两个BCD(二进制-编码的十进制数字分别代表小时(01-12),分钟(00-59)和秒(00-59)。Reset的优先级比enable的优先级高。
以下时序图显示了从11:59:59 AM到12:00:00 PM的过渡行为以及同步复位和启用行为。
请注意,11:59:59 PM前进至12:00:00 AM,12:59:59 PM前进至01:00:00 PM。没有00:00:00。从图中知道,hh、mm、ss都是8位二进制数,且分为前四位和后四位,如果前四位满足了要求,后四位就加一个数;8位都满足了要求,就复位。
解答
module top_module(
input clk,
input reset,
input ena,
output pm,
output [7:0] hh,
output [7:0] mm,
output [7:0] ss);
wire [3:0] enable;
assign enable[0] = ena;
assign enable[1] = ena & (ss==8'h59);
assign enable[2] = ena & (ss==8'h59) & (mm==8'h59);
assign enable[3] = ena & (hh==8'h11) & (ss==8'h59) & (mm==8'h59);
count60 second (clk,reset,enable[0],ss);
count60 minute (clk,reset,enable[1],mm);
count12 hour (clk,reset,enable[2],hh);
count2 halfday (clk,reset,enable[3],pm);
endmodule
module count12(
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[3:0] <= 0;
q[7:4] <= 1;
end
else
q[3:0] <= q[3:0] + 1;
end
else
q <= q;
end
endmodule
module count60(
input clk,
input reset,
input ena,
output [7:0] q);
always @(posedge clk) begin
if (reset)
q <= 0;
else if (ena) begin
if (q == 8'h59)
q <= 0;
else if (q[3:0] == 4'h9) begin
q[3:0] <= 0;
q[7:4] <= q[7:4] + 1;
end
else
q[3:0] <= q[3:0] + 1;
end
else
q <= q;
end
endmodule
module count2(
input clk,
input reset,
input ena,
output q);
always @(posedge clk) begin
if (reset)
q <= 0;
else if (ena) begin
if (q < 1'b1)
q <= q + 1;
else
q <= 0;
end
else
q <= q;
end
endmodule
太秀了