在TMR(三模冗余)系统中,检测并隔离故障模块是提升可靠性的关键扩展设计。以下是具体实现方法、Verilog代码示例和设计要点:
1. 故障检测与隔离的核心思路
实时监测:对三个冗余模块的输出进行持续比对。
故障标识:通过状态机或计数器记录模块的异常次数。
动态隔离:屏蔽故障模块的输出,降级为双模冗余(DMR)或单模块运行。
2. 扩展设计实现步骤
(1) 故障检测逻辑
不一致检测器:比较三个模块的输出,标记不一致的模块。
错误计数器:对每个模块的异常行为进行计数,超过阈值则判定为故障。
(2) 动态隔离机制
输出选择器:根据故障状态选择有效的模块输出。
系统报警:触发中断或日志记录故障信息。
3. Verilog代码实现
(1) 故障检测模块
verilog
module fault_detector (
input wire clk,
input wire rst_n,
input wire [2:0] results, // 三个模块的输出 [A, B, C]
output reg [2:0] fault_flags // 故障标志位 [A_fault, B_fault, C_fault]
);
reg [2:0] error_count [0:2]; // 每个模块的错误计数器
parameter ERROR_THRESHOLD = 3; // 错误阈值
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
fault_flags <= 0;
error_count[0] <= 0;
error_count[1] <= 0;
error_count[2] <= 0;
end else begin
// 检测不一致
if (results[0] != results[1] || results[0] != results[2]) begin
// 标记异常模块
if (results[0] != results[1] && results[0] != results[2])
error_count[0] <= error_count[0] + 1; // A异常
if (results[1] != results[0] && results[1] != results[2])
error_count[1] <= error_count[1] + 1; // B异常
if (results[2] != results[0] && results[2] != results[1])
error_count[2] <= error_count[2] + 1; // C异常
end
// 更新故障标志
for (int i = 0; i < 3; i = i + 1) begin
if (error_count[i] >= ERROR_THRESHOLD)
fault_flags[i] <= 1'b1; // 标记故障
end
end
end
endmodule
(2) 动态表决器(支持隔离故障模块)
verilog
module adaptive_voter (
input wire [2:0] results, // 三个模块的输出 [A, B, C]
input wire [2:0] fault_flags, // 故障标志位
output reg out // 最终输出
);
always @(*) begin
case (fault_flags)
3'b000: out = (results[0] & results[1]) | (results[1] & results[2]) | (results[0] & results[2]); // 正常TMR
3'b001: out = results[0] & results[1]; // C故障,降级为A&B表决
3'b010: out = results[0] & results[2]; // B故障
3'b100: out = results[1] & results[2]; // A故障
default: out = results[0]; // 多个故障,默认选A(可自定义策略)
endcase
end
endmodule
(3) 顶层集成
verilog
module tmr_system_with_fault_isolation (
input wire clk,
input wire rst_n,
input wire data_in,
output wire data_out,
output wire [2:0] fault_leds // 故障指示灯
);
wire [2:0] results;
wire [2:0] fault_flags;
// 三个冗余模块
module_a u_module_a (.clk(clk), .rst_n(rst_n), .in(data_in), .out(results[0]));
module_b u_module_b (.clk(clk), .rst_n(rst_n), .in(data_in), .out(results[1]));
module_c u_module_c (.clk(clk), .rst_n(rst_n), .in(data_in), .out(results[2]));
// 故障检测与隔离
fault_detector u_detector (
.clk(clk),
.rst_n(rst_n),
.results(results),
.fault_flags(fault_flags)
);
adaptive_voter u_voter (
.results(results),
.fault_flags(fault_flags),
.out(data_out)
);
assign fault_leds = fault_flags; // 故障状态输出
endmodule
4. 关键设计要点
错误计数阈值:
根据系统容错需求设置ERROR_THRESHOLD,避免瞬时干扰误判。
降级策略:
单模块故障时降级为双模表决,多模块故障时可切换至备份模块或安全模式。
时序同步:
所有冗余模块需严格同步时钟,避免相位差导致误检测。
故障恢复:
可添加复位机制,定期清零错误计数器(如看门狗定时器)。
5. 扩展功能
BIST(内建自测试):
定期触发模块自检,主动发现潜在故障。
动态重构:
在FPGA中,可通过部分重配置替换故障模块。
错误报告:
通过UART或I2C上报故障信息至主控系统。
6. 应用场景
航天电子:抗辐射芯片中实时隔离SEU(单粒子翻转)影响的模块。
自动驾驶:传感器数据冗余处理,屏蔽失效传感器。
工业PLC:关键控制信号的三重冗余容错。