嵌入式硬件-Xilinx FPGA DDR4 接口的 PCB 准则

目录

1. 简介

1.1 FPGA-MIG 与 DDR4 介绍

1.2 DDR4 信号介绍

1.2.1 Clock Signals

1.2.2 Address and Command Signals

1.2.3 Control Signals

1.2.4 Data Signals

1.2.5 Other Signals

2. 通用存储器布线准则

3. Xilinx FPGA-MIG 的 PCB 准则

3.1 引脚配置

3.1.1 Bank/Byte Planner

3.1.2 Signal Group

3.1.3 自动分配信号组

3.1.4 DRC 检查

3.1.5 Vivado 编译检查

3.1.6 引脚交换

3.1.6.1 DQS/DQ/DM 位置

3.1.6.2 成对使用x4组件

3.1.6.3 数据字节通道

3.1.6.4 地址/控制信号

3.1.6.5 RDIMMs和UDIMMs

3.1.6.6 VRP 引脚

3.1.6.7 时钟引脚

3.1.6.8 reset_n 引脚

3.1.6.9 Bank 共享

3.1.6.10 Column要求

3.1.6.11 SLR 要求

3.1.6.12 接口上限

3.1.6.13 不允许跳过 Bank

3.1.6.14 GCIO 引脚

3.1.6.15 VREF 引脚

3.1.6.16 相同类型 Bank

3.1.6.17 PAR 引脚

3.1.6.18 sys_rst_n 引脚

3.1.7 引脚分配示例

3.2 《UG575》Pinouts

3.2.1 FFVB676 Bank Diagram

3.2.2 Multi−Function I/O Pins

3.2.3 Pinout Files

3.3 布线准则

3.3.1 Fly-by(飞跃式)

3.3.2 Clamshell(贝壳式)

4. 总结

5. 参考资料


1. 简介

1.1 FPGA-MIG 与 DDR4 介绍

DDR4

DDR 的全称是 DDR SDRAM(Double Data Rate Synchronous Dynamic Random Access Memory),即双倍数据传输率的同步动态随机存取存储器

  • DDR - 即双倍的意思。DDR 内存采用了双倍数据传输率的技术,即在每个时钟周期内可以传输两次数据,相比于传统的 SDRAM,DDR 内存的数据传输速度是提升了一倍的。
  • Synchronous - 表示内存与系统时钟同步工作,数据传输在时钟的控制下进行。
  • Dynamic - 表示内存是动态随机存取存储器,需要定期刷新以保持数据的存储状态。与之相对的是静态存储器(SRAM),SRAM 速度更快、功耗更高,但相对稳定且不需要定期刷新。
  • RAM - 随机存取存储器,其对立面是 Sequential Access Memory(顺序存取存储器),包括:磁带、光盘、磁盘。

FPGA-MIG

Memory Controller - 控制器接受来自用户接口的突发事务,并生成与 SDRAM 之间的事务。控制器负责处理 SDRAM 的时序参数和刷新。它合并写入和读取事务,以减少在转换总线时涉及的死周期数量。控制器还重新排序命令,以改善数据总线到SDRAM的利用率。

Physical Layer - 物理层为 SDRAM 提供高速接口。该层包括 FPGA 内的硬块和软件块校准逻辑,以确保硬块与 SDRAM 接口的时序最佳。

Application Interface - 用户接口层为应用程序提供类似 FIFO 的简单接口。数据被缓冲,读取的数据按照请求顺序呈现。

1.2 DDR4 信号介绍

1.2.1 Clock Signals

ck_t, ck_c - 差分时钟

1.2.2 Address and Command Signals

a[17,13:0] - 地址输入

ras_n/a[16] - 行地址选通,地址位 16

cas_n/a[15] - 列地址选通,地址位 15

we_n/a[14] - 写入使能,地址位 14

bg[1:0] - Bank 组输入

ba[1:0] - Bank 地址输入

act_n - Activation command input(激活命令输入)

par - Command and address parity input(命令和地址奇偶校验输入)

1.2.3 Control Signals

cke - 时钟使能

cs_n[3:0] - 芯片选择

odt - On-die termination enable

reset_n

1.2.4 Data Signals

dq[79:0] - 数据输入/输出

dqs_t/dqs_c[9:0] - Data strobe (differential),数据选通 (差分)

dm_n/dbi_n - Data mask and data bus inversion(数据掩码和数据总线反转)

1.2.5 Other Signals

TEN - Test connectivity mode. CMOS level. Connect 500Ω resistor to ground at memory devices。测试连接模式。 CMOS 级别。将 500Ω 电阻连接到位于存储器器件处的接地。

alert_n

VRP (PL) - 240Ω to GND

ZQ (PS) - 240Ω to GND

2. 通用存储器布线准则

1. 判定信号走线长度时,请在布线约束内包含封装延迟。如可设置封装延迟的最小值和最大值,请使用最小值与最大值之间的中段值。

2. 总线内的最短信号和最长信号必须在列示的规范范围内。

3. 总线中最长地址信号与最短地址之间的延迟之差不得超过 2ps。

4. DDR4 组件接口的 CK 到 DQS 规范范围很大。目的是为了确保在所有存储器器件上从器件链的首个器件到最后一个器件间实现适当的写平衡。

5. 对于飞越式布线,可将地址信号、命令信号和控制信号布线于不同层级上,但建议尽可能少用此方法。请勿将任一信号布线在 2 个以上层级上,这样可最大限度减少可能导致串扰问题的感应环路。任何跨信号层的过孔都需在50 mil 周边范围存储器在 1 个接地过孔。

3. Xilinx FPGA-MIG 的 PCB 准则

3.1 引脚配置

3.1.1 Bank/Byte Planner

如果设计中存在 UltraScale 架构的 Memory IP,则包含启动内存 Bank/Byte 规划工具。

Memory Bank/Byte Planner 

3.1.2 Signal Group

点击 Show Signal Group 按钮,以在 Signal Groups 对话框中显示每个 Memory IP 的信号组列表。

Signal Group 显示当前配置的 DDR 所有的信号线。

3.1.3 自动分配信号组

 

3.1.4 DRC 检查

在分配或修改管脚分配后,必须运行 DRC 检查。

运行 DRC 是管脚规划中最关键的步骤之一。DRC 会根据一套特定的设计规则检查(称为规则集)来检查当前设计,并报告任何错误或违规情况。

在 I/O Planning 期间,Vivado 执行基本检查以确保合法的引脚布局。然而,完整的签名 DRC 只在Vivado 实施期间运行。因此,需要通过 Vivado 实施来确保最终合法的引脚布局。

交互式 I/O Placement Routines,在引脚放置期间检查常见的错误情况。可以在 General tab of the Package window 的常规标签中使用 Autocheck I/O Placement 复选框来开启或关闭此功能。

当启用自动检查时,该工具不允许在会引起设计问题的引脚上放置 I/O 端口。在 Place I/O Ports Sequentially 模式下,如果尝试在有问题的引脚上放置一个I/O端口,会出现一个工具提示,描述为什么 I/O 端口不能被放置。

默认情况下,交互式DRC是启用的。

3.1.5 Vivado 编译检查

通过 Vivado 生成 Bitstream 可最终判定引脚分配是否合规。

如下图,所有接口均已分配完毕:

运行 Generate Bitstream,如果没有报错,则引脚分配合规。

另一个方法,在 Reports 中,打开 implementation_log 可以打开详细报告。

忽略警告:

在 Planar 中, 如果出现感叹号,可以鼠标悬停查看详情,如下:

这个警告通常表示在 DDR4 引脚约束中,有些引脚被分配给了非内存信号。

在FPGA设计中,非内存信号是指那些不属于内存接口的信号。例如,在DDR4内存接口中,信号如ddr4_alert_n、ddr4_reset_n等,虽然与内存模块相关,但它们不直接参与数据的读写操作,因此被称为非内存信号。

3.1.6 引脚交换

字节组,包含数据字节组地址/控制字节组

  • 字节组内可自由交换:
    • 数据字节组、地址/控制字节组内的引脚可以自由交换。即,同一字节组内的任何引脚可以相互交换位置,但有一个例外:DQS 必须位于其所在 nibble 的专用 DQS 上。

  • 字节组间交换:
    • 数据字节组、地址/控制字节组之间可以交换。
  • 地址/控制字节组的交换:
    • 地址/控制字节组内的引脚不仅可以在自己的组内自由交换,还可以与其他地址/控制字节组之间交换。
  • 除了上述允许的交换之外,不允许进行其他任何形式的 pin swapping。
3.1.6.1 DQS/DQ/DM 位置

1). 使用x8或x16组件的设计 - dqs必须位于以“U”(N6和N7)指定的上部nibble中的专用字节时钟对上。 与dqs相关的dq必须位于除N1和N12引脚之外的任何其他引脚上的相同字节通道上。

2). 使用x4组件的设计 - dqs必须位于nibble中的专用dqs对上(在下部nibble中的N0和N1,在上部nibble中的N6和N7)。 与dqs相关的dq必须位于除引脚N12(上部nibble)之外的任何其他引脚上的相同nibble中。

3). 如果使用dm,必须将其放置在与相应dqs对应的字节通道的引脚N0上。 当dm被禁用时,引脚N0可以用于dq,但不能用于地址/控制信号。 当不使用dm时,引脚N0不能用于地址/控制(除了reset#引脚)。注意:x4设备不支持dm。

4). 如果未使用dm,则必须在PCB上将其拉低。 用于这一目的的典型值等于DQ线传输阻抗,例如40或50Ω。 请咨询内存供应商以获得他们的具体建议。 如果未适当拉低,则可能导致不可预测的故障。

3.1.6.2 成对使用x4组件

x4组件必须成对使用。 不允许使用奇数个x4组件。 数据字节的上半字节和下半字节都必须由一个x4 dq/dqs组占用。

3.1.6.3 数据字节通道

带有dqs的字节通道被视为数据字节通道(Data Byte Lanes)。 引脚N1和N12可以在数据字节通道中用于地址/控制。 如果数据字节位于与其余地址/控制引脚相同的存储器bank中,请参阅3.1.5.4。

3.1.6.4 地址/控制信号

地址/控制信号可以位于地址/控制字节通道中的任何13个引脚中。 地址/控制信号必须包含在同一个存储器bank中。

3.1.6.5 RDIMMs和UDIMMs

对于RDIMMs和UDIMMs的双插槽配置:cs、odt、cke和ck端口宽度加倍。 有关信号的确切映射,请参阅DIMM配置。

3.1.6.6 VRP 引脚
  • 每个I/O bank需要一个VRP引脚:每个I/O bank都需要一个VRP引脚,并且DCI(数字校准接口)是接口所必需的。
  • 输入和输出bank都需要VRP引脚:不仅包含输入的I/O bank需要VRP引脚,只有输出的I/O bank也需要VRP引脚。这是因为地址/控制信号使用SSTL15_DCI/SSTL135_DCI标准,以实现受控输出阻抗。
  • 允许DCI级联:当选择DCI级联时,VRP引脚可以作为普通I/O使用。
  • 遵循UG571中的DCI规则:必须遵循UltraScale™架构SelectIO™资源用户指南(UG571)中的所有DCI规则。
3.1.6.7 时钟引脚

时钟(ck)对必须位于地址/控制字节通道中的任何PN对中。

3.1.6.8 reset_n 引脚

reset_n 可以位于任何引脚,只要满足一般互连时序要求,并且 I/O 标准必须是SSTL15。 重置DRAM 应该被拉低,以便在上电期间保持低电平。 当dm被禁用时,重置引脚可以分配给数据字节通道的第N0引脚或该字节通道的任何其他空闲引脚,只要不违反其他规则。

3.1.6.9 Bank 共享

Bank 可以在两个控制器之间共享。

1). 每个字节通道专用于特定的控制器(除了reset_n)。

2). 来自一个控制器的字节通道不能放置在另一个控制器内。 例如,对于控制器A和B,“AABB”是允许的,而“ABAB”是不允许的。

3.1.6.10 Column要求

内存接口使用的所有I/O bank必须位于同一列(column)中。

3.1.6.11 SLR 要求

内存接口使用的所有I/O bank必须位于SSI技术设备的同一列的同一SLR中。

SLR(Super Logic Region):是 SSI 技术设备中的一个逻辑区域。每个SLR可以看作是一个独立的小规模FPGA。多个SLR通过一个被动的硅中介层(Interposer)连接在一起。
SSI(Stacked Silicon Interconnect):堆叠硅互连技术,它允许将多个SLR组件安装在一个被动的硅中介层上。相比传统设备,SSI技术使得Xilinx能够构建更大规模的FPGA设备。

所有用于内存接口的I/O bank必须位于同一列的同一个SLR中。这是为了确保信号传输的效率和一致性。

3.1.6.12 接口上限

接口的最大高度为五个连续的bank。 支持的最大接口宽度为80位。 组件的最大限制为九个,此限制仅适用于组件,而不适用于DIMMs。

3.1.6.13 不允许跳过 Bank
  • 不能跳过bank连接:例如,如果你有bank 64、65、66、67,你不能跳过bank 65直接连接bank 64和bank 66。
  • 连续连接:所有需要连接的I/O bank必须是连续的,没有中间空缺的bank。

这个规则确保了信号传输的完整性,避免了由于跳过bank而可能引起的信号完整性问题。

3.1.6.14 GCIO 引脚

接口中 MMCM 的输入时钟必须来自用于内存接口的 I/O column 中的 GCIO pair。 

3.1.6.15 VREF 引脚

有专用的 VREF 引脚, 可以使用内部或外部VREF。 如果不使用外部VREF,则必须通过UltraScale™ Architecture SelectIO™资源用户指南(UG571)中指定的电阻值将VREF引脚拉到地。 这些引脚必须根据使用的标准进行适当连接。

3.1.6.16 相同类型 Bank

接口必须包含在相同类型的 I/O bank(高范围或高性能)中。 不允许混合不同类型的 bank,除了第7步中提到的 reset_n 和第12步中提到的输入时钟之外。

3.1.6.17 PAR 引脚

对于DDR3 RDIMMs,par引脚是必需的。

3.1.6.18 sys_rst_n 引脚

如果字节用于内存 I/O,则系统复位引脚(sys_rst_n)不得分配给 N0 和 N6 引脚。

3.1.7 引脚分配示例

Byte Lane View of Bank on FPGA Die for x8 and x16 Support

I/O Type

Byte Lane

Pin Number

Signal Name

-

T0U

N12

-

N

T0U

N11

DQ[7:0]

P

T0U

N10

DQ[7:0]

N

T0U

N9

DQ[7:0]

P

T0U

N8

DQ[7:0]

DQSCC-N

T0U

N7

DQS0_N

DQSCC-P

T0U

N6

DQS0_P

N

T0L

N5

DQ[7:0]

P

T0L

N4

DQ[7:0]

N

T0L

N3

DQ[7:0]

P

T0L

N2

DQ[7:0]

DQSCC-N

T0L

N1

-

DQSCC-P

T0L

N0

DM0

3.2 《UG575》Pinouts

《UltraScale(+) FPGAs Packaging and Pinouts Product Specification UG (UG575)》

3.2.1 FFVB676 Bank Diagram

FFVB676 (XCKU3P and XCKU5P) 

3.2.2 Multi−Function I/O Pins

3.2.3 Pinout Files

UltraScale and UltraScale+ Package Device Pinout Filesicon-default.png?t=N7T8https://www.xilinx.com/support/package-pinout-files/ultrascale-pkgs.html

T - Tile,拼块,通常指的是一个逻辑单元的集合,这些单元在物理上相邻并且在功能上相关。

命名规则:

# 差分
IO_L[1-24][P/N]_T[0-3 ] [U/L]_N[0-12]_ [multi-function]_[bank number]

# 单端
IO_T[0-3 ][U/L]_N[0-12]_[multi-function]_[bank number]
  • 大多数用户 I/O 引脚都支持差分信号并且可以成对实现。 
  • IO表示用户I/O引脚。
  • L[1-24] 表示 I/O 引脚是差分对。没有L表示 I/O 引脚是单端的。
  • T[0-3][U/L] 表示为引脚分配的字节组和该组内的半字节位置(上部或下部)。
  • N[0-12] 其字节组内 I/O 的数量。
  • [multi-function] 表示该引脚可以提供的其他功能。
  • [bank number] 表示为用户 I/O 引脚分配的 Bank。

AD[0-15][P/N]

系统监视器差分辅助模拟输入0-15。

GC or HDGC

每个组中有四个全局时钟 (GC) 引脚对。 HDGC 引脚可以直接访问全局时钟缓冲区。 GC 引脚可以直接访问位于同一 I/O Bank 的时钟管理块 (CMT) 中的全局时钟缓冲器、MMCM 和 PLL。 GC 和 HDGC 输入提供对内部全局和区域时钟资源的专用高速访问。 GC 和 HDGC 输入使用专用路由,并且必须用于时钟输入,其中各种时钟功能的时序是必需的。 GC 或 HDGC 引脚在不用作输入时钟时可被视为用户 I/O。

DBC or QBC

字节通道时钟(DBC 和 QBC)输入引脚对是直接将源同步时钟驱动到 I/O Bank 中位片的时钟输入。在内存应用中,这些也称为 DQS。

PERSTN[0-1]

PCI Express 集成块的默认复位引脚位置。

3.3 布线准则

3.3.1 Fly-by(飞跃式)

飞越式拓扑是将所有存储器器件都包含在单一层级内,通常采用直插方式,布线更便于且提供最佳信号完整性,但可能占用较多开发板空间。

 

3.3.2 Clamshell(贝壳式)

贝壳拓扑具有开发板占用空间更小等优势,但存储器器件封装管脚位置不对称可能导致布线拥挤,增加串扰风险,因为接地回路过孔少且走线更长。 

4. 总结

本文档提供了关于FPGA-MIG和DDR4内存的详细介绍,包括其工作原理、关键信号、以及与之相关的PCB设计准则。DDR4作为目前广泛使用的内存技术,其特点包括高速数据传输和同步工作机制,而FPGA-MIG则为这些内存提供了高效的控制和接口,确保数据传输的稳定性和高效性。文档还详细讨论了DDR4的信号类型,包括时钟信号、地址和命令信号以及数据信号等,这对于理解DDR4的工作机制至关重要。在PCB设计方面,本文档提供了关于如何布线和引脚分配的准则,旨在帮助设计师优化内存与FPGA之间的连接,以及提高整体系统的性能和可靠性。通过遵循这些准则,可以在设计高性能电子系统时,确保内存接口的稳定性和效率。

5. 参考资料

1. UG583 - 《UltraScale 架构 PCB 设计》

UltraScale Architecture PCB Design User Guide (UG583)icon-default.png?t=N7T8https://docs.amd.com/r/en-US/ug583-ultrascale-pcb-design/UltraScale-Architecture-PCB-Design-User-Guide

2. PG150 - 《基于UltraScale架构的FPGA存储IP产品指南》

UltraScale Architecture-Based FPGAs Memory IP Product Guide (PG150)icon-default.png?t=N7T8https://docs.amd.com/v/u/en-US/pg150-ultrascale-memory-ip3.  UG899 -《I/O 和时钟规划》

Vivado Design Suite User Guide: I/O and Clock Planning (UG899)icon-default.png?t=N7T8https://docs.amd.com/r/en-US/ug899-vivado-io-clock-planning/Introduction4. UG575 - 《Packaging and Pinouts》

Us(+) FPGAs Packaging and Pinouts Product Specification UG (UG575)icon-default.png?t=N7T8https://0x04.net/~mwk/xidocs/ug/ug575-ultrascale-pkg-pinout.pdf5. UG571 - 《UltraScale Architecture SelectIO Resources》

UltraScale Architecture SelectIO Resources User Guide (UG571)icon-default.png?t=N7T8https://docs.amd.com/r/en-US/ug571-ultrascale-selectio/I/O-Tile-Overview

 

抱歉,我并不能直接提供代码。但是我可以给你一些Verilog代码的模板,帮助你开始编写PCIE接口FPGA通信的Verilog代码。 首先,你需要一个PCIe IP核,它将实现与PCIE接口的通信。你可以从Xilinx或Altera等FPGA供应商处获取此核心。 然后,你需要编写一个顶层模块,将PCIe IP核与你的FPGA逻辑连接起来。以下是一个基本的顶层模块,其中包括PCIe IP核的实例化和与其他模块的连接: ```verilog module pcie_top( //输入时钟信号 input wire clk, //输入复位信号 input wire rst_n, //输入PCIE信号 input wire pcie_perstn, input wire [3:0] pcie_refclk_n, input wire [3:0] pcie_refclk_p, input wire [3:0] pcie_rx_n, input wire [3:0] pcie_rx_p, //输出PCIE信号 output wire pcie_msi, output wire [1:0] pcie_tx_neg, output wire [1:0] pcie_tx_pos, output wire [3:0] pcie_tx_clk, output wire [3:0] pcie_tx_data, output wire [3:0] pcie_tx_valid, output wire [3:0] pcie_tx_ready, output wire [3:0] pcie_rx_clk, output wire [3:0] pcie_rx_data, output wire [3:0] pcie_rx_valid, output wire [3:0] pcie_rx_ready, //其他模块的端口 ... ); //实例化PCIe IP核 pcie_inst pcie_core( .clk(clk), .rst_n(rst_n), .pcie_perstn(pcie_perstn), .pcie_refclk_n(pcie_refclk_n), .pcie_refclk_p(pcie_refclk_p), .pcie_rx_n(pcie_rx_n), .pcie_rx_p(pcie_rx_p), .pcie_msi(pcie_msi), .pcie_tx_neg(pcie_tx_neg), .pcie_tx_pos(pcie_tx_pos), .pcie_tx_clk(pcie_tx_clk), .pcie_tx_data(pcie_tx_data), .pcie_tx_valid(pcie_tx_valid), .pcie_tx_ready(pcie_tx_ready), .pcie_rx_clk(pcie_rx_clk), .pcie_rx_data(pcie_rx_data), .pcie_rx_valid(pcie_rx_valid), .pcie_rx_ready(pcie_rx_ready) ); //连接其他模块 ... endmodule ``` 请注意,这只是一个示例模板。你需要根据你的特定的PCIe IP核和FPGA逻辑进行修改。 希望这个模板可以帮助你开始编写PCIE接口FPGA通信的Verilog代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值