2

您好,这将是一个专家问题:) 您应该熟悉以下主题

  • Xilinx 多千兆位收发器 (MGT),尤其是 7 系列 GTX/GTH 收发器 (GTXE2_CHANNEL)
  • 串行 ATA Gen1、Gen2 和 Gen3,尤其是带外 (OOB) 通信

问题:

应该如何为 Serial-ATA 配置 GTXE2?

OOB 信号在 RX_ElectricalIdle 和 ComInit 中都不起作用。

介绍:

我为我的最后一个本科项目实现了一个 SATA 控制器,它支持多个供应商/设备平台(Xilinx Virtex-5、Altera Stratix II、Altera Stratix IV)。现在是时候将该控制器移植到下一个器件系列:Xilinx 7 系列器件,即 KC705 板上的 Kintex-7。

SATA 控制器在物理层中有一个额外的抽象层,它基于 SAPIS 和 PIPE 3.0。因此,要将 SATA 控制器移植到新的设备系列,我只需为 GTXE2 MGT 编写一个新的收发器包装器。

由于 Xilinx 的 CoreGenerator 不支持 CoreGen 向导中的 SATA 协议,我从头开始了一个收发器项目,并根据向导的要求应用了所有必要的设置。之后,我将 GTXE2_COMMON 实例复制到我的包装模块中,将泛型和端口排序为一个有意义的完整模式。

作为第三步,我将所有未连接的端口(向导不会分配所有值!!)连接到它们的默认值(来自 UG476 的默认值,如果未定义,则为零)。

在第 4 步中,如果它们与 SATA 设置兼容,我会再次对照 UG476 检查所有泛型和端口。之后,我将包装器端口连接到 MGT 并在必要时插入交叉时钟模块。

由于 KC705 板没有 150 MHz 参考时钟,我对 Si570 进行编程以在每个板“启动”后将此时钟作为“ProgUser_Clock”提供。在重新配置时,MGT 处于断电模式 (P2)。当 Si570 稳定时,MGT 上电,使用的通道 PLL (CPLL) 在 ca 后锁定。6180 个时钟周期。此 CPLL_Locked 事件释放 GTX_TX|RX_Reset 线,这会在额外的 270|1760 个周期(所有周期 @ 150 MHz -> 6.6 ns)后导致 GTX_TX|RX_ResetDone 事件。

这种行为可以在chipscope中看到,使用稳定、不间断的辅助时钟(200 MHz,略微过采样)捕获。

所以 GXTE2 接缝上电、运行和所有时钟都稳定。

GTXE2 端口控制 OOB 信令:

MGT 有几个用于 OOB 信令的端口。在 TX,这些是:

  • TX_ElectricalIdle - 强制 TX 进入电气空闲状态
  • TX_ComInit - 发送一个 ComInit 序列
  • TX_ComWake - 发送 ComWake 序列
  • TX_ComFinish - 序列已发送 -> 准备好下一个命令

在 RX 上:

  • RX_ElectricalIdle - RX_n/TX_p 处于电气空闲状态(低级接口)
  • RX_ComInit_Detected - 发送了完整的 ComInit 序列
  • RX_ComWake_Detected - 发送了完整的 ComWake 序列

详细错误说明:

  1. 如果 TX_ComInit 在一个周期内为高电平,则 TX 不发送 OOB 序列。
  2. RX_ElectricalIdle 始终为高电平

测试:

  1. SATA 环回电缆:剪断 SATA 电缆并焊接适当的电线;)——我正在使用特殊的 SFP 到 SATA 适配器,它通过 SATA 连接器扩展 KC705 - http://shop.trioflex.ee/product.php ?id_product=73
  2. SMA 环回电缆:我移动了 MGT 并将 LVDS 线连接到 SMA 插孔,并安装了 2 条 SMA 电缆作为交叉线。
  3. 我用板载 SATA 连接器对旧的 ML505 (Virtex-5) 进行了编程,以发送 ComInit 序列。2 块板通过特殊的 SATA 交叉电缆连接。
  4. 我将带有部分剥离 SATA 电缆的 HDD 连接到 KC705(SFP2SATA 适配器)并连接了 2.5 GSps 示波器(是的,信号采样不足,但很高兴看到突发和空闲时间......)。

经验:

  • 测试 3 显示从 Virtex-5 传输到 Kintex-7 的 OOB 序列,但未发生 ChipScope 触发事件 - Rx_ElectricalIdle 仍然为高电平。
  • 测试 4 显示电缆上没有传输的 OOB 序列。

我应该发布零件还是完整的收发器实例化?

只有实例有 ca。650行:(

请询问您是否需要更多信息,图像,代码,... :)

附录:

电气空闲意味着 MGT 以 0..2000 mV 范围内的共模电压 (V_cm) 驱动两条 LVDS 线 (TX_n/TX_p)。如果满足此条件,则共模增量电压小于 100 mV,称为 ElectricalIdle 条件。

OOB 信令意味着 MGT 在 LVDS 线上传输电空闲和正常数据符号(8b/10b 表示法中的 D10.2)突发。SATA/SAS 定义了 3 个 OOB 序列,称为 ComInit、ComWake、ComSAS,它们具有不同的突发/空闲持续时间。主机控制器和设备使用这些“莫尔斯信号”来建立链接。

4

1 回答 1

2

所以我想我找到了问题的一些答案并想分享它们。

我开始模拟 GTXE2_CHANNEL 硬宏。模拟的行为与硬件一样“错误”。所以我尝试在 Verilog 中模拟 MGT 并使用此处的实例模板: http ://forums.xilinx.com/t5/7-Series-FPGAs/Using-v7gtx-as-sata-host-PHY-and-there -is-issue-bout-ALIGN/td-p/374203

此模板模拟 ElectricalIDLE 条件和 OOB 序列几乎正确。所以我开始区分这两种解决方案:

  1. TXPDELECIDLEMODE,这是一个选择 TXElectricalIDLE 行为的端口,它没有按预期工作。所以现在我使用的是同步模式。

  2. PCS_RSVD_ATTR 是 48 位的无约束位向量泛型。如果您查看 secureip GTXE2_CHANNEL 组件的包装代码,您会发现从bit_vector => std_logic_vector => string. 在内部,所有泛型都被视为 DOWNTO 范围。因此,将 DOWNTO 常量传递给 GTXE2 泛型很重要!

所以现在你可能会问他为什么要使用范围常数和泛型?

直到最新版本 14.7 的赛灵思 ISE 在处理无约束泛型中用户定义类型的向量时存在一个重大错误。矢量的默认方向是 TO。如果您将枚举向量作为 DOWNTO 传递给不受约束的泛型到组件中,则 ISE 将反转向量元素并在组件中“发出” TO 范围向量!

如果使用此泛型的设计层次结构不是平衡树,则这尤其“有趣”...

如果您使用 2 个元素的枚举,则问题不存在 -> 也许这个枚举被映射到布尔值。

哪些任务仍处于打开状态?

  1. TXComFinish 仍未确认发送 OOB 序列。
  2. 我必须在综合中调查这两个错误修复并使用范围测量 OOB 序列 - 这可能会持续几天:)

编辑1:

错误1的解决方案:

我添加了一个超时计数器,其超时取决于当前代(时钟频率)和要发送的当前 COM 序列。如果达到超时,我会生成自己的 TXComFinished 信号。不要超时信号与来自 GTX 的原始 TXComFinished 信号,因为有时在发送 COMWAKE 时这个信号是高电平,但是这个完成的选通仍然属于之前的 COMRESET 序列!

另一个Bug的解决方案:

RXElectricalIDLE 并非无故障!为了解决这个问题,我在这条线上添加了一个过滤器元件,它可以抑制那条线上的尖峰。

所以目前我的控制器在带有 SFP2SATA 适配器的 KC705 板上以 1.5 GHz 的 SATA Gen1 运行,我认为这个问题已经解决。

于 2014-08-23T15:03:32.797 回答