一、XPM_CDC_ARRAY_SINGLE
Parameterized Macro: Single-bit Array Synchronizer
MACRO_GROUP: XPM
MACRO_SUBGROUP: XPM_CDC
Families: 7 series, UltraScale, UltraScale+
简介
该宏从源时钟域合成了一组单比特信号到目标时钟域。 为了正确操作,输入数据必须由目标时钟进行两次或更多次采样。您可以定义用于同步器的寄存器级数。在进行同步之前,可以使用可选的输入寄存器来在源时钟域中注册输入。还可以启用仿真功能,以生成报告有关宏的潜在误用的消息。 注意:该宏期望源数组的每一位都是独立的,并且没有需要保留的已定义关系。如果数组的每一位都有需要保留的关系,请使用XPM_CDC_HANDSHAKE或XPM_CDC_GRAY宏。
Port Description
port |
IO |
Width |
Domain |
Sense |
Handling if |
Function |
dest_clk |
I |
1 |
NA |
EDGE |
Active |
目标时钟域的时钟信号 |
dest_out |
O |
WIDTH |
dest_clk |
NA |
Active |
将src_in同步到目标时钟域。此输出已使用时钟打拍 |
src_clk |
I |
1 |
NA |
EDGE |
0 |
当SRC_I_REG=0时不使用。如果SRC_I_REG=1,则为src_in的输入时钟信号 |
src_in |
I |
WIDTH |
src_clk |
NA |
Active |
要同步到目标时钟域的输入单比特数组。假定数组的每一位都与其他位无关。这反映在应用于此宏的约束中。 为了在两个时钟域之间无损传输二进制值,请改用XPM_CDC_GRAY宏 |
参数属性:
attribute |
Type |
Allowed |
Default |
Description |
DEST_SYNC_FF |
DECIMAL |
2to10 |
4 |
用于在目标时钟域中同步信号的寄存器级数 |
INIT_SYNC_FF |
DECIMAL |
0,1 |
0 |
1-启用在同步寄存器上的行为仿真初始化值。 |
SIM_ASSERT_CHK |
DECIMAL |
0,1 |
0 |
1-启用仿真消息报告。 与潜在误用相关的消息将会报告。 |
SRC_I_REG |
DECIMAL |
1,0 |
1 |
1-使用src_clk对输入(src_in)进行一次寄存 |
WIDTH |
DECIMAL |
1to1024 |
2 |
单比特数组(src_in)的宽度,将在目标时钟域中同步。 |
二、XPM_CDC_ASYNC_RST
Parameterized Macro: Asynchronous Reset Synchronizer
MACRO_GROUP: XPM
MACRO_SUBGROUP: XPM_CDC
Families: 7 series, UltraScale, UltraScale+
简介
此宏将异步复位信号同步到目标时钟域。结果的复位输出将确保在与输入异步断言,但输出的去除将始终与目标时钟域同步。 您可以定义复位信号的极性以及在断言时宏的最小输出脉冲宽度。后者通过定义同步器中使用的寄存器级数来控制。 注意:最小输入脉冲断言取决于寄存器的复位或设置引脚的建立和保持要求。请查看针对目标架构的相应DC和AC切换特性数据表。
Port |
IO |
Width |
Domain |
Sense |
Handling if |
Function |
dest_arst |
O |
1 |
dest_clk |
NA |
Active |
源异步复位信号 src_arst 同步到目标时钟域。 此输出已寄存。 注意:信号异步断言,但与 dest_clk 同步去除。复位信号的宽度至少为 (DEST_SYNC_FF * dest_clk) 周期。 |
dest_clk |
I |
1 |
NA |
EDGE |
Active |
目标时钟 |
src_arst |
I |
1 |
NA |
NA |
Active |
源异步复位信号 |
参数属性:
attribute |
Type |
Allowed |
Default |
Description |
DEST_SYNC_FF |
DECIMAL |
2to10 |
4 |
用于在目标时钟域中同步信号的寄存器级数。此参数还确定了断言的复位信号的最小宽度。 |
INIT_SYNC_FF |
DECIMAL |
0,1 |
0 |
1-启用同步寄存器上的行为仿真初始化值。 |
RST_ACTIVE_HIGH |
DECIMAL |
0,1 |
0 |
定义异步复位信号的极性。 • 0-低电平有效的异步复位信号 • 1-高电平有效的异步复位信号 |
三、XPM_CDC_GRAY
ParameterizedMacro:SynchronizerviaGrayEncoding
MACRO_GROUP: XPM
MACRO_SUBGROUP:XPM_CDC
Families:7series,UltraScale,UltraScale+
简介
该宏使用Gray编码将来自源时钟域的二进制输入同步到目标时钟域。为了正确操作,目标时钟必须对输入数据进行两次或更多次采样。 此模块接收输入的二进制信号,将其转换为Gray编码并进行寄存,将其同步到目标时钟域,然后将其重新转换为二进制信号。您可以定义在同步器中使用的寄存器级数。还可以启用仿真功能,以生成消息来报告对该宏的潜在误用。 由于该宏使用Gray编码,因此提供给该宏的二进制值必须仅递增或递减一次,以确保要同步的信号具有仅相差一位的两个连续值。这将确保对Gray编码总线的无损同步。如果二进制值的行为与Gray编码不兼容,使用XPM_CDC_HANDSHAKE宏或其他同步数据到目标时钟域的替代方法。 还提供了一个额外选项(SIM_LOSSLESS_GRAY_CHK),用于在发现任何二进制输入值违反Gray编码规则(连续两个值仅递增或递减一次)时报告错误消息。
注意:当在设计中使用XPM_CDC_GRAY模块并运行report_cdc时,此模块中的同步器会报告为CDC-6类型的警告,具有ASYNC_REG属性。可以安全地忽略此警告,因为同步的总线是gray编码的。 应该运行report_cdc以确保识别CDC结构并且没有生成关键警告,还要验证dest_clk是否可以对src_in_bin[n:0]进行两次或更多次采样。
四、XPM_FIFO_ASYNC
ParameterizedMacro:AsynchronousFIFO
MACRO_GROUP: XPM
MACRO_SUBGROUP:XPM_FIFO
Families:7series,UltraScale,UltraScale+
五、XPM_FIFO_SYNC
ParameterizedMacro:SynchronousFIFO
MACRO_GROUP: XPM
MACRO_SUBGROUP:XPM_FIFO
Families:7series,UltraScale,UltraScale+
六、XPM_MEMORY_SDPRAM
ParameterizedMacro:SimpleDualPortRAM
MACRO_GROUP: XPM
MACRO_SUBGROUP:XPM_MEMORY
Families:7series,UltraScale,UltraScale+
6.1、简介
此宏用于实例化简单的双口RAM。PortA 用于执行来自内存的写操作,而 PortB 可用于从内存读取。
以下描述了 XPM_MEMORY 实例的基本读写端口使用情况,不区分 PortA 和 PortB。
- 所有同步信号对 clk[a|b] 上升沿敏感,假定为经过缓冲的并按照目标设备和内存原语要求进行切换的时钟信号。
- 读操作在组合方式下隐式执行以寻址 addrb。数据输出在每次 clkbcycle 上升时钟信号时寄存,当 enb 断言时。
- 读数据在关联的读操作后的 clkbcycle 之后出现在 doutb 端口。
- 写操作在每次 clkacycle 上,当 ena 和 wea 都断言时,显式执行将 din 写入到地址 addra。
- 所有读写操作都受 initiating clk[a|b] 周期上的 en[a|b] 的值控制,无论输入或输出的潜伏延迟如何。当 ena 在 coincidentclk[a|b] 周期上被取消断言时,addra 和 wea 输入无效。
- 对于每次 rstb 断言的 clkbcycle,最终输出寄存器将立即但同步地复位为 READ_RESET_VALUE_B,不考虑 READ_LATENCY_B。
- 对于每次 regceb 断言且 rstb 取消断言的 clkbcycle,最终输出寄存器捕获并输出来自前一级流水线寄存器的值。
- 提供给模块输入的未驱动或未知值将产生未定义的内存数组和输出端口行为。
在 SimpleDualPortRAM 配置中,只考虑 WRITE_MODE_B(尽管 PortA 具有写权限,但在连接到 PortB 的输出数据时,也会使用 WRITE_MODE_B,因此传递给原语时 WRITE_MODE_A 也会被应用相同的模式值)。以下是单口RAM配置中对 WRITE_MODE_B 参数的一些限制。违反这些限制将导致 DRC 错误。
- 当 MEMORY_PRIMITIVE 属性设置为 "distributed" 时,WRITE_MODE_B 必须设置为 "read_first"。
- 当 MEMORY_PRIMITIVE 属性设置为 "block" 时,WRITE_MODE_B 可以设置为 "read_first" 或 "no_change"。
- 当 MEMORY_PRIMITIVE 属性设置为 "ultra" 时,WRITE_MODE_B 可以设置为 "write_first" 或 "read_first"。
- 当用作 SDP 存储器时,支持所有写入模式(READ_FIRST、WRITE_FIRST、NO_CHANGE)。
注意:
- 当属性 "CLOCKING_MODE" 设置为 "common_clock" 时,通过 PortA 和 PortB 对内存的所有读写操作都在 clka 上执行。如果该属性设置为 "independent_clock",则通过 PortA 进行的读写操作基于 clka 执行,而通过 PortB 进行的读写操作基于 clkb 执行。
- 写入超出范围地址位置可能会覆盖有效地址位置,前提是有效地址位匹配到物理内存地址位置。
- 独立时钟分布式 RAM 基于内存的读写操作需要 set_false_path 约束,前提是设计已经处理了避免地址冲突(在任何给定时间点,写地址!=读地址)。如果 USE_EMBEDDED_CONSTRAINT=1,XPM_MEMORY 需要处理必要的约束,请将其设置为 1。如果 USE_EMBEDDED_CONSTRAINT=0,则 Vivado 可能会触发 Timing-6 或 Timing-7 或两者都触发。或者,您也可以在 USE_EMBEDDED_CONSTRAINT=0 时添加约束。下面提供了添加此约束的示例。 如果 Port-B 也具有独立时钟配置的写权限,则需要为 clkba 添加类似的约束。
set_false_path-from [filter[all_fanout-from[get_ports clka] -flat-endpoints_only]{IS_LEAF}] -through [get_pins-of_objects [get_cells-hier* -filter {PRIMITIVE_SUBGROUP==LUTRAM||PRIMITIVE_SUBGROUP==dram||PRIMITIVE_SUBGROUP==drom}] -filter {IO==OUT}]
- 如果 "CLOCKING_MODE" 设置为 "independent_clock",Vivado 可能会触发虚假的 CDC-1 警告,可以忽略。
- UltraRAM 的专用输入和输出寄存器的使用由基于 READ_LATENCY_B 值的综合控制。例如,如果有 4 个 UltraRAM 级联且 READ_LATENCY_B >= 4,则综合将尽可能多地吸收 UltraRAM 原语内部的寄存器。
6.2、时序图:
注意:
UltraRAM原语在睡眠断言在时钟的正边沿被识别时,不支持在睡眠断言之前的时钟周期内进行写/读访问,当其OREG属性设置为TRUE时。对于UltraRAM配置,在睡眠断言之前的时钟周期内不允许对内存进行写入/读取访问。
6.3、ECC模式
块RAM和UltraRAM原语在内存类型设置为Simple Dual Port RAM时都支持ECC。支持的三种ECC模式如下:
- 编码和解码都支持
- 仅编码支持
- 仅解码支持
这三种ECC模式的读取和写入用法与上述介绍中描述的相同。有关此功能的更多详细信息,例如错误注入和综合位计算等,请参阅7系列FPGA内存资源用户指南(UG473)中的“内置错误修正”部分。
在上述每种ECC模式中,对属性WRITE_DATA_WIDTH_A、READ_DATA_WIDTH_B和MEMORY_SIZE都有限制。
- 编码和解码都支持:WRITE_DATA_WIDTH_A和READ_DATA_WIDTH_B必须是64位的倍数。违反此规则将导致XPM_Memory中的DRC错误。
- 仅编码支持:WRITE_DATA_WIDTH_A必须是64位的倍数,READ_DATA_WIDTH_B必须是72位的倍数。MEMORY_SIZE必须是READ_DATA_WIDTH_B的倍数。违反这些规则将导致DRC错误。
- 仅解码支持:WRITE_DATA_WIDTH_A必须是72位的倍数,READ_DATA_WIDTH_B必须是64位的倍数。MEMORY_SIZE必须是WRITE_DATA_WIDTH_A的倍数。违反这些规则将导致DRC错误。
当启用ECC时,不支持以下功能:
- 非对称性
- 初始化
- 复位(既不支持非零复位值,也不支持复位断言)
注意:
ECC使用在BRAM/URAM宏中可用的硬ECC块,数据宽度应为64/72的倍数。对于其他数据宽度组合,请使用ECC IP。
6.4、自动休眠模式
- 该功能仅适用于MEMORY_PRIMITIVE为URAM时,并在UltraRAM内部受控制,以检查是否可以进入休眠模式以及何时需要唤醒。因此,可以在不必显式控制SLEEP引脚的情况下自动实现节能。
- 当AUTO_SLEEP_TIME为0时,禁用该功能。当AUTO_SLEEP_TIME为非零值时,XPM_MEMORY在除rst[a|b]外的所有输入信号上构建等于AUTO_SLEEP_TIME值的Pipeline 寄存器。
- 如果AUTO_SLEEP_TIME设置得太低,那么UltraRAM会频繁进入和唤醒休眠状态,这可能导致更多的功耗。
- 实现的休眠周期数量由以下公式计算:
- – 如果连续不活动周期数 < AUTO_SLEEP_TIME,则休眠周期数 = 0
- – 如果连续不活动周期数 >= AUTO_SLEEP_TIME,则连续休眠周期数 = 连续不活动周期数
- – 不活动周期定义为没有来自任何端口的读/写操作的周期
- 读操作和数据到达dout[a|b]之间的延迟为AUTO_SLEEP_TIME + READ_LATENCY_[A|B]时钟周期(假设输出数据管线存在时REGCE处于高电平)。
- 当READ_LATENCY_[A|B]设置为1或2时,XPM_Memory会以行为模型方式处理AUTO SLEEP功能,并在RAM处于自动休眠模式时强制将'DOUT[A|B]'上的'x'。
- 对于READ_LATENCY_[A|B]大于2,'x'的传播无法发生到'DOUT[A|B]',因为在UltraRAM退出休眠模式后,输出寄存器会获得时钟使能(延迟读取使能)。
- 自动休眠模式在内存尺寸较大或任何活动非常少的内存中最有效。
下面显示了不同读取延迟下的自动休眠模式的时序图:
注意:EN_DLY[A|B]、ADDR_DLY[A|B]和REGCE_DLY[A|B]分别是EN[A|B]、ADDR[A|B]和REGCE[A|B]经过AUTO_SLEEP_TIME个时钟周期延迟后的版本。
Port Description
port |
IO |
Width |
时钟域 |
Sense |
Handling if |
Function |
addra |
I |
ADDR_WIDTH_A |
clka |
NA |
Active |
|
addrb |
I |
ADDR_WIDTH_B |
clkb |
NA |
Active |
PortB读操作的地址。 |
clka |
I |
1 |
NA |
上升沿 |
Active |
PortA的时钟信号。当参数CLOCKING_MODE设置为"common_clock"时,也会驱动PortB。 |
clkb |
I |
1 |
NA |
上升沿 |
Active |
当参数CLOCKING_MODE设置为"independent_clock"时,PortB的时钟信号 |
dbiterrb |
O |
1 |
clkb |
高电平 |
DoNotCare |
用于指示PortB数据输出上发生双位错误的状态信号。 |
dina |
I |
WRITE_DATA_WIDTH |
clka |
NA |
Active |
PortA写操作的数据输入。 |
doutb |
O |
READ_DATA_WIDTH |
clkb |
NA |
Active |
PortB读操作的数据输出。 |
ena |
I |
1 |
clka |
高电平 |
Active |
PortA的内存使能信号。在发起写操作时,必须在时钟周期上保持高电平。在内部进行流水线处理。 |
enb |
I |
1 |
clkb |
高电平 |
Active |
PortB的内存使能信号。在发起读操作时,必须在时钟周期上保持高电平。在内部进行流水线处理。 |
injectdbiterra |
I |
1 |
clka |
高电平 |
0 |
在ECC启用时,控制输入数据上的双位错误注入(在"decode_only"模式下,无法使用错误注入能力)。 |
injectsbiterra |
I |
1 |
clka |
高电平 |
0 |
在ECC启用时,控制输入数据上的单位错误注入(在"decode_only"模式下,无法使用错误注入能力)。 |
regceb |
I |
1 |
clkb |
高电平 |
1 |
用于输出数据路径上的最后一个寄存器级的时钟使能 |
rstb |
I |
1 |
clkb |
高电平 |
Active |
用于重置PortB输出的最终寄存器级的复位信号。将输出端口doutb同步重置为参数READ_RESET_VALUE_B指定的值。 |
sbiterrb |
O |
1 |
clkb |
高电平 |
DoNotCare |
用于指示PortB数据输出上发生单位错误的状态信号。 |
sleep |
I |
1 |
NA |
高电平 |
0 |
用于启用动态节能功能的睡眠信号。 |
wea |
I |
WRITE_DATA_WIDTH |
clka |
高电平 |
Active |
PortA输入数据端口dina的写使能向量。在使用字宽写入时,它是1位宽的。在字节宽写入配置中,每位控制将dina的一个字节写入到地址addra。 例如,当WRITE_DATA_WIDTH_A为32时,要同步写入dina的位[15-8]时,写4'b0010。 |
Built-in Error Correction Capability and Error Injection:
Error Injection:
错误注入:injectsbiterr和injectdbiterr。用户可以使用这些可选的错误注入引脚作为调试引脚,在写操作期间将单位错误或双位错误注入特定位置。然后,您可以检查这些地址的输出上的sbiterr和dbiterr信号的断言。您可以选择不使用错误注入引脚,或者只使用其中一个或两个错误注入引脚。
RDADDRECC输出端口指示发生sbiterr或dbiterr的地址。rdaddrecc端口、两个错误注入端口和两个错误输出端口都是可选的,仅在选择BuiltIn_ECC选项时才可用。如果您未选择BuiltIn_ECC功能,则该原语的injectsbiterr和injectdbiterr端口会被内部驱动为'0',且该原语的输出sbiterr、dbiterr和rdaddrecc不会在外部连接。
图3-31显示了在写操作期间通过错误注入引脚注入错误时,sbiterr和dbiterr输出信号的断言。
简单双口RAM存储器支持内置的FPGA错误校正能力(ECC),适用于大于64位的数据宽度的块RAM原语。内置ECC存储器可以自动检测单位错误和双位错误,并能够自动纠正单位错误。
对于64位或更小数据宽度,提供了软汉明错误校正实现。