当前位置:   article > 正文

XILINX Ultrascale+ FPGA学习(2)——I/O接口组件原语和原生原语_bitslice

bitslice

bank介绍

每个 I/O bank 包含 52 个管脚,可采用适合该 bank 的单端标准进行输入、输出或双向操作。 I/O bank 可以是高量程(HR) 或高性能 (HP) I/O bank。这些管脚中最多有 48 个可以配置为 24 个差分信号管脚对,其信号标准适用于 HR I/Obank 或 HP I/O bank。与每个单端管脚关联的逻辑称为位 slice,对于 _P 管脚,差分管脚对称为主位slice,对于 _N 管脚,称为从位 slice。
输入/输出控制块位 slice 可以使用赛灵思器件前几代中的组件原语进行编程,也可以在需要最大性能的情况下使用原生端口物理层(PHY)原语进行配置。下图时一个bank的结构:
在这里插入图片描述
每个 bank 被细分为 4 个字节组,每个组包含 13 个 I/O 管脚,每个字节组被进一步细分为 2 个半字节组。如下图所示,三态控制位 slice 块以及高半字节控制块和低半字节控制块仅在使用原生模式时才有效。有两个可用的 PLL 与同一 I/O bank 中的位 slice 相关联。每个 PLL 都具有与位 slice 的控制器的专用高速时钟连接,此外还有两个额外输出,可用作为置于 I/O bank 覆盖的时钟区域中的逻辑的应用时钟。混合模式时钟管理器 (MMCM) 可用作 I/O bank 中的位 slice 控制器和置于 I/O bank 所覆盖的时钟区域中的逻辑的时钟源,但是 MMCM 也可以作为整个FPGA 中 I/O bank 和逻辑的时钟源。

对于需要高性能和低抖动的应用,可以使用布局在 I/O bank 后面时钟区域中的 PLL。MMCM 可用于需要在多个I/O bank 和时钟区域中进行时控的较慢应用。

在原生模式下, PLL 的高速时钟输出通过专用布线 (无时钟缓存)连接到 BITSLICE_CONTROL.PLL_CLK 输入。因此,应始终将 PLL 放置在连接接口 I/O bank 的时钟区域中。使用 XDC 约束时,可以将输入时钟缓存布局在不同的I/O bank 中。

当使用 MMCM 对原生模式或组件模式接口进行时控时,必须使用时钟缓存。尽管最好的解决方案是将 MMCM 布局在已构造的 I/O 接口附近,但也可将 MMCM 布局到除所使用的 I/O bank 相邻的时钟区域之外的其它时钟区域中。然后,通过时钟缓存和时钟布线来分配 I/O 接口的时钟。

组件原语

介绍一下组件原语。

IDDRE1

用于UltraScale中实现输入DDR寄存器的专用寄存器,可以使用IDDRE1来进行实例化。使用 IDDRE1 组件可以转换并实现为 ISERDESE3 组件。
其支持3种模式:
OPPOSITE_EDGE,
SAME_EDGE,
SAME_EDGE_PIPELINED
其原语原理图如下图所示:
在这里插入图片描述
其端口描述为:
在这里插入图片描述
其属性为:
在这里插入图片描述


// IDDRE1: Dedicated Double Data Rate (DDR) Input Register
//         UltraScale
// Xilinx HDL Language Template, version 2021.2

IDDRE1 #(
   .DDR_CLK_EDGE("OPPOSITE_EDGE"), // IDDRE1 mode (OPPOSITE_EDGE, SAME_EDGE, SAME_EDGE_PIPELINED)
   .IS_CB_INVERTED(1'b0),          // Optional inversion for CB
   .IS_C_INVERTED(1'b0)            // Optional inversion for C
)
IDDRE1_inst (
   .Q1(Q1), // 1-bit output: Registered parallel output 1
   .Q2(Q2), // 1-bit output: Registered parallel output 2
   .C(C),   // 1-bit input: High-speed clock
   .CB(CB), // 1-bit input: Inversion of High-speed clock C
   .D(D),   // 1-bit input: Serial Data Input
   .R(R)    // 1-bit input: Active-High Async Reset
);

// End of IDDRE1_inst instantiation
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

OPPOSITE_EDGE 模式

其输入DDR时序如下图所示:
在这里插入图片描述

SAME_EDGE 模式

其输入DDR时序如下图所示:
在这里插入图片描述

SAME_EDGE_PIPELINED 模式

其输入DDR时序如下图所示:
在这里插入图片描述

ODDRE1

用于UltraScale中实现输出DDR寄存器的专用寄存器,可以使用ODDRE1来进行实例化。使用 ODDRE1 时,自动执行 DDR 多路复用。无需手动控制多路复用器选择。此控制是从时钟生成的。
其原语原理图如下:
在这里插入图片描述
其端口如下:
在这里插入图片描述
其属性如下:
在这里插入图片描述

ODDRE1 原语仅支持 SAME_EDGE 操作模式。其时序为:
在这里插入图片描述

// ODDRE1: Dedicated Double Data Rate (DDR) Output Register
//         UltraScale
// Xilinx HDL Language Template, version 2021.2

ODDRE1 #(
   .IS_C_INVERTED(1'b0),           // Optional inversion for C
   .IS_D1_INVERTED(1'b0),          // Unsupported, do not use
   .IS_D2_INVERTED(1'b0),          // Unsupported, do not use
   .SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version for simulation functionality (ULTRASCALE,
                                   // ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
   .SRVAL(1'b0)                    // Initializes the ODDRE1 Flip-Flops to the specified value (1'b0, 1'b1)
)
ODDRE1_inst (
   .Q(Q),   // 1-bit output: Data output to IOB
   .C(C),   // 1-bit input: High-speed clock input
   .D1(D1), // 1-bit input: Parallel data input 1
   .D2(D2), // 1-bit input: Parallel data input 2
   .SR(SR)  // 1-bit input: Active-High Async Reset
);

// End of ODDRE1_inst instantiation
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

ISERDESE3

ISERDESE3原语用于高速的串并转换,其原语结构:
在这里插入图片描述
其与之前的原语比较(ISERDESE2),它
没有BITSLIP 输入,无法进行同步的比特滑动操作;
没有可选的CE 输入;
没有OFB输入,串行输出和输入之间时无法直接连接的;
没有SHIFTIN和 SHIFTOUT 管脚,无法使用这些针脚将解串扩展到14位。
ISERDESE3可在单倍数据速率(SDR)中将传入信号按2或4位来进行解穿,或在双倍数据速率(DDR)中按4或8位解串。如下图所示:
在这里插入图片描述
注意在任意字节中Q0都是第一位。
原语端口如下:
在这里插入图片描述
属性如下:
在这里插入图片描述
ISERDESE3 还包含一个较浅的八元素 FIFO,可供选择用于时钟域传输。如不使用这些FIFO 控制信号,则应将其应连接到 GND。使用 FIFO 时,应由 FIFO_EMPTY 反相信号驱动 FIFO_RD_EN,以避免FIFO_write 和 FIFO_read 指针每 8 个时钟周期发生重叠。当DATA_WIDTH=8时,原语的时序框图如下所示:
DATA_WIDTH=8
当DATA_WIDTH=4时,原语的时序框图如下所示:
在这里插入图片描述
原语的实例化Verilog代码如下:


// ISERDESE3: Input SERial/DESerializer
//            UltraScale
// Xilinx HDL Language Template, version 2021.2

ISERDESE3 #(
   .DATA_WIDTH(8),                 // Parallel data width (4,8)
   .FIFO_ENABLE("FALSE"),          // Enables the use of the FIFO
   .FIFO_SYNC_MODE("FALSE"),       // Always set to FALSE. TRUE is reserved for later use.
   .IS_CLK_B_INVERTED(1'b0),       // Optional inversion for CLK_B
   .IS_CLK_INVERTED(1'b0),         // Optional inversion for CLK
   .IS_RST_INVERTED(1'b0),         // Optional inversion for RST
   .SIM_DEVICE("ULTRASCALE_PLUS")  // Set the device version for simulation functionality (ULTRASCALE,
                                   // ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
)
ISERDESE3_inst (
   .FIFO_EMPTY(FIFO_EMPTY),           // 1-bit output: FIFO empty flag
   .INTERNAL_DIVCLK(INTERNAL_DIVCLK), // 1-bit output: Internally divided down clock used when FIFO is
                                      // disabled (do not connect)

   .Q(Q),                             // 8-bit registered output
   .CLK(CLK),                         // 1-bit input: High-speed clock
   .CLKDIV(CLKDIV),                   // 1-bit input: Divided Clock
   .CLK_B(CLK_B),                     // 1-bit input: Inversion of High-speed clock CLK
   .D(D),                             // 1-bit input: Serial Data Input
   .FIFO_RD_CLK(FIFO_RD_CLK),         // 1-bit input: FIFO read clock
   .FIFO_RD_EN(FIFO_RD_EN),           // 1-bit input: Enables reading the FIFO when asserted
   .RST(RST)                          // 1-bit input: Asynchronous Reset
);

// End of ISERDESE3_inst instantiation
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

也可以通过IP 核的方式使用该原语。

OSERDESE3

OSERDESE3 是一个4或8位并串转换器,其原语图如下:
在这里插入图片描述
其与之前的版本(OSERDESE2)的差异:
没有OCE 输入使能管脚;
没有SHIFTIN 和 SHIFTOUT 管脚;
没有OFB 输出;
没有并联三态和串联 TBYTE 功能。
其端口如下:
在这里插入图片描述
其属性如下:
在这里插入图片描述

OSERDESE3可在单倍数据速率(SDR)中按2或4位将信号串行化,或在双倍数据速率(DDR)中按4或8位串行化。如下所示:
在这里插入图片描述
搭配SDR 时控一起使用时, DATA_WIDTH 属性应设置为所需宽度的两倍,并且要传输的数据应同时应用于 2 个管脚。
在这里插入图片描述

其时延如下图所示:
在这里插入图片描述

// OSERDESE3: Output SERial/DESerializer
//            UltraScale
// Xilinx HDL Language Template, version 2021.2

OSERDESE3 #(
   .DATA_WIDTH(8),                 // Parallel Data Width (4-8)
   .INIT(1'b0),                    // Initialization value of the OSERDES flip-flops
   .IS_CLKDIV_INVERTED(1'b0),      // Optional inversion for CLKDIV
   .IS_CLK_INVERTED(1'b0),         // Optional inversion for CLK
   .IS_RST_INVERTED(1'b0),         // Optional inversion for RST
   .SIM_DEVICE("ULTRASCALE_PLUS")  // Set the device version for simulation functionality (ULTRASCALE,
                                   // ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
)
OSERDESE3_inst (
   .OQ(OQ),         // 1-bit output: Serial Output Data
   .T_OUT(T_OUT),   // 1-bit output: 3-state control output to IOB
   .CLK(CLK),       // 1-bit input: High-speed clock
   .CLKDIV(CLKDIV), // 1-bit input: Divided Clock
   .D(D),           // 8-bit input: Parallel Data Input
   .RST(RST),       // 1-bit input: Asynchronous Reset
   .T(T)            // 1-bit input: Tristate input from fabric
);

// End of OSERDESE3_inst instantiation
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

也可以通过IP 核的方式使用该原语。

IDELAYE3

可以使用 IDELAYE3 原语延迟除时钟以外的任何输入信号,延迟后将其转发到器件逻辑或者使用输入/输出互联(IOI) 内部的单数据速率 (SDR) 时钟或双倍数据速率 (DDR) 时钟将其寄存到简单的触发器、IDDDR 或 ISERDESE3 中。不应使用 IDELAYE3 来延迟时钟,因为 IDELAY 无法直接布线到全局时钟缓存。如必须延迟时钟,请使用 MMCM 或 PLL生成时钟,并使用精细相移功能来延迟时钟。UltraScale+ 器件为 1.10 ns,其他器件为 1.25 ns。
其原语图如下:
在这里插入图片描述
IDELAYE3 原语包含有 512 抽头延迟线。每个单独的抽头都未经校准。但在 IDELAYCTRL 组件中提供了用于校准延迟线的逻辑。 IDELAYE3 可以在 COUNT 和 TIME 两种模式下使用。
COUNT 模式:

  • 无需使用 IDELAYCTRL 组件,因为延迟线在未经校准的状态下使用,没有电压和温度补偿;
  • 延迟线仅限用于对抽头进行计数,而不用于对延迟/抽头进行计数—— DELAY_VALUE 以抽头数量来表示 (0 到 511)。
  • 扫描串行数据流中的转换数必须以抽头数来表示,并且不能转换为以皮秒 (ps) 为单位的时间。

TIME 模式:

  • 必须使用 IDELAYCTRL 组件;
  • 延迟线按请求的时间值进行校准,电压/温度补偿可确保该值不随时间而变;
  • 对于半字节内的所有延迟,REFCLK_FREQUENCY 必须与 IDELAYCTRL
    的时钟频率匹配,以确保延迟正确对齐。与原生模式混合使用时, BITSLICE_CONTROL 的 REFCLK 频率应与
    REFCLK_FREQUENCY 匹配。DELAY_VALUE 以 ps 表示。

其端口如下:
在这里插入图片描述
在这里插入图片描述

其属性如下:
在这里插入图片描述
在这里插入图片描述

DELAY_SRC 属性

根据要延迟的输入的来源设置 DELAY_SRC 。当输入来自 IOB 时,应将其设置为 IDATAIN。当输入来自互联逻辑时,应将其设置为 DATAIN。启用 IDELAYE3 时,会增加 1 个插入延迟,因为信号必须通过多路复用器。与该多路复用器相关的延迟即插入延迟。如果将 IDELAYE3 与DELAY_VALUE = 0 一起使用,则数据仍然会产生插入延迟,以通过延迟元素传输。 Vivado Design Suite 时序分析中将考虑此延迟。下图是该属性的原理图
在这里插入图片描述

CASCADE 属性

如果延迟线未级联,则 CASCADE 属性设置为 NONE。当所需延迟大于 1.25 ns(对于 UltraScale+ 器件为 1.10 ns)时,将使用级联。当使用 IDELAYE3 (或 ODELAYE3)进行级联时,延迟 (和 IOB)不再适用于设计。延迟元素可以按向下方向级联到字节边界。因此,延迟的最大可能长度取决于 I/O 在字节中的布局位置。
用于级联 IDELAYE3 和 ODELAYE3 的布线是专用高速布线。 IDELAYE3 或 ODELAYE3 级联的固定内部插入延迟总量是初始插入延迟与级联插入延迟的总和。此延迟按 IDELAYE3 和 ODELAYE3 级联次数而成倍增加。但是,延迟始终是固定值。
下图是延迟元件之间的连接:
在这里插入图片描述
如果在 DELAY_FORMAT = TIME 的情况下通过级联所得延迟大于 1.25 ns(UltraScale 器件)或 1.10 ns(UltraScale+ 器件),则同一 site 内的延迟必须相同。例如,把 1.5 ns 的延迟分割为 0.75 ns 的 IDELAYE3 和 0.75 ns 的 ODELAYE3。如果在 VAR_LOAD 模式下使用 IDELAYE3 和 ODELAYE3 进行级联,则将分别为这 2 个组件输入值。

DELAY_FORMAT 属性

用于设置 COUNT 和 TIME 两种延迟模式。
如果 DELAY_FORMAT 设置为 TIME,则由 IDELAYCTRL 组件针对电压和温度对延迟线进行校准、控制和维护。
如果 DELAY_FORMAT 设置为 TIME,则由 IDELAYCTRL 组件针对电压和温度对延迟线进行校准、控制和维护。

  • 必须使用 IDELAYCTRL 组件。
  • REFCLK_FREQUENCY 属性必须反映应用于 IDELAYCTRL 组件的时钟频率。
  • 当在 VARIABLE 或 VAR_LOAD 模式下使用延迟线时,必须主动操作 EN_VTC 管脚。使用固定 (FIXED)模式时,将EN_VTC 管脚连接到高电平。

在这里插入图片描述
当 DELAY_FORMAT 设置为 COUNT 时,不对延迟线进行校准,并且在电压和温度发生变化时延迟线不会保持不变。

  • 因此,请勿使用IDELAYCTRL 组件。
  • 将 REFCLK_FREQUENCY 属性保留为默认值 (300 MHz)。
  • 将 EN_VTC 输入管脚连接到低电平。
    • 该管脚可确保禁用 IDELAYE3 中的校准和 VT 维护逻辑。
  • 延迟线必须用于表示抽头数量。
    • 抽头延迟多长时间无关紧要,重要的是抽头的数量。
    • 共有 512 个抽头可用。
  • CNTVALUEIN/OUT[8:0] 的值表示延迟线设置为或调整到的抽头数量。

DELAY_VALUE 属性

当 DELAY_FORMAT 属性设置为 TIME 模式时, DELAY_VALUE 属性表示的单位是 ps。除 DELAY_VALUE 属性外,IDELAYE3 还具有时钟/数据对齐延迟。通过 IDELAYE3 的延迟总量为对齐延迟加上 DELAY_VALUE。

尽管在 TIME 模式下,DELAY_VALUE 仍表示以 ps 为单位的时间值,但 CNTVALUEIN[8:0] 和/或 CNTVALUEOU[8:0] 在延迟线上读取或写入的值以抽头数表示。因此,更改延迟线的时间需要进行一些计算。

当 DELAY_FORMAT 属性设置为 COUNT 模式时,DELAY_VALUE 属性表示抽头数量。由于在 COUNT 模式下没有校准或补偿,因此时钟/数据没有 Align_Delay。此时通过 IDELAYE3 的总数等于抽头数。

==PS:==在 COUNT 模式下使用延迟线时, EN_VTC 管脚必须断言无效 (低电平)。在 TIME 模式下使用延迟线时,当IDELAYCTRL.RDY 为低电平时, EN_VTC 管脚必须断言有效 (高电平)。RDY 变为高电平后,可以选择将其断言无效。

UPDATE_MODE 属性

如果 UPDATE_MODE 属性设置为 ASYNC,则递增或递减在 IDELAY3.CLK 时钟上执行的延迟值,且与接收到的数据无关。

如果 UPDATE_MODE 属性设置为 SYNC,则递增或递减 CLK 时钟和 DATAIN (或 IDATAIN)转换所需的延迟值,以与DATAIN 沿同步更新延迟。此模式适用于始终定期切换的时钟或数据。

如果设置为 MANUAL,则需要 2 次 LOAD 断言有效才能使新值生效。第一次 LOAD 将 CNTVALUEIN 定义的值加载到延迟线选择寄存器中,第二次 LOAD 必须与 CE 一起断言有效,以使新值生效。这对于需要使用延迟线更新一定数量的数据通道的设计是有益的,因为当数据变为 IDLE 时可以更新所有延迟线。

  • 首选方法是 ASYNC 模式,因为延迟线仅在延迟线的 CLK 时钟上更新,而无需考虑其它信号或事件。

DELAY_TYPE 属性

FIXED 模式

设置为 FIXED 的 DELAY_TYPE 属性选择通过 IDELAYE3 原语的延迟,并由 DELAY_VALUE 和 DELAY_FORMAT 属性来判定。当 DELAY_FORMAT 设置为 TIME 时,延迟线中加载的值以 ps 为单位。当 DELAY_FORMAT 设置为 COUNT 时,延迟线中加载的延迟值为抽头数。

  1. 当 DELAY_FORMAT 为 TIME 时,必须将
    EN_VTC拉至高电平,以便延迟随着电压和温度的变化自动更改抽头数量,以确保延迟按请求的时间 (以 ps 为单位)保持不变。
  2. 将 DELAY_FORMAT 设置为 COUNT 时, EN_VTC 必须为低电平。在 COUNT 模式下,延迟不针对电压和温度进行补偿。
VARIABLE 模式

将 DELAY_TYPE 属性设置为 VARIABLE 即可选择可变抽头延迟线。
在这里插入图片描述
在 VARIABLE 模式下,可使用 CE 和 INC管脚按抽头手动递增或递减延迟线抽头 (INC/DEC 每次递增或递减 1 个抽头)。通过设置 CE = 1 和 INC = 1 可递增抽头延迟,或者通过设置 CE = 1 和 INC = 0 可递减抽头延迟。递增/递减操作取决于 UPDATE_MODE 属性。在延迟更改命令执行期间, EN_VTC 管脚应保持低电平,以确保停止任何自动调整。
在这里插入图片描述
要在使用 TIME 模式时递增/递减延迟线,请使用以下步骤:

  1. 断言 EN_VTC 管脚无效 (低电平)
  2. 等待至少 10 个时钟周期。
  3. 使用 CE 和 INC 端口来递增或递减延迟线。
  4. 等待至少 5 个时钟周期。
  5. (用于多项更新的选项)需要执行延迟线的递增或递减操作。转至步骤 3,否则继续执行步骤 6。
  6. 等待至少 10 个时钟周期。
  7. 断言 EN_VTC 管脚有效。

在 COUNT 模式下, EN_VTC 端口始终为低电平。使用之前的 TIME 模式过程:步骤 2 至步骤 4。

VAR_LOAD 模式

当 DELAY_TYPE 属性设置为 VAR_LOAD 时,可以使用 CE 和 INC 输入或使用 CNTVALUEIN 和 LOAD 输入来更改延迟线。两种情况下都可以使用 CNTVALUEOUT 读取延迟线的当前位置。 CE 和 INC 输入根据抽头更改延迟线,而COUNTVALUEIN/OUT 总线允许动态更改延迟线。

VAR_LOAD 方法适用于在 COUNT 和 TIME 模式下使用延迟线。

在这两种模式下,抽头数量可从 CNTVALUEOUT 总线读取,并可按需通过 CNTVALUEIN 总线或 INC 端口进行更改。

使用 INC/CE 输入管脚递增或递减延迟线时,请使用 VARIABLE 模式的说明。对于 IDELAY 和 ODELAY,用于计算值以更新延迟线的 VAR_LOAD 过程不同。对于 TIME 和 COUNT 模式,用于更新延迟线的 VAR_LOAD 过程不同。

如果 DELAY_TYPE 为 VAR_LOAD 且 DELAY_FORMAT 为 TIME,则更新延迟线的过程如下 :

  1. 等待 IDELAYCTRL.RDY 变为高电平。
  2. 使 EN_VTC 变为低电平以修改延迟线。
  3. 等待至少 10 个时钟周期。
  4. 读取 CNTVALUEOUT[8:0] 并将该值加载到寄存器中。
  5. 检查是否需要更新延迟线。
  6. 计算要写入延迟线的新延迟值。
  7. 将新的延迟线值放在 CNTVALUEIN[8:0] 总线上。
  8. 等待 1 个时钟周期,通过脉冲将 LOAD 置于高电平并保持 1 个时钟周期。
  9. 用于多项更新的选项:等待 5 个时钟周期。
  10. 用于多项更新的选项:对 CNTVALUEIN 赋予新的值。
  11. 用于多项更新的选项:等待 1 个时钟周期,通过脉冲将 LOAD 置于高电平并保持 1 个时钟周期。
  12. 用于多项更新的选项:返回到步骤 9 以执行多项更新。
  13. 等待至少 10 个时钟周期。
  14. 将 EN_VTC 拉回高电平。
  15. 返回步骤 2 以进行新的延迟线更新。

如果 DELAY_TYPE 为 VAR_LOAD 且 DELAY_FORMAT 为 COUNT,则更新延迟线的过程如下:

  1. 对于 COUNT 模式, EN_VTC 保持低电平。
  2. 读取 CNTVALUEOUT[8:0] 并将该值加载到寄存器中。
  3. 检查是否需要更新延迟线。
  4. 计算要写入延迟线的新延迟值。
  5. 将新的延迟线值放在 CNTVALUEIN[8:0] 总线上。
  6. 等待 1 个时钟周期,通过脉冲将 LOAD 置于高电平并保持 1 个时钟周期。
  7. (用于多项更新的选项)等待 4 个时钟周期。
  8. (用于多项更新的选项)对 CNTVALUEIN 赋予新的值。
  9. (用于多项更新的选项)等待 1 个时钟周期,通过脉冲将 LOAD 置于高电平并保持 1 个时钟周期。
  10. (用于多项更新的选项)返回至步骤 7 以执行多项更新。

要计算将写入延迟线的新值,必须已知以下详细信息:

  • 延迟线有 512 个抽头,并且对于 UltraScale 器件至少为 1250 ps,对于 UltraScale+ 器件至少为 1100ps。
  • 单个抽头的延迟范围在 UltraScale 器件数据手册 中指定。
  • 在下载 FPGA 并运行 BISC 引擎之后,才会延迟线进行校准。因此,在 FPGA 中单个抽头的实际延迟是未知的。

在 TIME 模式下:
在这里插入图片描述
在 COUNT 模式下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


// IDELAYE3: Input Fixed or Variable Delay Element
//           UltraScale
// Xilinx HDL Language Template, version 2021.2

IDELAYE3 #(
   .CASCADE("NONE"),               // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
   .DELAY_FORMAT("TIME"),          // Units of the DELAY_VALUE (COUNT, TIME)
   .DELAY_SRC("IDATAIN"),          // Delay input (DATAIN, IDATAIN)
   .DELAY_TYPE("FIXED"),           // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
   .DELAY_VALUE(0),                // Input delay value setting
   .IS_CLK_INVERTED(1'b0),         // Optional inversion for CLK
   .IS_RST_INVERTED(1'b0),         // Optional inversion for RST
   .REFCLK_FREQUENCY(300.0),       // IDELAYCTRL clock input frequency in MHz (200.0-800.0)
   .SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version for simulation functionality (ULTRASCALE,
                                   // ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
   .UPDATE_MODE("ASYNC")           // Determines when updates to the delay will take effect (ASYNC, MANUAL,
                                   // SYNC)
)
IDELAYE3_inst (
   .CASC_OUT(CASC_OUT),       // 1-bit output: Cascade delay output to ODELAY input cascade
   .CNTVALUEOUT(CNTVALUEOUT), // 9-bit output: Counter value output
   .DATAOUT(DATAOUT),         // 1-bit output: Delayed data output
   .CASC_IN(CASC_IN),         // 1-bit input: Cascade delay input from slave ODELAY CASCADE_OUT
   .CASC_RETURN(CASC_RETURN), // 1-bit input: Cascade delay returning from slave ODELAY DATAOUT
   .CE(CE),                   // 1-bit input: Active-High enable increment/decrement input
   .CLK(CLK),                 // 1-bit input: Clock input
   .CNTVALUEIN(CNTVALUEIN),   // 9-bit input: Counter value input
   .DATAIN(DATAIN),           // 1-bit input: Data input from the logic
   .EN_VTC(EN_VTC),           // 1-bit input: Keep delay constant over VT
   .IDATAIN(IDATAIN),         // 1-bit input: Data input from the IOBUF
   .INC(INC),                 // 1-bit input: Increment / Decrement tap delay input
   .LOAD(LOAD),               // 1-bit input: Load DELAY_VALUE input
   .RST(RST)                  // 1-bit input: Asynchronous Reset to the DELAY_VALUE
);

// End of IDELAYE3_inst instantiation
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

ODELAYE3

其使用方式与IDELAYE3相似,详细请参考文档。其原语模块如下:
在这里插入图片描述
端口如下:
在这里插入图片描述
在这里插入图片描述
属性如下:
在这里插入图片描述
在这里插入图片描述

// ODELAYE3: Output Fixed or Variable Delay Element
//           UltraScale
// Xilinx HDL Language Template, version 2021.2

ODELAYE3 #(
   .CASCADE("NONE"),               // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
   .DELAY_FORMAT("TIME"),          // (COUNT, TIME)
   .DELAY_TYPE("FIXED"),           // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
   .DELAY_VALUE(0),                // Output delay tap setting
   .IS_CLK_INVERTED(1'b0),         // Optional inversion for CLK
   .IS_RST_INVERTED(1'b0),         // Optional inversion for RST
   .REFCLK_FREQUENCY(300.0),       // IDELAYCTRL clock input frequency in MHz (200.0-800.0).
   .SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version for simulation functionality (ULTRASCALE,
                                   // ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
   .UPDATE_MODE("ASYNC")           // Determines when updates to the delay will take effect (ASYNC, MANUAL,
                                   // SYNC)
)
ODELAYE3_inst (
   .CASC_OUT(CASC_OUT),       // 1-bit output: Cascade delay output to IDELAY input cascade
   .CNTVALUEOUT(CNTVALUEOUT), // 9-bit output: Counter value output
   .DATAOUT(DATAOUT),         // 1-bit output: Delayed data from ODATAIN input port
   .CASC_IN(CASC_IN),         // 1-bit input: Cascade delay input from slave IDELAY CASCADE_OUT
   .CASC_RETURN(CASC_RETURN), // 1-bit input: Cascade delay returning from slave IDELAY DATAOUT
   .CE(CE),                   // 1-bit input: Active-High enable increment/decrement input
   .CLK(CLK),                 // 1-bit input: Clock input
   .CNTVALUEIN(CNTVALUEIN),   // 9-bit input: Counter value input
   .EN_VTC(EN_VTC),           // 1-bit input: Keep delay constant over VT
   .INC(INC),                 // 1-bit input: Increment/Decrement tap delay input
   .LOAD(LOAD),               // 1-bit input: Load DELAY_VALUE input
   .ODATAIN(ODATAIN),         // 1-bit input: Data input
   .RST(RST)                  // 1-bit input: Asynchronous Reset to the DELAY_VALUE
);

// End of ODELAYE3_inst instantiation
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

IDELAYCTRL

如果例化了 IDELAYE3 (或 ODELAYE3)原语,则必须例化 IDELAYCTRL 模块,除非 DELAY_FORMAT 设置为 COUNT 或在原生模式设计中混用组件和原生模式。
IDELAYCTRL 模块在其区域内将在 TIME 模式下配置的各个延迟线连续校准到其设定值,以减少工艺、电压和温度 (PVT) 变化的影响。 IDELAYCTRL 模块使用系统提供的 REFCLK 校准 IDELAYE3 (和ODELAYE3)。该 REFCLK 的频率值将应用于具有属性 (REFCLK_FREQUENCY) 的各个 IDELAYE3 (和 ODELAYE3)原语。因此,半字节中的每个延迟元素都需要将此属性设置为相同的值。

其模块图如下所示:
在这里插入图片描述
其端口为:
在这里插入图片描述
其属性为:
在这里插入图片描述

// IDELAYCTRL: IDELAYE3/ODELAYE3 Tap Delay Value Control
//             UltraScale
// Xilinx HDL Language Template, version 2021.2

IDELAYCTRL #(
   .SIM_DEVICE("ULTRASCALE")  // Set the device version for simulation functionality (ULTRASCALE)
)
IDELAYCTRL_inst (
   .RDY(RDY),       // 1-bit output: Ready output
   .REFCLK(REFCLK), // 1-bit input: Reference clock input
   .RST(RST)        // 1-bit input: Active-High reset input. Asynchronous assert, synchronous deassert to
                    // REFCLK.

);

// End of IDELAYCTRL_inst instantiation
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

组件复位

若要正确操作组件模式原语,请遵循以下复位顺序:
在这里插入图片描述
在这里插入图片描述

原生原语

原生原语和组件原语的功能相似,主要是用于接收和发送数据,其灵活度和接口的复杂度比组件原语高。包括:RXTX_BITSLICE,RX_BITSLICE,TX_BITSLICE,TX_BITSLICE_TRI,BITSLICE_CONTROL等,这里不做详细描述。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/614468
推荐阅读
相关标签
  

闽ICP备14008679号