module clock(
input clk, // 时钟信号
output reg [3:0] hour, // 小时
output reg [3:0] min, // 分钟
output reg [3:0] sec, // 秒钟
output reg [11:0] display // 数码管显示值
);
reg [26:0] counter; // 计数器,使用 27 位存储秒数
// 秒数计数实现
always @(posedge clk) begin
if (counter == 27'd125000000) begin // 一个时钟周期为 1/50MHz,总周期为 1 秒
counter <= 0;
if (sec == 4'b1001) begin // 将秒钟计数到 59 后自动归零,累加分钟和小时
sec <= 0;
if (min == 4'b1001) begin
min <= 0;
if (hour == 4'b1001) begin
hour <= 0;
end
else begin
hour <= hour + 1;
end
end
else begin
min <= min + 1;
end
end
else begin
sec <= sec + 1;
end
end
else begin
counter <= counter + 1;
end
end
// 将时分秒数值转换为数码管显示值
wire [3:0] seg_sec = convert(seg(sec)); // 将秒钟数值转换为数码管显示值
wire [3:0] seg_min = convert(seg(min)); // 将分钟数值转换为数码管显示值
wire [3:0] seg_hour = convert(seg(hour)); // 将小时数值转换为数码管显示值
// 将时分秒数值的七段数码管显示值拼接成一条 12 位的数据线
assign display = {7'b0000001, seg_sec, 7'b0000001, seg_min, 7'b0000001, seg_hour};
// 数码管转换实现
function [3:0] convert;
input [3:0] value;
reg [3:0] result;
begin
case (value) // 数码管对应显示值
4'b0000: result = 7'b1000000; // 0
4'b0001: result = 7'b1111001; // 1
4'b0010: result = 7'b0100100; // 2
4'b0011: result = 7'b0110000; // 3
4'b0100: result = 7'b0011001; // 4
4'b0101: result = 7'b0010010; // 5
4'b0110: result = 7'b0000010; // 6
4'b0111: result = 7'b1111000; // 7
4'b1000: result = 7'b0000000; // 8
4'b1001: result = 7'b0010000; // 9
default: result = 7'b0000001; // 其他
endcase
convert = result;
end
endfunction
endmodule
唯一可能导致Con丢数据case:消费到了该消息,然后Con自动提交了offset,让kafka以为你已消费完该消息,然而其实你刚准备处理这消息,你还没处理完,你就挂了,这条消息就丢了。
因此,得关闭自动提交offset,在处理完后Con手动提交offset,即可保证数据不会丢。
但此时确实会重复消费,如你刚处理完,还没提交offset,结果自己挂了,此时肯定会重复消费一次,自己设计保证幂等即可。