1 引言
在FPGA高速串行通信设计中,AMD的Aurora 8B/10B IP核是一个广泛应用的核心组件。然而,很多开发者在实际使用中对其关键控制信号的理解存在困惑。本文将基于官方文档PG046,深入解析gt_reset、reset、power_down和loopback这四个关键信号的作用机制、使用场景和正确操作方法。
2 信号概览
在深入细节之前,我们先通过一个表格快速了解这四个信号的基本特性:
| 信号 | 作用层级 | 时钟域 | 极性 | 主要用途 |
|---|---|---|---|---|
gt_reset | 物理层 | 异步(需init_clk去抖) | 高有效 | 收发器硬件复位 |
reset | 链路层 | 异步(需同步到user_clk) | 高有效 | 协议引擎逻辑复位 |
power_down | 物理层 | user_clk | 高有效 | 低功耗模式 |
loopback[2:0] | 物理层 | user_clk | - | 测试与调试 |
3 深度解析:gt_reset(收发器硬件复位)
3.1 手册定义:

解释:收发器的复位信号通过去抖器连接到顶层。在硬件中首次给模块上电时,应使能gt_reset端口。这将系统地复位收发器的所有物理编码子层(PCS)和物理介质连接(PMA)子组件。 该信号使用init_clk_in进行去抖处理,并且必须在六个init_clk_in时钟周期内保持有效。
3.2 理解说明:
gt_reset是对GT收发器最底层的硬件复位信号,它直接影响物理编码子层(PCS)和物理媒介适配层(PMA)。当该信号有效时:
-
复位整个收发器的模拟和数字电路
-
停止TX和RX数据路径
-
导致
txoutclk停止,进而使依赖它的user_clk也停止 -
触发Aurora核心的完全重新初始化
3.3 关键特性:

gt_reset持续时间至少为6个init_clk_in时钟周期。因此,由于收发器没有txoutclk信号,user_clk会在几个时钟周期后停止,随后channel up 信号也会被撤销。
特性总结:
-
异步但需同步处理:虽然是异步信号,但必须通过
init_clk_in进行去抖处理 -
最小脉冲宽度:至少6个
init_clk_in周期 -
破坏性操作:会导致链路完全中断,需要重新训练
3.4 使用场景与操作时序
3.4.1 上电初始化序列

// 上电后的标准复位序列
module aurora_power_on_reset (
input init_clk_in,
output reg gt_reset
);
localparam INIT_CLK_CYCLES = 10; // >6个周期
reg [3:0] init_counter = INIT_CLK_CYCLES;
always @(posedge init_clk_in) begin
if (init_counter > 0) begin
gt_reset <= 1'b1;
init_counter <= init_counter - 1;
end else begin
gt_reset <= 1'b0;
end
end
endmodule
3.4.2 运行时严重错误恢复

// 正常操作中的硬复位恢复序列
task hard_recovery;
begin
// 步骤1:先复位协议逻辑
reset <= 1'b1;
repeat(128) @(posedge user_clk); // 等待128个user_clk周期
// 步骤2:再复位收发器
gt_reset <= 1'b1;
repeat(6) @(posedge init_clk_in); // 等待6个init_clk周期
gt_reset <= 1'b0;
// 步骤3:等待收发器稳定后释放逻辑复位
wait(tx_resetdone_out && rx_resetdone_out);
reset <= 1'b0;
end
endtask
为什么需要这个序列? 先复位逻辑部分可以确保协议引擎进入已知状态,然后再停止时钟,避免状态机停留在不确定状态。
4 深度解析:reset(核心逻辑复位)
4.1 手册定义:

Reset:重置Aurora 8 B/10 B内核(高电平有效)。此信号必须至少保持有效六个用户时钟(user_clk)周期。
发送系统复位(tx_system_reset)和接收系统复位(rx_system_reset)仅适用于各自的单工内核。
4.2 理解说明:
reset信号针对Aurora协议引擎的逻辑部分,包括:
-
全局逻辑状态机
-
通道初始化状态机
-
用户数据接口的控制逻辑
-
错误检测和计数逻辑
它不会影响GT收发器的物理层状态。
4.3 关键特性:

Reset信号用于将Aurora 8B/10B核设置到一个已知的起始状态。
复位时,内核会停止当前的所有操作,并重新初始化一个新通道。
在全双工模块(full_duplex)中,reset信号会对通道的发送(TX)和接收(RX)两端进行复位。在单工模块(simplex)中,tx_system_reset(发送系统复位)信号用于复位发送通道,rx_system_reset(接收系统复位)信号用于复位接收通道。
gt_reset(全局收发器复位)信号会对收发器进行复位,最终也会复位内核。
Note:tx_system_reset信号与单工边带接口上使用的tx_reset(发送复位)和rx_reset(接收复位)信号是相互独立的。
full_duplex中的resest信号置位时间至少应为六个uesr_clk时钟周期。 如图所示,在三个user_clk时钟周期后,channel_up(通道就绪)信号会被撤销。
特性总结
-
软复位:不停止时钟,只复位逻辑状态
-
自动恢复:释放后核心会自动重新开始初始化过程
-
channel_up在复位后约3个user_clk周期内拉低
4.4 使用场景
4.4.1 系统级复位集成
Aurora IP 核对复位有特殊要求,不能简单地与其他模块使用相同的复位信号:
系统复位集成是指将 Aurora IP 核的复位信号与整个 FPGA 设计的复位架构进行统一管理和协调的过程。这不是简单地将复位信号连接在一起,而是建立一个层次化、时序化的复位策略
为什么要进行系统复位集成?
-
避免复位冲突:不同模块在不同时间需要复位
-
确保启动顺序:某些模块需要在其他模块就绪后才能工作
-
简化调试:统一的复位管理便于问题定位
-
提高可靠性:避免部分复位导致的系统不稳定
如果你只有一个外部复位 FPGA_rstn(低电平有效),这是最简单的集成方法:
4.4.1.1 基础复位连接
// 最简单的直接连接(不推荐)
aurora_8b10b_0 aurora_inst (
.reset(!FPGA_rstn), // Aurora需要高电平复位
.gt_reset(!FPGA_rstn), // 同上
// ... 其他信号
);
问题:这样连接会导致收发器和逻辑同时复位,可能违反Aurora的复位时序要求。
4.4.1.2 推荐的简单复位集成
module simple_aurora_reset (
input FPGA_rstn, // 外部低电平复位
input init_clk_in, // 自由运行的初始化时钟(如50MHz)
input user_clk, // Aurora用户时钟
output reg aurora_gt_reset,
output reg aurora_reset
);
// 同步外部复位到init_clk域
reg FPGA_rstn_sync;
always @(posedge init_clk_in) begin
FPGA_rstn_sync <= FPGA_rstn;
end
// GT复位生成 - 在init_clk域
reg [7:0] gt_reset_counter = 8'h00;
always @(posedge init_clk_in) begin
if (!FPGA_rstn_sync) begin
gt_reset_counter <= 8'h00;
aurora_gt_reset <= 1'b1;
end else if (gt_reset_counter < 8'h10) begin // 16个周期 > 6个周期要求
gt_reset_counter <= gt_reset_counter + 1;
aurora_gt_reset <= 1'b1;
end else begin
aurora_gt_reset <= 1'b0;
end
end
// 核心复位生成 - 在user_clk域
reg [7:0] core_reset_counter = 8'h00;
always @(posedge user_clk) begin
if (!FPGA_rstn || aurora_gt_reset) begin // GT复位期间也保持核心复位
core_reset_counter <= 8'h00;
aurora_reset <= 1'b1;
end else if (core_reset_counter < 8'h10) begin // 16个周期 > 6个周期要求
core_reset_counter <= core_reset_counter + 1;
aurora_reset <= 1'b1;
end else begin
aurora_reset <= 1'b0;
end
end
endmodule
4.4.1.3 与Aurora互联
// 顶层模块
module top (
input FPGA_rstn,
input init_clk_50m,
// ... 其他端口
);
wire user_clk; // Aurora输出的用户时钟
wire aurora_gt_reset, aurora_reset;
// 复位集成模块
simple_aurora_reset u_aurora_reset (
.FPGA_rstn(FPGA_rstn),
.init_clk_in(init_clk_50m),
.user_clk(user_clk),
.aurora_gt_reset(aurora_gt_reset),
.aurora_reset(aurora_reset)
);
// Aurora IP核
aurora_8b10b_0 aurora_inst (
.reset(aurora_reset),
.gt_reset(aurora_gt_reset),
.user_clk(user_clk),
// ... 其他连接
);
endmodule
4.5 关键要点
-
复位极性转换:Aurora使用高电平复位,外部
FPGA_rstn是低电平 -
时钟域分离:
-
gt_reset用init_clk_in控制(自由运行时钟) -
reset用user_clk控制(Aurora生成的时钟)
-
-
满足最小脉冲宽度:两个复位都保持至少16个时钟周期(远大于6个周期的要求)
-
复位序列:GT复位先有效,核心复位在GT复位期间也保持有效
这样就完成了最基本的Aurora系统复位集成,既简单又满足时序要求
4.6 错误恢复策略
// 基于错误计数的软复位策略
reg [15:0] soft_err_counter;
reg [7:0] reset_backoff;
always @(posedge user_clk) begin
if (soft_err) begin
soft_err_counter <= soft_err_counter + 1;
end
// 连续软错误超过阈值时触发复位
if (soft_err_counter > 16'h100) begin
reset <= 1'b1;
reset_backoff <= 8'hFF;
soft_err_counter <= 0;
end else if (reset_backoff > 0) begin
reset_backoff <= reset_backoff - 1;
end else begin
reset <= 1'b0;
end
end
5 深度解析:power_down(低功耗模式)
5.1 手册定义:

这是一个高电平有效信号。当“powerdown”(掉电)信号有效时,Aurora 8B/10B 内核中的收发器将关闭,使其进入非工作的低功耗模式。当“powerdown”信号无效时,内核将自动复位。如收发器用户指南中的说明所述,在“powerdown”信号无效后,必须使“gt_reset”信号有效。
5.2 理解说明:
power_down是四个信号中最"危险"但也是最节能的信号:
-
完全关闭GT收发器的电源域
-
停止所有串行数据传输
-
显著降低静态功耗
-
需要完整的重新初始化序列才能恢复
5.3 关键警告
时钟停止风险:如果user_clk是由tx_out_clk派生而来(这是常见配置),那么拉高power_down会导致user_clk停止,可能冻结整个FPGA设计。
5.4 使用场景与安全操作
5.4.1 安全的下电序列
module safe_power_down (
input user_clk,
input init_clk_in,
input power_down_request,
output reg power_down,
output reg gt_reset
);
typedef enum {IDLE, STOP_TRAFFIC, ASSERT_PD, DEASSERT_PD, RESET_RECOVERY} state_t;
state_t current_state = IDLE;
reg [15:0] timer;
always @(posedge user_clk) begin
case(current_state)
IDLE: begin
if (power_down_request) begin
// 先停止数据流
current_state <= STOP_TRAFFIC;
timer <= 16'h100;
end
end
STOP_TRAFFIC: begin
if (timer > 0) begin
timer <= timer - 1;
end else begin
power_down <= 1'b1;
current_state <= ASSERT_PD;
end
end
ASSERT_PD: begin
// 保持power_down状态
if (!power_down_request) begin
current_state <= DEASSERT_PD;
end
end
DEASSERT_PD: begin
power_down <= 1'b0;
current_state <= RESET_RECOVERY;
timer <= 16'h20;
end
RESET_RECOVERY: begin
if (timer > 0) begin
timer <= timer - 1;
end else begin
gt_reset <= 1'b1; // 触发gt_reset恢复
// ... 等待复位完成
current_state <= IDLE;
end
end
endcase
end
endmodule
5.4.2 适用场景分析
推荐使用:
-
电池供电设备
-
需要长时间待机的系统
-
热插拔场景
避免使用:
-
高可用性系统
-
实时性要求高的应用
-
user_clk依赖tx_out_clk的设计
6 深度解析:loopback(环回测试)
6.1 环回模式详解
loopback[2:0]支持多种测试模式,用于不同层次的故障诊断:
| 模式 | 编码 | 测试范围 | 应用场景 |
|---|---|---|---|
| 正常操作 | 3'b000 | - | 正常工作模式 |
| 近端PCS环回 | 3'b001 | FPGA逻辑 + PCS层 | 验证协议引擎 |
| 近端PMA环回 | 3'b010 | FPGA逻辑 + 整个收发器 | 验证收发器功能 |
| 远端PMA环回 | 3'b100 | 完整系统路径 | 系统级测试 |
6.2 实际应用示例
自动化链路诊断
module link_diagnostic (
input user_clk,
input init_clk_in,
input link_failed,
output reg [2:0] loopback,
output reg [7:0] diag_status
);
typedef enum {NORMAL, PCS_LOOPBACK, PMA_LOOPBACK, ANALYSIS} diag_state_t;
diag_state_t state = NORMAL;
reg [23:0] test_timer;
reg test_passed;
always @(posedge user_clk) begin
case(state)
NORMAL: begin
loopback <= 3'b000;
if (link_failed) begin
state <= PCS_LOOPBACK;
test_timer <= 24'hFFFFFF;
end
end
PCS_LOOPBACK: begin
loopback <= 3'b001;
if (test_timer > 0) begin
test_timer <= test_timer - 1;
end else begin
// 检查测试结果
if (channel_up && !hard_err) begin
diag_status[0] <= 1'b1; // PCS层正常
state <= PMA_LOOPBACK;
end else begin
diag_status <= 8'hFF; // FPGA侧故障
state <= ANALYSIS;
end
end
end
PMA_LOOPBACK: begin
loopback <= 3'b010;
// 类似PCS测试逻辑...
end
ANALYSIS: begin
// 分析测试结果并报告
end
endcase
end
endmodule
7 实战:系统级复位与初始化策略
module aurora_system_init (
input sys_clk,
input sys_reset,
input gt_refclk_stable,
output reg aurora_ready
);
// 时钟和复位声明
wire init_clk_in; // 50MHz自由运行时钟
wire user_clk; // Aurora用户时钟
reg system_gt_reset;
reg system_reset;
// 状态机
typedef enum {
POWER_ON_WAIT,
GT_RESET_PHASE,
CLOCK_WAIT,
LOGIC_RESET,
INITIALIZATION,
READY
} init_state_t;
init_state_t current_state = POWER_ON_WAIT;
reg [31:0] state_timer;
always @(posedge init_clk_in) begin
if (sys_reset) begin
current_state <= POWER_ON_WAIT;
system_gt_reset <= 1'b1;
system_reset <= 1'b1;
aurora_ready <= 1'b0;
end else begin
case(current_state)
POWER_ON_WAIT: begin
if (gt_refclk_stable) begin
current_state <= GT_RESET_PHASE;
state_timer <= 32'd100; // 等待时钟稳定
end
end
GT_RESET_PHASE: begin
system_gt_reset <= 1'b1;
if (state_timer > 0) begin
state_timer <= state_timer - 1;
end else begin
system_gt_reset <= 1'b0;
current_state <= CLOCK_WAIT;
state_timer <= 32'd1000; // 等待时钟锁定
end
end
CLOCK_WAIT: begin
if (tx_lock && (state_timer == 0)) begin
current_state <= LOGIC_RESET;
system_reset <= 1'b1;
state_timer <= 32'd128; // 128个user_clk周期
end else if (state_timer > 0) begin
state_timer <= state_timer - 1;
end
end
LOGIC_RESET: begin
if (state_timer == 0) begin
system_reset <= 1'b0;
current_state <= INITIALIZATION;
state_timer <= 32'hFFFFFFFF; // 长超时
end else begin
state_timer <= state_timer - 1;
end
end
INITIALIZATION: begin
if (channel_up) begin
current_state <= READY;
aurora_ready <= 1'b1;
end else if (state_timer == 0) begin
// 初始化超时,重新开始
current_state <= POWER_ON_WAIT;
end else begin
state_timer <= state_timer - 1;
end
end
READY: begin
// 系统正常运行
if (hard_err) begin
// 硬错误,需要重新初始化
current_state <= POWER_ON_WAIT;
aurora_ready <= 1'b0;
end
end
endcase
end
end
endmodule
8 常见问题排查
问题:channel_up 无法建立
-
检查
gt_reset是否已正确释放 -
验证参考时钟频率和稳定性
-
确认
tx_lock信号是否有效
问题:频繁的硬错误
-
检查电源质量
-
验证PCB布线和信号完整性
-
考虑启用
C_DOUBLE_GTRXRESET参数
问题:数据损坏
-
使用环回模式隔离问题
-
检查
rxdisperr和rxnotintable信号 -
验证用户接口时序
9 总结
正确理解和使用Aurora 8B/10B的四个关键控制信号对于构建稳定可靠的高速串行通信系统至关重要:
-
gt_reset是你的"核按钮",用于最严重的故障恢复 -
reset是日常的"重启键",用于逻辑级恢复 -
power_down是"休眠模式",节能但恢复复杂 -
loopback是"诊断工具",专用于测试和调试
记住这些信号的正确使用序列和时机,可以避免很多常见的链路问题,显著提高系统的稳定性和可靠性。
2061

被折叠的 条评论
为什么被折叠?



