为Serial-ATA (Gen1/2/3)配置7-Series GTXE2收发器



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

  • 赛灵思多千兆收发器(MGTs),特别是7系列GTX/GTH收发器(GTXE2_CHANNEL)
  • Serial-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中,我再次针对UG476检查了所有泛型和端口,如果它们与SATA设置兼容。之后,我将包装器端口连接到MGT,并在必要时插入跨时钟模块。

由于KC705板没有150 MHz参考时钟,我编程Si570在每个板"启动"后将该时钟提供为"ProgUser_Clock"。在重新配置时,MGT处于下电模式(P2)。当Si570稳定时,MGT上电,使用的CPLL (Channel PLL)在大约6180时钟周期后锁定。这个CPLL_Locked事件释放GTX_TX|RX_Reset线,在额外的270|1760个周期(所有周期@ 150 MHz -> 6,6 ns)后导致GTX_TX|RX_ResetDone事件。

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

所以GXTE2似乎是通电的,运行的,所有的时钟都是稳定的。

GTXE2端口用于控制OOB信令:

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

  • TX_ElectricalIdle -强制TX进入电空闲状态
  • TX_ComInit -发送ComInit序列
  • TX_ComWake -发送ComWake序列
  • TX_ComFinish -序列被发送->准备下一个命令
  • 在处方:

  • 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适配器,它扩展了KC705与SATA连接器- http://shop.trioflex.ee/product.php?id_product=73
  2. SMA环回电缆:我移动了MGT并将LVDS电线连接到SMA插孔上,并安装了2根SMA电缆作为交叉。
  3. 我用板载SATA连接器编程了我的旧ML505 (Virtex-5)来发送ComInit序列。
  4. 通过SATA专用交叉网线连接。
  5. 我将一个带有部分剥离SATA电缆的硬盘连接到KC705 (SFP2SATA适配器),并连接了一个2.5 GSps范围(是的,信号是欠采样的,但很高兴看到突发和空闲时间…)。

经历:

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

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

只有实例有大约650行:(

如果你需要更多的信息,图片,代码,…:)

附录:

电气空闲意味着MGT驱动LVDS线(TX_n/TX_p)与共模电压(V_cm),其范围为0..2000 mV。若满足此条件,则共模增量电压小于100mv,称为ElectricalIdle状态。

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

所以我想我找到了一些问题的答案,想和大家分享。

我开始模拟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位的无约束bit_vector泛型。如果您查看一下secureip GTXE2_CHANNEL组件的包装器代码,您将发现从bit_vector => std_logic_vector => string的转换。在内部,所有泛型都被视为DOWNTO范围。所以传递一个DOWNTO常量给GTXE2泛型是很重要的!

那么现在你可能会问为什么他使用范围小的常量和泛型?

Xilinx ISE直到最新版本14.7在处理无约束泛型中用户定义类型的向量方面有一个主要错误。向量的默认方向是TO。如果您将枚举的向量作为DOWNTO传递到无约束泛型到组件中,ISE将反转向量元素并在组件中"发射"一个to范围的向量!!

如果使用这个泛型的设计层次结构不是一个平衡的树,这就特别"有趣"了。

如果你使用的是包含2个元素的枚举,问题不存在->也许这个枚举被映射为布尔值。

哪些任务仍然打开?

  1. TXComFinish仍然不承认发送的OOB序列。
  2. 我必须调查这两个错误修复在合成和测量OOB序列的范围-这可能会持续几天:)

编辑1:

Bug 1的解决方案:

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

另一个Bug的解决方案:

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

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

相关内容

  • 没有找到相关文章

最新更新