题目要求:使用8bit的2位16进制数表示时分秒,实现一个带am/pm指示的12小时制时钟
思路:
先理清需要进位的情况,再用条件分情况对output信号进行赋值;
需注意分和秒的进位方法,8'h09->8'h10,8'h19->8'h20...;小时的进位8'12->8'01;
解法:
module top_module(
input clk,
input reset,
input ena,
output pm,
output [7:0] hh,
output [7:0] mm,
output [7:0] ss);
wire ss_carry = (ss == 8'h59) ? 1'b1:1'b0;
wire mm_carry = (mm == 8'h59) ? 1'b1:1'b0;
always @(posedge clk) begin
if(reset) begin
pm <= 1'b0;
hh <= 8'h12;
mm <= 8'h00;
ss <= 8'h00;
end else if (!ena) begin
pm <= 1'b0;
hh <= hh;
mm <= mm;
ss <= ss;
end else begin
if (!ss_carry) begin
if (ss[3:0] == 4'h9) begin
pm <= pm;
hh <= hh;
mm <= mm;
ss <= {ss[7:4]+4'h1,4'h0};
end else begin
pm <= pm;
hh <= hh;
mm <= mm;
ss <= ss + 8'h1;
end
end
else if (ss_carry &!mm_carry) begin
if (mm[3:0]==4'h9) begin
pm <= pm;
hh <= hh;
mm <= {mm[7:4]+4'h1,4'h0};
ss <= 8'h00;
end else begin
pm <= pm;
hh <= hh;
mm <= mm + 8'h1;
ss <= 8'h00;
end
end
else if (ss_carry & mm_carry) begin
mm <= 8'h00;
ss <= 8'h00;
if (hh < 8'h09 | hh == 8'h10) begin
pm <= pm;
hh <= hh + 8'h1;
end else if (hh == 8'h9) begin
pm <= pm;
hh <= 8'h10;
end else if (hh == 8'h11) begin
pm <= ~pm;
hh <= 8'h12;
end else begin
pm <= pm;
hh <= 8'h01;
end
end
end
end
endmodule