为串行ATA(Gen1 / 2/3)配置7系列GTXE2收发器

时间:2014-08-14 20:14:27

标签: fpga xilinx sata register-transfer-level virtex

你好,这将是专家的问题:)你应该熟悉以下主题

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

问题:

如何为Serial-ATA配置GTXE2?

OOB信令既不工作RX_ElectricalIdle也不工作。

简介:

我为我的最终学士学位项目实施了一个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中,如果UG476兼容SATA设置,我会再次检查所有通用和端口。之后,我将我的包装器端口连接到MGT,并在必要时插入交叉时钟模块。

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

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

因此GXTE2接线上电,可操作且所有时钟都稳定。

用于控制OOB信令的GTXE2端口:

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序列

详细错误说明:

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

    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电缆的硬盘连接到KC705(SFP2SATA适配器)并连接了2.5 GSps示波器(是的,信号欠采样,但看到突发和空闲时间很好......)
    5. 经历:

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

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

      只有实例有ca. 650行:(

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

      附录:

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

      OOB信号意味着MGT在LVDS线上发送电气空闲和正常数据符号(Db.2,8b / 10b表示法)的突发。 SATA / SAS定义3个OOB序列调用ComInit,ComWake,ComSAS,它们具有不同的突发/空闲持续时间。主机控制器和设备使用这些"莫尔斯信号"建立联系。

1 个答案:

答案 0 :(得分:1)

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

我开始模拟GTXE2_CHANNEL hardmacro。模拟表现为" false"作为硬件。所以我尝试在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位的无约束bit_vector泛型。如果您查看了secureip GTXE2_CHANNEL组件的包装器代码,您会发现bit_vector => std_logic_vector => string的转换。在内部,所有仿制药都被视为DOWNTO范围。因此,将DOWNTO常量传递给GTXE2泛型非常重要!

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

    Xilinx ISE最新版本14.7在处理无约束泛型中用户定义类型的向量时存在一个主要缺陷。向量的默认方向是TO。如果您将枚举的向量作为DOWNTO传递给无约束的泛型到组件中,则ISE正在反转向量元素并且"发出"组件中的TO范围向量!!

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

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

    哪个任务仍然开放?<​​/ h2>
    1. TXComFinish仍未确认发送OOB序列。
    2. 我必须调查合成中的这两个错误修复并使用范围测量OOB序列 - 这可能会持续几天:)
    3. 编辑1:

      Bug 1的解决方案:

      我添加了一个超时计数器,其超时时间取决于当前的生成(时钟频率)和当前要发送的COM序列。如果超时,我生成自己的TXComFinished信号。不要使用来自GTX的原始TXComFinished信号超时信号,因为有时此信号为高而COMWAKE将被发送,但此完成的选通仍然属于先前的COMRESET序列!< / p>

      另一个Bug的解决方案:

      RXElectricalIDLE不是无故障!为了解决这个问题,我在这条线上添加了一个过滤元素,它可以抑制该线上的尖峰。

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