DDR3 MIG IP核解决方案

 

信号

方向

描述

app_addr [ADDR_WIDTH - 10]

输入

该输入指示当前请求的地址。

app_cmd [20]

输入

该输入选择当前请求的命令。

app_en

输入

这是app_addr []app_cmd [20]app_szapp_hi_pri输入的高有效选通。

app_rdy

输出

此输出表明UI已准备好接受命令。如果在启用app_en时取消断言信号,则必须重试当前的app_cmdapp_addr,直到app_rdy被声明为止。

app_hi_pri

输入

该高电平有效输入提升当前请求的优先级。

app_rd_data

[APP_DATA_WIDTH - 10]

输出

这提供了读命令的输出数据。

app_rd_data_end

输出

该高电平有效输出表明当前时钟周期是app_rd_data []上输出数据的最后一个周期。

app_rd_data_valid

输出

active-High输出表明app_rd_data []是有效的。

app_sz

输入

该输入被保留并且应该被绑定到

app_wdf_data

[APP_DATA_WIDTH - 10]

输入

这提供了写入命令的数据。

app_wdf_end

输入

这个高电平有效输入表明当前时钟周期是app_wdf_data []上输入数据的最后一个周期。

app_wdf_mask

[APP_MASK_WIDTH - 10]

输入

这提供了app_wdf_data []的掩码。

app_wdf_rdy

输出

该输出表明写入数据FIFO已准备好接收数据。写入数据在app_wdf_rdy = 1'b1 app_wdf_wren = 1'b1 时被接受。

app_wdf_wren

输入

这是app_wdf_data []的主动高频闪。

app_correct_en_i

输入

置位时,该高电平有效信号纠正单位数据错误。只有在GUI中启用ECC时,此输入才有效。

在示例设计中,该信号总是与1相关联。

app_sr_req

输入

该输入被保留并且应该被绑定到0

app_sr_active

输出

该输出保留。

app_ref_req

输入

该高电平有效输入请求向DRAM发出刷新命令。

app_ref_ack

输出

该高电平有效输出表示存储器控制器已将请求的刷新命令发送到PHY接口。

app_zq_req

输入

该高电平有效输入请求向DRAM发出ZQ校准命令。

app_zq_ack

输出

此高电平有效输出表示存储器控制器已将请求的ZQ校准命令发送到PHY接口。

ui_clk

输出

这个UI时钟必须是DRAM时钟的一半或四分之一。

init_calib_complete

输出

校准完成后,PHY断言init_calib_complete

app_ecc_multiple_err [70] 1

输出

该信号适用于启用了ECC并且与app_rd_data_valid一起有效的情况。如果来自外部存储器的读取数据在读取脉冲串的每个脉冲中具有两个比特错误,则app_ecc_multiple_err [30]信号非零。SECDED算法不会校正相应的读取数据,并在此信号上放置一个非零值,以通知用户界面上已损坏的读取数据。

ui_clk_sync_rst

输出

这是主动高UI重置。

 

 

input [27:0]       app_addr,

 input [2:0]       app_cmd,

 input             app_en,

 input [511:0]        app_wdf_data,

 input             app_wdf_end,

 input             app_wdf_wren,

 

   1-2         example_design/ rtl / traffic_gen目录中的文件

名称1

描述

memc_traffic_gen.v

这是流量发生器的顶层。

cmd_gen.v

这是命令生成器。该模块提供独立的控制来生成命令类型,地址和突发长度。

cmd_prbs_gen.v

这是一个伪随机二进制序列(PRBS)发生器,用于产生PRBS命令,地址和突发长度。

memc_flow_vcontrol.v

该模块在内存控制器内核和cmd_gen read_data_path write_data_path 模块之间生成流控制逻辑。

read_data_path.v

这是读取数据路径的顶层。

read_posted_fifo.v

该模块存储发送到存储控制器的读命令,其FIFO输出用于生成读数据比较的期望数据。

rd_data_gen.v

该模块为memc_flow_vcontrol.v 生成读取和就绪信号的时序控制。

write_data_path.v

这是写入数据路径的顶层。

wr_data_g.v

该模块为memc_flow_vcontrol.v 生成写入和准备信号的时序控制。

s7ven_data_gen.v

该模块生成不同的数据模式。

a_fifo.v

这是一个使用LUT RAM的同步FIFO

data_prbs_gen.v

这是一个用于生成PRBS数据码型的32位线性反馈移位寄存器(LFSR)。

init_mem_pattern_ctr.v

该模块为流量生成器生成流量控制逻辑。

traffic_gen_top.v

该模块是流量生成器的顶层,包含memc_traffic_gen init_mem_pattern_ctr 模块。

 

 

 

用户接口模块:
提出了用户设计的用户界面
提供了一个简单而又方便的替代本地接口
读取与写入数据缓冲
重新排序读取返回值,以匹配请求的顺序
提出了平面地址空间,并将其转换成SDRAM所需的地址


内存控制器模块:
接收来自用户设计的请求
重新排序请求,以尽量减少死状态,从而达到最高的SDRAM性能
管理SDRAM的row / rank配置
执行高级的SDRAM管理比如刷新、激活或预充电


物理层(PHY)模块:
通过一个简单的界面连接至内存控制器模块,同时将信号转换成实际的信号发送至SDRAM, 反之亦然
在多时钟域内转换和同步控制信号和数据
初始化SDRAM
执行DDR3写操作
执行时钟与读取数据的居中校准

 

修改示例设计

所提供的example_top设计包含流量生成器模块,并且可以进行修改以调整不同的命令和数据模式。可以在example_top.v vhd 模块中修改几个高级参数。1-11 描述了这些参数。

1-11          流量发生器参数在example_top模块中设置

参数

描述

家庭

指示家庭类型。

该参数的值是“VIRTEX7”

MEMORY_TYPE

指示内存控制器类型。

“DDR2”“DDR3”

nCK_PER_CLK

这是内存控制器时钟与DRAM时钟比率。

42(取决于在GUI中选择的PHY到控制器时钟比率)

NUM_DQ_PINS

这是总内存DQ总线宽度。

此参数支持从8到最大72DQ宽度,以8为增量。可用的最大DQ宽度取决于所选存储设备的频率。

MEM_BURST_LEN

这是内存数据突发长度。

这必须设置为8

MEM_COL_WIDTH

这是存储器列地址位的数量。

该选项基于选定的存储设备。

DATA_WIDTH

这是用户界面数据总线宽度。

对于nCK_PER_CLK = 4

DATA_WIDTH = NUM​​_DQ_PINS×8

ADDR_WIDTH

这是内存地址总线宽度。它等于RANK_WIDTH + BANK_WIDTH + ROW_WIDTH + COL_WIDTH

 

MASK_SIZE

此参数指定用户界面数据总线中的掩码宽度。

 

PORT_MODE

设置端口模式。

该参数的有效设置是:

BI_MODE:生成WRITE数据模式并监控READ数据以进行比较。

BEGIN_ADDRESS

设置内存起始地址边界。

该参数定义端口地址空间的起始边界。该值的最低有效位[30]被忽略。


 

参数

描述

END_ADDRESS

设置内存结束地址边界。

该参数定义端口地址空间的结束边界。该值的最低有效位[30]被忽略。

PRBS_EADDR_MASK_POS

设置32AND MASK位置。

该参数与PRBS地址生成器一起使用,将随机地址向下移入端口地址空间。END_ADDRESS值与该掩码中具有“ 的位位置的PRBS地址进行AND运算。

CMD_PATTERN

该参数设置要生成的命令模式电路。对于较大的设备,可将CMD_PATTERN设置为“CGEN_ALL”。该参数允许生成所有支持的命令模式电路。但是,有时候

由于较小的设备资源有限,因此必须限制特定的命令模式。

该信号的有效设置是:

•    CGEN_FIXED:地址,突发长度和指令直接来自fixed_addr_ifixed_bl_ifixed_instr_i输入。

•    CGEN_SEQUENTIAL:地址按顺序递增,增量由数据端口大小决定。

•    CGEN_PRBS32级线性反馈移位寄存器(LFSR)产生伪随机地址,突发长度和指令序列。种子可以从32cmd_seed输入设置。

•    CGEN_ALL(默认):该选项打开上述所有选项,并允许addr_mode_iinstr_mode_ibl_mode_i在运行时间内选择生成类型。

 

参数

描述

DATA_PATTERN

该参数设置要通过rtl逻辑生成的数据模式电路。对于较大的设备,

DATA_PATTERN可以设置为“DGEN_ALL”,从而可以生成所有支持的数据码型电路。在硬件中,使用vio_data_value_mode选择和/或更改数据模式。该模式只能在更改时才能更改

DATA_PATTERN被设置为DGEN_ALL

此参数的有效设置是:

•    ADDR(默认):地址用作数据模式。

•    HAMMER:在DQS的上升沿期间,所有s都在DQ引脚上,在DQS 的下降沿期间,所有s都在DQ引脚上。

•    WALKING1:步行s为对DQ管脚和的起始位置取决于地址值。

•    WALKING0:步进s位于DQ引脚上,起始位置取决于地址值。

•    NEIGHBOR:除一个DQ引脚外,所有DQ引脚均为Hammer模式。地址确定异常引脚位置。

•    PRBS32LFSR生成随机数据并以起始地址播种。

•    DGEN_ALL:该选项打开所有可用选项:

0x1:固定--32fixed_data

0x2ADDRESS - 32位地址作为数据。

0x3HAMMER

0x4SIMPLE8 - 简单8个数据模式,每8个字重复一次。

0x5WALKING1s - 步行1DQ引脚上。

0x6WALKING0s - 步行0位于DQ引脚上。

0x7PRBS - 32LFSR生成随机数据。

0x9:慢速锤 - 这是慢速的锤子数据模式。

0xAPHY_CALIB模式 - 0xFF00AA55,55AA99,66。该模式仅在地址0处生成READ命令。

CMDS_GAP_DELAY

该参数允许每个用户突发命令之间的暂停延迟。

 有效值:032

SEL_VICTIM_LINE

选择状态始终处于逻辑高电平的受害DQ线路。

该参数仅适用于锤子模式。此参数的有效设置是0NUM_DQ_PINS

value = NUM​​_DQ_PINS时,所有DQ引脚都具有相同的Hammer模式。

1.流量发生器可能支持比7系列内存控制器更多的选项。设置必须与内存控制器中支持的值匹配。

命令模式instr_mode_i addr_mode_i bl_mode_i data_mode_i

所述的traffic_gen 模块可以分别独立地设定。所提供的init_mem_pattern_ctr 模块具有接口信号,允许您使用Vivado调试逻辑核心虚拟I / OVIO)实时修改命令模式。

这是变化的命令模式:

1.      vio_modify_enable 设置为

2.      vio_addr_mode_value 设置为:

1Fixed_address 

2PRBS地址。

3:顺序地址。

参数

描述

EYE_TEST

强制流量生成器仅生成写入单个位置,并且不会生成读取事务。

此参数的有效设置为“TRUE”“FALSE”

当设置为“TRUE”时,vio_instr_mode_value中的任何设置都将被覆盖。

3.      vio_bl_mode_value 设置为:

1:固定bl

2PRBS bl。如果bl_mode 值设置为2,则addr_mode值被强制为2以生成PRBS地址。

4.      vio_data_mode_value 设置为:

0:保留。

1:固定数据模式。数据来自fixed_data_i 输入总线。

2DGEN_ADDR (默认)。该地址被用作数据模式。

3DGEN_HAMMER 。在DQS的上升沿期间,所有s都在DQ引脚上,在DQS 的下降沿期间,所有s都在DQ引脚上。

4DGEN_NEIGHBOR 。除了一个引脚,DQS的上升沿期间,所有都位于DQ引脚上。地址确定异常引脚位置。

5DGEN_WALKING1 。步行秒在DQ引脚上。的起始位置取决于地址值。


6DGEN_WALKING0 。步行秒在DQ引脚上。起始位置取决于地址值。

7DGEN_PRBS 。一个32LFSR产生随机数据并以起始地址播种。该数据模式仅适用于PRBS地址模式或顺序地址模式。

修改端口地址空间

SADDR

eaddr

PRBS_SADDR_MASK_POS

PRBS_EADDR_MASK_POS

0x1000

0xFFFF

0x00001000

0xFFFF0000地址

0x2000

0xFFFF

0x00002000

0xFFFF0000地址

0x3000

0xFFFF

0x00003000

0xFFFF0000地址

0x4000

0xFFFF

0x00004000

0xFFFF0000地址

0x5000

0xFFFF

0x00005000

0xFFFF0000地址

0x2000

0x1FFF

0x00002000

0xFFFFE000

0x2000

0x2FFF

0x00002000

0xFFFFD000

0x2000

0x3FFF

0x00002000

0xFFFFC000

0x2000

0x4FFF

0x00002000

0xFFFF8000

0x2000

0x5FFF

0x00002000

0xFFFF8000

0x2000

0x6FFF

0x00002000

0xFFFF8000

0x2000

0x7FFF

0x00002000

0xFFFF8000

0x2000

0x8FFF

0x00002000

0xFFFF0000地址

0x2000

0x9FFF

0x00002000

0xFFFF0000地址

0x2000

0xAFFF

0x00002000

0xFFFF0000地址

0x2000

0xBFFF

0x00002000

0xFFFF0000地址

可以通过更改顶级测试平台文件中的BEGIN_ADDRESSEND_ADDRESS参数来修改端口的地址空间。这两个值必须设置为与端口数据宽度对齐。PRBS_SADDR_MASK_POSPRBS_EADDR_MASK_POS这两个附加参数用于默认PRBS地址模式,以确保超出范围的地址不会发送到端口。PRBS_SADDR_MASK_POS创建一个OR掩码,将PRBS生成的地址的值低于BEGIN_ADDRESS的值移入端口的有效地址空间。应将PRBS_SADDR_MASK_POS设置为等于BEGIN_ADDRESS参数的32位值。PRBS_EADDR_MASK_POS创建一个AND掩码,将带有END_ADDRESS以上值的PRBS生成地址向下移动到端口的有效地址空间中。应将PRBS_EADDR_MASK_POS设置为32位值,并且所有剩余的位都被设置为1-12 显示了设置两个掩码参数的一些示例。

                 1-12         地址空间和PRBS掩码的示例设置

                 1-12         地址空间和PRBS掩码的示例设置

SADDR

eaddr

PRBS_SADDR_MASK_POS

PRBS_EADDR_MASK_POS

0x2000

0xCFFF

0x00002000

0xFFFF0000地址

0x2000

0xDFFF

0x00002000

0xFFFF0000地址

0x2000

0xEFFF

0x00002000

0xFFFF0000地址

0x2000

0xFFFF

0x00002000

0xFFFF0000地址

流量发生器信号描述

流量发生器信号如 1-13所示

1-13         流量发生器信号说明

信号

方向

描述

CLK_I

输入

该信号是时钟输入。

memc_init_done

输入

这是来自内存控制器的输入状态信号,表示它已准备好接受流量。

manual_clear_error

输入

输入信号清除错误标志。

memc_cmd_addr_o [310]

产量

当前交易的起始地址。

memc_cmd_en_o

产量

该高电平有效信号是命令FIFO的写使能信号。

memc_cmd_full_i

输入

这连接到内存控制器的app_rdy的反转。当该输入信号有效时,TG继续断言memc_cmd_en_o memc_cmd_addr_o 值和memc_cmd_instr直到memc_cmd_full_i 被取消断言。

memc_cmd_instr [20]

产量

当前指令的命令码。

命令写入:3'b000

命令阅读:3'b001

memc_rd_data_i [DWIDTH - 10]

输入

读取从内存返回的数据值。

memc_rd_empty_i

输入

该高电平有效信号是存储器控制器中读数据FIFO的空标志。它表示FIFO中没有有效的数据。

memc_rd_en_o

产量

该信号仅用于类似MCB的接口。

memc_wr_data_o [DWIDTH -

10]

产量

将数据值写入存储器控制器的写入数据FIFO中。

memc_wr_en_o

产量

该高电平有效信号是写数据FIFO的写使能。它表明memc_wr_data 上的值是有效的。

memc_wr_full_i

输入

该高电平有效信号是来自存储器控制器的写入数据FIFO的完整标志。当该信号为高电平时,TG保持写数据值并保持memc_wr_en的置位状态,直到memc_wr_full_i 变为低电平。

qdr_wr_cmd_o

产量

该信号仅用于向QDR II +用户界面发送写入命令。

vio_modify_enable

输入

允许vio_xxxx_mode_value 改变流量模式。

 

信号

方向

描述

vio_data_mode_value [30]

输入

该信号的有效设置是:

•    0x0:保留。

•    0x1:固定 - 通过fixed_data_i 输入定义的fixed_data32位。

•    0x2ADDRESS - 32位地址作为数据。数据是基于逻辑地址空间生成的。如果设计具有256位用户数据总线,则用户总线中的每个写入节拍在字节边界中将具有256/8的地址增量。如果起始地址是1,300,则数据是1,300,然后是下一个周期中的1,320。为了简化逻辑,用户数据模式是重复地址值位[310]的增量。

•    0x3HAMMER - 在上升沿期间,所有1都在DQ引脚上

DQS,并且所有的0都在DQ引脚的下降沿

DQS,但参数中定义的VICTIM线除外

“SEL_VICTIM_LINE”。该选项仅在参数DA​​TA_PATTERN =“DGEN_HAMMER”“DGEN_ALL”时有效。

•    0x4SIMPLE8 - 简单8数据模式,每8个字重复一次。模式可以由“simple_datax”输入定义。

•    0x5WALKING1s - 步行1位于DQ引脚上。1的起始位置取决于地址值。该选项仅在参数DA​​TA_PATTERN =“DGEN_WALKING”“DGEN_ALL”时有效。

•    0x6WALKING0s - 步进0位于DQ引脚上。起始位置0取决于地址值。该选项仅在参数DA​​TA_PATTERN =“DGEN_WALKING0”“DGEN_ALL”时有效。

•    0x7PRBS - 32LFSR生成随机数据并以起始地址播种。该选项仅在参数DA​​TA_PATTERN =“DGEN_PRBS”“DGEN_ALL”时有效。

•    0x9:慢速锤 - 这是慢速的锤子数据模式。

•    0xAPHY_CALIB模式 - 0xFF00AA55,55AA99,66。该模式仅在地址零处生成READ命令。这是只有在有效的Virtex ® -7系列。

vio_addr_mode_value [20]

输入

该信号的有效设置是:

•    0x1:固定地址模式。该地址来自fixed_addr_i输入总线。在FIXED地址模式下,data_mode被限制在fixed_data_input。没有生成PRBS数据模式。

•    0x2PRBS地址模式(默认)。该地址由内部32LFSR电路产生。种子可以通过cmd_seed输入总线进行更改。

•    0x3SEQUENTIAL地址模式。地址由内部地址计数器生成。增量由用户界面端口宽度决定。


 

信号

方向

描述

vio_instr_mode_value [30]

输入

该信号的有效设置是:

•    0x1:由fixed_instr_i 定义的命令类型(读/写)。

•    0x2:随机读取/写入命令。

•    0xE:只写入地址零。

•    0xF:只读地址零。

vio_bl_mode_value [30]

输入

该信号的有效设置是:

•    0x1fixed_bl_i输入中定义的固定突发长度。

•    0x2:用户突发长度由内部PRBS发生器生成。每个突发值定义了生成的背靠背命令的数量。

vio_fixed_instr_value

输入

有效的设置是:

•    0x0:写入指令

•    0x1:读指令

vio_fixed_bl_value

输入

有效的设置是1256

vio_pause_traffic

输入

即时暂停流量生成。

vio_data_mask_gen

输入

该模式仅在数据模式模式为数据地址时使用。如果启用此功能,则会在内存中填充内存模式后生成一个随机memc_wr_mask。如果相应的memc_write_mask被声明,写数据字节通道会被8'hFF卡住。

cmp_data [DWIDTH - 10]

产量

预期数据与内存中的回读数据进行比较。

cmp_data_valid

产量

比较数据有效信号。

cmp_error

产量

只要cmp_data与内存中的回读数据不相同,该比较错误标志就会置位。

错误

产量

当回读数据不等于期望值时,该信号有效。

ERROR_STATUS [N0]

产量

错误信号有效时,该信号锁存这些值:

•    [310]:读取起始地址

•    [37:32]:读取突发长度

•    [39:38]:保留

•    [40]mcb_cmd_full

•    [41]mcb_wr_full

•    [42]mcb_rd_empty

•    [64 +DWIDTH - 1):64]expected_cmp_data

•    [64 +2×DWIDTH - 1):64 + DWIDTH]read_data

simple_data0 [310]

输入

用户定义的简单数据0用于简单8重复数据模式。

simple_data1 [310]

输入

用户定义的简单数据1用于简单8重复数据模式。

simple_data2 [310]

输入

用户定义的简单数据2用于简单的8个重复数据模式。

simple_data3 [310]

输入

用户定义的简单数据3用于简单的8重复数据模式。

simple_data4 [310]

输入

用户定义的简单数据4用于简单的8个重复数据模式。

信号

方向

描述

simple_data5 [310]

输入

用户定义的简单数据5用于简单的8重复数据模式。

simple_data6 [310]

输入

用户定义的简单数据6用于简单的8重复数据模式。

simple_data7 [310]

输入

用户定义的简单数据7用于简单的8个重复数据模式。

fixed_data_i [310]

输入

用户定义的固定数据模式。

fixed_instr_i [20]

输入

用户定义的固定命令模式。

000 :写入命令

001 :读命令

fixed_bl_i [50]

输入

用户定义的固定突发长度。每个突发值定义生成的背对背命令的数量。

内存初始化和流量测试流程

上电后,初始化存储器控制块指示流量发生器通过存储器初始化过程用选定的数据模式初始化存储器。

内存初始化

1.      data_mode_i 输入被设置为选择的数据模式(例如,data_mode_i [30] = 0010 的地址作为数据图案)。

2.      start_addr_i 输入被设置为限定下边界的地址。

3.      end_addr_i 输入被设置为限定所述上边界的地址。

4.      bl_mode_i 设置为01 以从fixed_bl_i 输入获取突发长度。

5.      fixed_bl_i 输入设置为1632

6.      instr_mode_i 设置为0001 ,以获得从指令fixed_instr_i 输入。

7.      fixed_instr_i 输入被设置到存储器设备中的“WR”指令值。

8.      为顺序地址模式填充内存空间,addr_mode_i 设置为11 

9.      mode_load_i 被断言一个时钟周期。

当内存空间使用所选数据模式初始化时,初始化内存

控制块指示流量生成器开始通过流量测试流程过程运行流量(默认情况下,addr_mode_i instr_mode_i bl_mode_i 输入设置为选择PRBS模式)。

交通测试流程

1.      addr_mode_i 输入被设置为想要的模式(PRBS是默认值)。

2.      cmd_seed_i data_seed_i 输入值用于内部PRBS发生器设置。其他模式不需要此步骤。

3.      instr_mode_i 输入被设置为想要的模式(PRBS是默认值)。

4.      bl_mode_i 输入被设置为想要的模式(PRBS是默认值)。

5.      data_mode_i 输入应具有相同的值作为详述的存储器模式初始化阶段存储器初始化

6.      run_traffic_i 输入被触发,才能启动运行流量。

7.      如果在测试期间发生错误(例如,读取的数据与期望的数据不匹配),错误位将被设置,直到应用复位。

8.      接收到错误时,error_status总线将锁定1-13,页面66定义的值。

通过一些修改,可以更改示例设计,以便在run_traffic_i 取消断言时动态更改addr_mode_i instr_mode_i bl_mode_i 。但是,在更改设置后,需要重复执行存储器初始化步骤,以确保将适当的模式加载到内存空间中。

注意:

°       禁用芯片选择选项时,仿真测试平台始终将存储器模型芯片选择位设置为零以实现正确操作。

°       禁用数据遮罩选项时,模拟测试台始终将存储器模型数据遮罩位置零以便正确操作。

 

7系列FPGA存储器接口解决方案内核如图1-49 所示。

X-Ref目标 - 1-49

6 \ VWHPFORFNV \ VBFONBSDQGV \ VBFONBQV \VBFONBL5HIHUHQFHFORFNFONBUHIBSDQGFONBUHIBQFONBUHIBLDQGV \ VWHPUHVHWV \VBUVWBQSRUW FRQQHFWLRQVDUHQRWVKRZQLQEORFNGLDJUDP

                                                    1-49        7系列FPGA存储器接口解决方案

用户FPGA逻辑

1-49 所示的用户FPGA逻辑模块是任何需要连接到外部DDR2DDR3 SDRAMFPGA设计。用户FPGA逻辑通过用户界面连接到内存控制器。内核提供了一个示例用户FPGA逻辑。

AXI4从接口模块

AXI4从机接口将AXI4事务映射到UI,为存储器控制器提供工业标准总线协议接口。

用户界面块和用户界面

UI块将用户界面呈现给用户FPGA逻辑块。它通过提供一个平坦的地址空间和缓冲读写数据来为本地接口提供一个简单的替代方案。

内存控制器和本地接口

内存控制器(MC)的前端向UI块提供本地接口。本地接口允许用户设计提交内存读取和写入请求,并提供将数据从用户设计移动到外部存储设备的机制,反之亦然。内存控制器的后端连接到物理接口并处理该模块的所有接口要求。内存控制器还提供重新排序选项,对接收到的请求进行重新排序以优化数据吞吐量和延迟。

PHY和物理接口

PHY的前端连接到内存控制器。PHY的后端连接到外部存储设备。PHY处理所有的存储设备信号排序和时序。

IDELAYCTRL

任何使用IDELAY的银行都需要IDELAYCTRLIDELAY与数据组(DQ)相关联。任何使用这些信号的银行/时钟区域都需要IDELAYCTRL

MIG工具实例化一个IDELAYCTRL,然后使用IODELAY_GROUP属性(请参阅iodelay_ctrl.v 模块)。基于此属性,Vivado Design Suite可在设计中根据需要正确复制IDELAYCTRL

IDELAYCTRL参考频率应设为200 MHz。基于

设置了IODELAY_GROUP属性后,Vivado Design Suite将为存在IDELAY块的每个区域复制IDELAYCTRL。当用户自行创建多控制器设计时,每个MIG输出都具有与该基元实例化的组件。这违反了IDELAYCTRL的规则和IODELAY_GRP属性的使用。IDELAYCTRL需要只有一个具有正确设置属性的组件的实例化,并允许工具根据需要进行复制。

用户界面

用户界面如1-17 所示,并连接到FPGA用户设计以允许访问外部存储设备。

1-17       用户界面

信号

方向

描述

app_addr [ADDR_WIDTH - 10]

输入

该输入指示当前请求的地址。

app_cmd [20]

输入

该输入选择当前请求的命令。

app_en

输入

这是app_addr []app_cmd [20]app_szapp_hi_pri输入的高有效选通。

app_rdy

产量

此输出表明UI已准备好接受命令。如果在启用app_en时取消断言信号,则必须重试当前的app_cmdapp_addr,直到app_rdy被声明为止。

app_hi_pri

输入

该高电平有效输入提升当前请求的优先级。

app_rd_data

[APP_DATA_WIDTH - 10]

产量

这提供了读命令的输出数据。

app_rd_data_end

产量

该高电平有效输出表明当前时钟周期是app_rd_data []上输出数据的最后一个周期。

app_rd_data_valid

产量

active-High输出表明app_rd_data []是有效的。

app_sz

输入

该输入被保留并且应该被绑定到

app_wdf_data

[APP_DATA_WIDTH - 10]

输入

这提供了写入命令的数据。

app_wdf_end

输入

这个高电平有效输入表明当前时钟周期是app_wdf_data []上输入数据的最后一个周期。

app_wdf_mask

[APP_MASK_WIDTH - 10]

输入

这提供了app_wdf_data []的掩码。

app_wdf_rdy

产量

该输出表明写入数据FIFO已准备好接收数据。写入数据在app_wdf_rdy = 1'b1 app_wdf_wren = 1'b1 时被接受。

app_wdf_wren

输入

这是app_wdf_data []的主动高频闪。

app_correct_en_i

输入

置位时,该高电平有效信号纠正单位数据错误。只有在GUI中启用ECC时,此输入才有效。

在示例设计中,该信号总是与1相关联。

app_sr_req

输入

该输入被保留并且应该被绑定到0

app_sr_active

产量

该输出保留。

app_ref_req

输入

该高电平有效输入请求向DRAM发出刷新命令。

app_ref_ack

产量

该高电平有效输出表示存储器控制器已将请求的刷新命令发送到PHY接口。

app_zq_req

输入

该高电平有效输入请求向DRAM发出ZQ校准命令。

1-17       用户界面(续)

信号

方向

描述

app_zq_ack

产量

此高电平有效输出表示存储器控制器已将请求的ZQ校准命令发送到PHY接口。

ui_clk

产量

这个UI时钟必须是DRAM时钟的一半或四分之一。

init_calib_complete

产量

校准完成后,PHY断言init_calib_complete

app_ecc_multiple_err [70] 1

产量

该信号适用于启用了ECC并且与app_rd_data_valid一起有效的情况。如果来自外部存储器的读取数据在读取脉冲串的每个脉冲中具有两个比特错误,则app_ecc_multiple_err [30]信号非零。SECDED算法不会校正相应的读取数据,并在此信号上放置一个非零值,以通知用户界面上已损坏的读取数据。

ui_clk_sync_rst

产量

这是主动高UI重置。

1.该信号仅被引入memc_ui_top 模块级别。该信号只能在启用ECC时使用。

app_addr[ADDR_WIDTH - 10]

此输入指示当前正在提交给UI的请求的地址。用户界面汇总外部SDRAM的所有地址字段,并为您提供一个平坦的地址空间。

app_cmd [20]

此输入指定当前提交给UI的请求的命令。可用命令如1-18 所示。1-18app_cmd [20]的命令

手术

app_cmd [20]代码

001

000

app_en

该输入在请求中闪烁。您必须将所需值应用于app_addr []app_cmd [20]app_hi_pri ,然后声明app_en 以将请求提交给UI。这通过声明app_rdy来启动UI确认的握手。app_hi_pri

该输入表明当前请求是高优先级。

app_wdf_data[APP_DATA_WIDTH - 10]

该总线提供当前正在写入外部存储器的数据。

app_wdf_end

该输入表明当前周期中app_wdf_data []总线上的数据是当前请求的最后一个数据。

app_wdf_mask[APP_MASK_WIDTH - 10]

该总线指示将app_wdf_data []的哪些字节写入外部存储器,哪些字节保持其当前状态。字节通过将值“1”设置为app_wdf_mask的相应位来屏蔽。例如,如果应用程序数据的宽度是256,掩模宽度取的值32。所述的至少显著字节[70]app_wdf_data 使用的[0]位被掩蔽app_wdf_mask 和最显著字节[248 255]app_wdf_data app_wdf_maskBit [31] 掩码。因此,如果必须屏蔽最后一个DWORD,即app_wdf_data字节0,1,23则应app_wdf_mask 设置为32'h0000_000F

app_wdf_wren

该输入表明app_wdf_data []总线上的数据是有效的。

app_rdy

此输出向您显示当前正在提交给UI的请求是否被接受。如果在app_en 被声明后UI没有声明这个信号,那么当前的请求必须重试。在以下情况下,app_rdy 输出未被声明:

                        °          PHY /内存初始化尚未完成

°所有的银行机器都被占用(可以视为命令缓冲区已满)

      请求读取并且读取缓冲区已满

      请求写入,并且没有写入缓冲区指针可用

                        °         正在插入定期读取

app_rd_data[APP_DATA_WIDTH - 10]

该输出包含从外部存储器读取的数据。

app_rd_data_end

此输出表明 当前循环中app_rd_data []总线上的数据是当前请求的最后一个数据。

app_rd_data_valid

该输出表明app_rd_data []总线上的数据 有效。

app_wdf_rdy

该输出表明写入数据FIFO已准备好接收数据。写入数据在app_wdf_rdy app_wdf_wren 都被声明时被接受。app_ref_req

置位时,此高电平有效输入请求存储控制器向DRAM发送刷新命令。它必须脉冲一个周期才能发出请求,然后至少在app_ref_ack 信号被断言以确认请求并指示它已发送之前解除置位。

app_ref_ack

置位时,该高电平有效输入确认刷新请求,并指示该命令已从存储器控制器发送至PHY

app_zq_req

置位时,该高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。它必须脉冲一个周期才能发出请求,然后至少在app_zq_ack 信号被断言以确认请求并指示它已被发送之前解除置位。

app_zq_ack

置位时,该高电平有效输入确认ZQ校准请求,并指示该命令已从存储器控制器发送至PHYui_clk_sync_rst

这是与ui_clk 同步的UI重置。

ui_clk

这是UI的输出时钟。它必须是输出到外部SDRAM的时钟频率的一半或四分之一,这取决于在GUI中选择的2141模式。

init_calib_complete

校准完成后,PHY断言init_calib_complete 在将命令发送到内存控制器之前,应用程序不需要等待init_calib_complete 

 

用户界面块

UI块将用户界面呈现给用户设计。它为本地界面提供了一个简单的替代方案。UI块:

•       缓冲区读取和写入数据

•       重新排列读取返回数据以匹配请求顺序

•       提供一个平坦的地址空间并将其转换为SDRAM所需的寻址

本地接口

本地接口连接到FPGA用户设计,允许访问外部存储设备。

命令请求信号

本地接口提供一组请求从存储器控制器读取或写入命令到存储器设备的信号。这些信号汇总在1-76

1-76        本地接口命令信号

信号

方向

描述

接受

产量

该输出表明内存接口接受最后一个周期驱动的请求。

银行[20]

输入

该输入为当前请求选择银行。

bank_mach_next []

产量

该输出保留,应保持不连接。

CMD [20]

输入

该输入选择当前请求的命令。

col [COL_WIDTH - 10]

输入

该输入选择当前请求的列地址。

data_buf_addr [70]

输入

该输入表示内存控制器的数据缓冲区地址:

•    处理写入命令时查找数据。

•    处理读命令时放置数据。

hi_priority

输入

该输入保留,应连接到逻辑

[]

输入

该输入保留,应连接到逻辑

1-76         本地接口命令信号(续)

信号

方向

描述

[ROW_WIDTH - 10]

输入

该输入选择当前请求的行地址。

use_addr

输入

用户设计选通该输入以指示在先前状态下驱动的请求信息是有效的。

银行,行和列包括用于读取和写入操作的存储器设备上的目标地址。命令是通过使用cmd [20]输入到核心来指定的。1-77 中显示了可用的读取和写入命令。1-77存储器接口命令

手术

cmd [20]代码

内存写入

000

内存读取

001

保留的

所有其他代码

接受

该信号向用户设计指示核心是否接受请求。当接受信号被断言时,接受在最后一个周期提交的请求,并且用户设计可以继续提交更多请求或闲置。当接受信号无效时,最后一个周期提交的请求不被接受,并且必须重试。

use_addr

用户设计声明use_addr 信号来选通上一个周期中提交给本地接口的请求。

data_buf_addr

用户设计必须包含读取和写入命令期间使用的数据的缓冲区。当一个请求被提交给本地接口时,用户设计必须在缓冲区中指定一个位置来处理请求。对于写入命令,data_buf_addr是包含要写入外部存储器的源数据的缓冲区中的地址。对于读取命令,data_buf_addr是从外部存储器接收读取数据的缓冲区中的地址。处理请求时,核心会回复此地址。

写命令信号

本机接口有内存控制器正在处理写命令时使用的信号(1-78 )。这些信号连接到用户设计中缓冲区的控制,地址和数据信号。

1-78         本地接口写入命令信号

信号

方向

描述

wr_data [2 × nCK_PER_CLK × PAYLOAD_WIDTH - 10]

输入

这是写命令的输入数据。

wr_data_addr [DATA_BUF_ADDR_WIDTH - 10]

产量

该输出为写入命令提供源数据缓冲区的基地址。

wr_data_mask [2 × nCK_PER_CLK × DATA_WIDTH / 8-10]

输入

该输入为写入数据提供字节使能。

wr_data_en

产量

该输出指示存储器接口正从数据缓冲器读取写入命令的数据。

wr_data_offset [00]

产量

该输出为写入命令提供源数据缓冲区的偏移量。

wr_data

该总线是需要写入外部存储器的数据。该总线可以连接到用户设计中缓冲区的数据输出。

wr_data_addr

当提交当前写入请求时,该总线是data_buf_addr 的回。所述wr_data_addr 总线可以与结合wr_data_offset 信号和施加到在用户设计一个缓冲区的地址输入。

wr_data_mask

该总线是当前正在写入外部存储器的数据的字节使能(数据屏蔽)。当相应的wr_data_mask 信号无效时写入存储器的字节。wr_data_en

置位时,该信号表明内核正在从用户设计中读取写入命令的数据。该信号可以与用户设计中的缓冲器的芯片选择相关联。 wr_data_offset

当突发长度需要多个单周期完成时,该总线用于逐步通过数据缓冲区。该总线与wr_data_addr 结合,可以应用于用户设计中缓冲区的地址输入。

阅读命令信号

当内存控制器正在处理读命令时,本地接口提供一组信号(1-79 )。这些信号与处理写入命令的信号相似,不同之处在于它们将数据从存储设备传送到用户设计中的缓冲区。

1-79         本地接口读取命令信号

信号

方向

描述

rd_data [2 × nCK_PER_CLK × PAYLOAD_WIDTH - 10]

产量

这是读取命令的输出数据。

rd_data_addr [DATA_BUF_ADDR_WIDTH - 10]

产量

该输出为读命令提供目标缓冲区的基地址。

rd_data_en

产量

该输出表明有效的读数据在rd_data总线上可用。

rd_data_offset [10]

产量

该输出为读命令提供目标缓冲区的偏移量。

rd_data

该总线是从外部存储器读取的数据。它可以连接到用户设计中缓冲区的数据输入。

rd_data_addr

当提交当前读取请求时,该总线是data_buf_addr 的回。该总线可以与rd_data_offset 信号组合使用,并在用户设计中应用于缓冲区的地址输入。

rd_data_en

该信号指示何时读取请求的rd_data 有效读取数据可用。它可以与用户设计中的缓冲器的芯片选择和写入启用相关联。

rd_data_offset

当突发长度需要多个单周期完成时,该总线用于逐步通过数据缓冲区。该总线可以与rd_data_addr 结合使用,并应用于用户设计中缓冲区的地址输入。

本地接口维护命令信号

1-80 列出了本地接口维护命令信号。

1-80          本地接口维护命令信号

信号

方向

描述

app_sr_req

 输入

该输入被保留并且应该被绑定到0

app_sr_active

 产量

该输出保留。

app_ref_req

 输入

此高电平有效输入请求发送刷新命令给

DRAM

app_ref_ack

 产量

该高电平有效输出表示存储器控制器已将请求的刷新命令发送到PHY接口。

app_zq_req

 输入

该高电平有效输入请求向DRAM发出ZQ校准命令。

app_zq_ack

 产量

此高电平有效输出表示存储器控制器已将请求的ZQ校准命令发送到PHY接口。

app_ref_req

置位时,此高电平有效输入请求存储控制器向DRAM发送刷新命令。它必须脉冲一个周期才能发出请求,然后至少在app_ref_ack 信号被断言以确认请求并指示它已发送之前解除置位。

app_ref_ack

置位时,该高电平有效输入确认刷新请求,并指示该命令已从存储器控制器发送至PHY

app_zq_req

置位时,该高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。它必须脉冲一个周期才能发出请求,然后至少在app_zq_ack 信号被断言以确认请求并指示它已被发送之前解除置位。

app_zq_ack

置位时,该高电平有效输入确认ZQ校准请求,并指示该命令已从存储器控制器发送至PHY

时钟建筑

PHY设计要求使用PLL模块来生成各种时钟,并且全局和本地时钟网络都用于在整个设计中分配时钟。PHY还需要一个与PLL相同的MMCM。该MMCM补偿BUFGPHY的插入延迟。

时钟生成和分配电路和网络驱动PHY内的块,大致可分为四个独立的通用功能:

•       内部(FPGA)逻辑

•       写路径(输出)I / O逻辑

•       读取路径(输入)并延迟I / O逻辑

•       IDELAY参考时钟(200 MHz

PHY需要一个MMCM和一个PLLPLL用于生成大多数内部逻辑的时钟,相位器的频率参考时钟以及在多I / O bank实现中保持PHY控制模块同步所需的同步脉冲。

对于400 MHz933 MHz之间的DDR3 SDRAM时钟频率,相位器参考时钟频率与存储器时钟频率相同。对于400 MHz以下的DDR2DDR3 SDRAM时钟频率,其中一个移相器频率参考时钟以与存储器时钟相同的频率运行,第二个频率参考时钟必须是存储器时钟频率的2倍或4倍,以满足范围要求400 MHz933 MHz。两个相位器参考频率必须由相同的PLL产生,因此它们彼此同相。时钟架构的框图如图1-50 所示。freq_refclk的相位根据工作频率和选择用于存储器接口引脚的存储体而变化。

•       GUI中选择HP存储区时,如果存储频率≥400 MHz,则相位为337.5

•       当选择HP存储库用于GUI中的存储器接口引脚并且存储频率在200-400 MHz(不包括400 MHz)时,相位为315

•       对于在GUI中存储器接口引脚选择HP存储区且存储频率≥400 MHz 时的低压器件,相位为337.5

•       对于低压设备,如果在GUI中为存储器接口引脚选择了HP存储体,并且存储频率在200-400 MHz之间(不包括400 MHz),则相位为

0

•       如果在GUI中选择HR存储器接口引脚的HR存储区并且存储频率≥400 MHz,则相位为337.5

•       当在GUI中为存储器接口引脚选择HR库时,存储器频率在200-400 MHz(不包括400 MHz)之间时,相位为0

PLL乘(M)和除(D)值的默认设置是系统时钟输入频率等于存储器时钟频率。这个11的比例是不需要的。PLL输入分频器(D)可以是7系列FPGA时钟资源用户指南UG472[参考9]列出的任何值。只要满足PLLE2操作条件并且遵守这里列出的其他约束条件即可。PLL乘法(M)值必须介于116之间(含)。对于800 Mb / s及以上,内存时钟的PLL输出分频器(O)必须为2,而对于400800 Mb / s,则必须为4PLL VCO频率范围必须保持在硅数据手册中指定的范围内。sync_pulse必须是mem_refclk频率的1/16,并且必须具有1/166.25%的占空比。有关PLL物理布局和系统时钟CCIO输入的信息,请参见设计指南,第181

 

内部(FPGA)逻辑时钟

内部FPGA逻辑由DDR2DDR3 SDRAM时钟频率的一半或四分之一频率的全局时钟资源提供时钟,这取决于在MIG中选择的4121模式。该PLL还输出高速DDR2DDR3内存时钟。

写路径(输出)I / O逻辑时钟

包含数据和控件的输出路径由PHASER_OUT定时。PHASER_OUT为每个字节组向OUT_FIFOOSERDES / ODDR提供同步时钟。PHASER_OUT为其关联的字节组生成一个字节时钟(OCLK),一个分割字节时钟(OCLKDIV)和一个延迟字节时钟(OCLK_DELAYED)。这些时钟直接由频率基准时钟产生,并且彼此同相。字节时钟与频率参考时钟频率相同,分频字节时钟频率为频率参考时钟的一半。OCLK_DELAYED用于为DQS ODDR 提供时钟,以实现写入DQS 与其相关DQ 之间所需的90°相位偏移位。PHASER_OUT还驱动写入期间生成DQS 所需的信号 ,与数据字节组相关的DQS DQ 3状态以及字节组的OUT_FIFO的读取使能。地址/控制的时钟细节和使用PHASER_OUT的写路径如图1-56 1-58所示

读取路径(输入)I / O逻辑时钟

输入读数据通路由PHASER_IN模块提供时钟。PHASER_IN块为每个字节组提供同步时钟给IN_FIFOIDDR / ISERDESPHASER_IN模块接收关联字节组的DQS 信号,并为DDR2DDR3 SDRAM数据采集生成两个延迟时钟:读字节时钟(ICLK)和读分字节时钟(ICLKDIV)。ICLK是频率参考时钟的延迟版本,与相关的DQS 相位一致。ICLKDIV用于将数据捕获到ISERDES中的第一级触发器中。ICLKDIVICLK保持一致,是ISERDES中最后一批触发器的并行传输时钟。ICLKDIV还用作与字节组关联的IN_FIFO的写入时钟。PHASER_IN块还驱动字节组的IN_FIFO的写入使能(WrEnable)。使用PHASER_IN的读取路径的时钟细节如图1-58 所示。

IDELAY参考时钟

必须向IDELAYCTRL模块提供200 MHz IDELAY时钟。IDELAYCTRL模块持续校准I / O区域中的IDELAY元素,以应对变化的环境条件。IP内核假定外部时钟信号正在驱动IDELAYCTRL模块。如果PLL时钟驱动IDELAYCTRL输入时钟,则需要将PLL锁定信号合并到IODELAY_CTRL.v 模块内的rst_tmp_idelay 信号中。

这确保了在使用之前时钟稳定。

内存控制器

在核心默认配置中,内存控制器(MC)位于UI块和物理层之间。这是在描绘1-51 

存储器控制器是存储器接口的主要逻辑块。内存控制器接收来自UI的请求并将它们存储在逻辑队列中。可以对请求进行重新排序以优化系统吞吐量和延迟。

内存控制器块被组织为四个主要部分:

•       可配置数量的银行机器

•       可配置数量的等级机器

•       列机器

•       一个仲裁块

银行机器

大部分内存控制器逻辑驻留在银行机器中。银行机器对应于DRAM银行。给定的银行机器在任何给定时间管理单个DRAM银行。但是,银行机器分配是动态的,因此不必为每个实体银行设置银行机器。银行的数量可以配置为在区域和性能之间进行折衷。预充电政策部分对此进行了更详细的讨论。

银行机器分配给特定DRAM组的持续时间与用户请求相耦合,而不是目标DRAM组的状态。当请求被接受时,它被分配给银行机器。当请求完成时,银行机器被释放并且可用于分配到另一个请求。银行机器发出完成请求所需的所有命令。

代表当前的请求,银行机器必须生成行命令和列命令来完成请求。行和列命令是独立的,但必须符合DRAM时序要求。

以下简化的例子说明了这个概念。考虑当单个请求到达时内存控制器和DRAM空闲的情况。游泳池的银行机器:

1.      接受你的请求

2.      激活目标行

3.      发出列(读取或写入)命令

4.      预充电目标行

5.      返回到闲置的银行机器池

当多个请求到达不同的行或银行时,类似的功能适用。

现在考虑一个请求到达的情况,目标是一个开放的DRAM银行,由一个已经活跃的银行机器管理。已经激活的银行机器识别新的请求以同一DRAM存储区为目标并跳过预充电步骤(步骤)。位于闲置池头部的银行机器接受新的用户请求并跳过激活步骤(步骤)。

最后,当请求全部到达同一个目标DRAM存储区时,前一请求和后一请求都到达,控制器将跳过激活(步骤)和预充电(步骤)的操作。

银行机器尽可能快地为DRAM银行预充电,除非另一个待处理的请求指向同一银行。预充电政策部分对此进行了更详细的讨论。

为了优化存储器接口吞吐量,列命令可以重新排序。排序算法名义上确保数据一致性。重新排序” 部分详细介绍了重新排序功能。

排名机器

等级机器对应于DRAM等级。排名机器监控银行机器的活动并跟踪排名或设备特定的时间参数。例如,排名机器监视在时间窗口内发送给排名的激活命令的数量。在发送了允许的激活次数之后,等级机器产生禁止信号,该禁止信号防止银行机器发送任何进一步的激活到等级,直到时间窗口足够地移动以允许更多的激活。等级机器被静态分配给物理DRAM等级。

柱机

单列机器生成管理DQ数据总线所需的定时信息。虽然可以有多个DRAM等级,但由于存在单个DQ总线,所有DRAM等级中的所有列都作为一个单元进行管理。列机器监视银行机器发出的命令,并产生禁止信号返回银行机器,以便有序地使用DQ总线。

仲裁块

仲裁模块接收从银行机器发送命令到DRAM阵列的请求。行命令和列命令是独立仲裁的。对于每个命令机会,仲裁器块选择一行和一列命令以转发到物理层。仲裁块实施循环协议以确保前进。

重新排序

DRAM访问被分成两个准独立部分,即行命令和列命令。每个请求占用一个逻辑队列条目,并且每个队列条目都有一个关联的银行机器。这些银行机器跟踪当前绑定的DRAM等级或银行的状态(如果有的话)。

如有必要,银行机器将尝试代表当前请求激活正确的排名,银行或行。在这样做的过程中,银行机器查看DRAM的当前状态以确定是否满足各种时序参数。最终,所有时间参数都得到满足,并且银行机器进行仲裁以发送激活。仲裁以简单的循环方式完成。仲裁是必要的,因为多个银行机器可能会同时请求发送行命令(激活和预充电)。

并非所有请求都需要激活。如果先前的请求激活了相同的排名,银行或行,则后续请求可能会继承银行机器状态并避免预充/激活罚款。

在必要的等级,银行或行被激活并且满足RASCAS延迟时间之后,银行机器尝试发出CAS-READCAS-WRITE命令。与行命令不同,所有请求都会发出CAS命令。在仲裁发送CAS命令之前,银行机器必须查看DRAM的状态,DQ总线的状态,优先级和顺序。最终,所有这些因素都假定它们有利的状态,并且银行机器仲裁以发送CAS命令。以类似于行命令的方式,循环法仲裁器使用优先级方案并选择下一列命令。

循环仲裁者本身是重新排序的来源。假设例如一个空闲的存储器控​​制器在处理刷新时接收到一连串的新请求。这些请求排队并等待刷新完成。在DRAM准备好接收新的激活之后,所有等待请求同时断言它们的仲裁请求。仲裁器独立于请求顺序,仅基于其循环算法选择要发送的下一个激活。列命令可以观察到类似的行为。

控制器支持三种排序模式:

•       STRICT - 在此模式下,控制器始终按照在本机界面接收到的确切顺序向内存发出命令。这种模式适用于无法从重新排序中获益并且需要最低延迟的情况。由于读取的数据按顺序恢复,因此可能不需要用户界面层,从而减少延迟。该模式对调试也很有用。

•       NORM - 在此模式下,控制器重新排序读取但不写入以提高效率。所有的写入请求都是在请求顺序中相对于所有其他写入请求发出的,并且给定排名存储区内的请求按顺序退出。这确保了在先前的写入完成之前无法观察稍后写入的结果。

注意: 此重新排序仅在本地界面中可见。用户界面将读取请求重新排列回原始请求顺序。

•       轻松 -这是控制器的最有效的方式。可以根据需要对写入和读取进行重新排序,以实现排名库队列之间的最大效率。因此在这种模式下,可以观察写入的重新排序。但是,这种行为在用户界面层是不可观察的,因为这些请求在排序库中按顺序退出,并且用户界面层按顺序返回读取请求。因此建议使用RELAXED模式与用户界面层一起使用。

预充电政策

控制器执行积极的预充电策略。当每个事务完成时,控制器检查请求的输入队列。如果当前打开的银行/行的队列中没有请求,则控制器关闭该请求以最小化对银行中其他行的请求延迟。因为队列深度等于银行机的数量,所以通过增加银行机的数量(nBANK_MACHS)可以获得更高的效率。随着这个数量的增加,FPGA逻辑时序变得更具挑战性。在某些情况下,随着银行机器数量的增加和内存时钟频率的降低,整体系统效率会更高。应使用目标设计命令行为来执行仿真,以确定最佳设置。

错误更正代码

内存控制器可选地实现纠错码(ECC)。该代码保护DRAM阵列的内容免受损坏。使用单个错误正确的双重错误检测(SECDED)代码。所有单个错误都会被检测并更正。检测到两位的所有错误。超过两位的错误可能会或可能不会被检测到。

ECC框图如图1-52 所示。这些块在存储器控制器(mc.v )模块中实例化。

ECC模式是可选的,仅支持72位数据宽度。当启用ECC模式时,数据掩码功能被禁用。当启用ECC模式时,总是写入整个DQ宽度。DRAM DM位不能使用,因为ECC在整个DQ数据宽度上运行。称为ECC的顶级参数控制ECC逻辑的添加。当此参数设置为“ON”时,ECC被启用,并且当参数设置为“OFF”时,ECC被禁用。

ECC功能被实现为三个功能块。写入数据合并和ECC生成块。一个读数据ECC解码和正确的块以及一个数据缓冲块,用于临时保存读取 - 修改 - 写入周期的读取数据。第四块生成ECC H矩阵并将这些矩阵传递给ECC生成和校正块。

对于完整突发写入命令,从写入数据缓冲器中获取的数据遍历ECC合并并生成块。该块计算ECC位并将它们附加到数据中。ECC产生步骤给出一个CLK状态。因此,与ECC未启用时相比,数据必须从写入数据缓冲器提前一个状态相对于写入命令获取。在用户界面级别,必须在将命令写入命令​​缓冲区后不迟于一个状态将数据写入写入数据缓冲区。除早期的数据要求外,ECC不会为写入带来其他性能损失。

对于读取周期,所有数据都会遍历ECC解码修复(ecc_dec_fix )块。当PHY指示phy_rddata_valid 信号的读数据可用性时,该过程开始。解码修复过程分为两个CLK状态。在第一种状态下,计算出综合征。在第二种状态下,对综合征进行解码并执行任何指示的比特翻转(校正)。同样在第二状态中,ecc_single ecc_multiple 指示是基于由存储控制器核心逻辑产生的校正子位和定时信号ecc_status_valid 来计算的。核心逻辑还提供了一个ecc_err_addr总线。该总线包含当前读命令的地址。通过查看ecc_single ecc_multiple ecc_err_addr 总线可以记录错误位置。ECC对读取请求施加了两种状态延迟惩罚。-修改-

小于全部DRAM突发的任何写入都必须作为读 - 修改 - 写周期来执行。必须读取指定位置,如果执行任何更正,与写入数据合并,计算ECC,然后写回到DRAM阵列。wr_bytes命令是为ECC操作定义的。当给出wr_bytes命令时,存储器控制器总是执行读 - 修改 - 写周期而不是简单的写周期。字节使能必须始终有效,即使是简单的命令。具体而言,当启用ECC模式时,必须为所有wr命令声明所有字节使能。要部分写入内存,app_wdf_mask需要与ECC启用设计的wr_bytes命令一起驱动。1-81 显示了启用ECC模式时的可用命令。

                 1-81       app_cmd [20]的命令

手术

app_cmd [20]代码

000

001

写字节

011

当给出wr_bytes命令时,存储器控制器执行读 - 修改 - 写(RMW)周期。当wr_bytes命令位于队列头部时,它首先发出读取。但与正常的读命令不同,请求保留在队列中。在读响应队列中设置一个位,指示这是一个RMW周期。当读取数据返回该读取命令时,app_rd_data_valid未被声明。相反,ECC被解码,如果有任何更正,则数据被写入ECC数据缓冲器。同时,原始的wr_bytes命令正在检查所有读取的返回值。基于存储在读取返回队列中的data_buf_addrwr_bytes请求可以确定其读取数据何时在ECC数据缓冲区中可用。现在,wr_bytes请求开始仲裁以发送写入命令。当命令被授予时,

wr_bytes命令的性能明显低于正常写入命令。在最好的情况下,每个wr_bytes命令都需要一个DRAM读取周期和一个DRAM写入周期,而不是简单的DRAM写入周期。读写和写入读取周转惩罚进一步降低吞吐量。

内存控制器最多可缓冲nBANK_MACHS wr_bytes命令。只要这些命令在等级库上不冲突,内存控制器就将读取和写入串起来,避免了大部分的读写和写入读取周转惩罚。但是,如果wr_bytes命令流到一个单独的rank-bank,则每个RMW周期将被完全序列化,并且吞吐量会显着降低。

1-82 提供了用户界面上ECC端口的详细信息。

1-82        ECC操作的用户界面

信号

方向

描述

app_correct_en_i

输入

置位时,该高电平有效信号纠正单位数据错误。该输入仅在启用ECC模式时有效。

app_ecc_multiple_err [70]

产量

该信号适用于启用ECC的情况。它与app_rd_data_valid一起有效。如果来自外部存储器的读取数据在读取脉冲串的每个脉冲中有两个比特错误,则app_ecc_multiple_err信号是非零的。SECDED算法不会校正相应的读取数据,并在此信号上放置一个非零值,以通知用户界面上已损坏的读取数据。

该信号在21模式下为4位宽。

app_raw_not_ecc_i [70]

输入

当启用ECC_TEST“ON”)时,此信号适用。它与app_rd_data_valid一起有效。该信号被置位以控制各个块以ECC位中的原始数据写入。

该信号在21模式下为4位宽。

app_wdf_mask [APP_MASK_WIDTH - 10]

输入

该信号为app_wdf_data []提供掩码。

ECC自检功能

在正常操作条件下,写入DRAM阵列的数据的ECC部分在用户界面处不可见。这对于系统自检是有问题的,因为没有办法测试DRAM阵列中对应于ECC位的位。也没有办法发送错误来测试ECC生成和校正逻辑。

由顶级参数ECC_TEST控制,可以生成DRAM阵列测试模式。当ECC_TEST参数为“ON”时,DQ数据总线的整个宽度通过用户界面中的读取和写入缓冲区扩展。当ECC_TEST“ON”时,ECC校正启用被解除置位。

要将任意数据写入DRAM阵列的数据和ECC部分,将所需数据写入扩展宽度写入数据FIFO,并将数据置为相应的app_raw_not_ecc_i位。app_raw_not_ecc_i7位宽(21模式下是4位),允许在ECC位或正常计算的ECC位中使用原始数据写入各个ECC块。这样,可以将任意的模式写入DRAM阵列。

在读取界面中,扩展数据与正常数据一起出现。但是,校正器可能试图纠正读取的数据。在阵列模式测试中这可能不是所期望的,因此应将app_correct_en_i设置为零以禁用更正。

通过以上两项功能,可以实现阵列模式测试。可以通过写入数据模式来测试ECC生成逻辑,但不会声明app_raw_not_ecc_i并取消确认app_correct_en_i。数据和计算出的ECC位可以被读出并进行比较。ECC解码正确的逻辑可以通过断言app_correct_en_i并如上所述写入所需的原始模式来测试。当数据被读回时,可以观察到解码正确的操作。

PHY

PHY为外部DDR2DDR3 SDRAM提供物理接口。PHY产生连接到存储设备所需的信号时序和顺序。它包含时钟,地址和控制生成逻辑,写入和读取数据路径以及上电后初始化SDRAM的状态逻辑。此外,PHY包含校准逻辑,以执行读写数据路径的定时训练,以考虑系统静态和动态延迟。

PHY是作为DDR2DDR3 SDRAM的单个HDL代码库提供的。MIG工具通过包含在XDC文件中的顶级HDL参数和约束来定制SDRAM类型和众多其他设计特定参数。

整体PHY架构

7系列FPGA PHY由专用模块和软校准逻辑组成。通过背靠背互连将专用块彼此相邻构建,以最小化构建高性能物理层所需的时钟和数据路径路由。称为字节组时钟的I / O bank内的专用时钟结构有助于最大限度地减少由字节组时钟驱动器驱动的负载数量。字节组时钟由移相器模块驱动。相位器模块(PHASER_INPHASER_OUT)是多级可编程延迟线环路,可以动态跟踪DQS信号变化并提供精确的相位调整。

每个7系列FPGA I / O bank都有专用模块,包括一个PHY控制模块,四个

PHASER_INPHASER_OUT块,四个IN / OUT_FIFOIOLOGICISERDESOSERDESODDRIDELAY)和IOB。一个I / O bank中存在四个字节组,每个字节组包含PHASER_INPHASER_OUTIN_FIFOOUT_FIFO以及十二个IOLOGICIOB块。一个字节组中的十个IOI中的十个用于DQDM位,另外两个IOI用于实现差分DQS信号。1-53 显示了单个I / O bank中可用的专用块。单个PHY控制块与I / O bank内的全部四个PHASER_INPHASER_OUT块进行通信。

存储器控制器和校准逻辑与慢速时钟域中的专用PHY进行通信,该时钟域可以是除以4或除以2的版本

DDR2DDR3内存时钟。PHY设计的框图如图1-54 所示。

 

存储器初始化和校准序列

在系统复位失效后,PHY执行所需的内存上电初始化序列。接下来是写入和读取数据路径的多个时序校准阶段。校准完成后,PHY指示初始化完成,并且控制器可以开始向存储器发出命令。

1-55的校准阶段对应于以下部分:

•       内存初始化,第134

•       PHASER_IN锁相,第135

•       PHASER_IN DQSFOUND校准,第135

•       写入均衡,第136

•       多用途寄存器读取调节,第139

•       OCLKDELAYED校准,第140

•       写入校准,第141

•       阅读调平,第143

•       PRBS读取调整,第146

•       动态校准和定期读取行为,第146

I / O架构

每个7系列FPGA I / O bank都有专用模块,包括一个PHY控制模块,四个

PHASER_INPHASER_OUT块,四个IN / OUT_FIFOISERDESOSERDESODDRIDELAYIOB。单个PHY控制块与I / O bank内的全部四个PHASER_INPHASER_OUT块进行通信。

PHY控制块

PHY控制模块是中央控制模块,用于管理FPGA逻辑和专用PHY之间的数据和控制信息流。这包括控制IN / OUT_FIFOISERDES / OSERDES之间的地址,命令和数据流以及控制PHASER_INPHASER_OUT块。PHY控制模块以缓慢的频率(DDR2DDR3 SDRAM时钟的1/4频率)PHY_Clk速率从校准逻辑或存储控制器接收控制字,并以DDR2DDR3 SDRAM时钟速率(CK 频率)。

校准逻辑或存储器控制器通过将地址,命令和数据(用于写入命令)写入到DDR2DDR3 SDRAM命令序列中来启动

IN / OUT_FIFO,同时或随后将PHY控制字写入PHY控制模块。PHY控制字定义了PHY控制块启动执行DDR2DDR3 SDRAM命令所执行的一组操作。

PHY控制模块为其I / O bank内的字节组块提供控制接口。当需要多I / O bank实现时,给定I / O bank中的每个PHY控制块控制该bank中的字节组元素。这要求PHY控制块与其相邻的PHY控制块保持同相。中央PHY控制模块被配置为三个I / O bank实施的主控制器。对于两个银行实施,可以将任一PHY控制块指定为主控制器。

PHY控制接口由校准逻辑或存储器控制器用于将PHY控制字写入PHY。该接口中的信号与PHY_Clk同步,如1-83所示。这是一个基本的FIFO式界面。当PHY_Ctl_WrEn为高且PHY_Ctl_Full为低时,在PHY_Clk的上升沿将控制字写入控制字FIFO。对于多I / O bank PHY,必须将相同的控制字写入每个PHY控制模块才能正常工作。

1-83        PHY控制接口

信号

方向

描述

PHY_CLK

输入

这是控制字FIFOPHY接口时钟。PHY控制字信号在该时钟的上升沿捕获。

PHY_Ctl_Wr_N

输入

该低电平有效信号是控制字FIFO的写使能信号。当该信号有效时,控制字在PHY_Clk的上升沿写入控制字FIFO

PHY_Ctl_Wd [310]

输入

这是1-84描述的PHY控制字。

PHY_Ctl_Full

产量

该高电平有效输出是控制字FIFO的完整标志。它表明FIFO不能再接受控制字和块写入控制字FIFO

PHY_Ctl_AlmostFull

产量

该高电平有效输出是控制字FIFO的几乎满标志。它表示只要PHY_Ctl_Full信号无效,FIFO就可以接受不超过一个附加控制字。

PHY_Ctl_Ready

产量

PHY控制模块准备好开始接收命令时,该高电平有效输出置位。

PHY控制字分为几个字段,如1-84 所示。

1-84        PHY控制字

3

1

3

0

2

9

2

8

2

7

2

6

2

2

4

2

3

2

2

2

1

2

0

1

9

1

8

1

7

1

6

1

1

4

1

3

1

2

1

1

1

0

9

8

7

6

4

3

2

1

0

Act Pre

事件延迟

CAS插槽

SEQ

 

数据偏移

 

保留ved

低指数

AUX_OUT

控制偏移

PHY Cmd

•       PHY命令 - 该字段定义了PHY控制模块为管理通过专用PHY的命令和数据流而采取的操作。PHY命令是:

°写入(Wr - 0x01  - 该命令指示PHY控制模块读取地址,命令和数据OUT_FIFO,并将从这些FIFO读取的数据传输到与其关联的IOI

°读(Rd - 0x03  - 该命令指示PHY控制模块读取地址,命令OUT_FIFO,并将从这些FIFO中读取的数据传输到与其关联的IOI。另外,从存储器读取的数据在从数据IOI到达数据IN_FIFO之后被传送。

°       非数据(ND - 0x04  - 该命令指示PHY控制模块读取地址和命令OUT_FIFO,并将从这些FIFO读取的数据传输到其相关的IOI

•       控制偏移量 - 此字段用于控制何时读取地址和命令IN / OUT_FIFO并将其传输到IOI。控制偏移量以DDR2DDR3 SDRAM时钟周期为单位。

•       辅助输出 - 该字段用于控制何时使用辅助输出信号(Aux_Output [30])。辅助输出可以配置为在读取和写入命令期间激活。定时偏移和持续时间由1-85,第128页中描述的属性控制。这些输出不被MIG工具生成的DDR2DDR3接口使用它们被设置为0

•       低索引(Bank - 专用PHY具有内部计数器,需要此字段指定用于数据命令的八个DDR2DDR3 SDRAM存储区中的哪一个。MIG IP内核不使用这些内部计数器因此,该字段应该全部为零。

•       保留 - 该字段必须始终设置为2'b00 

•       数据偏移量 - 此字段用于根据PHY命令控制何时读取或写入数据IN / OUT_FIFO。数据偏移量以DDR2DDR3 SDRAM时钟周期为单位。

•       Seq - 该字段包含一个序列号,与 来自PLL Sync_In 控制信号结合使用,以保持两个或更多PHY控制块执行从各自控制队列读取的命令同步。具有给定seq值的命令必须在Seq字段指定的特定阶段期间由PHY控制块内的命令解析器执行。

•       CAS插槽 - 存储器控制器用于写入/读取(CAS)命令的插槽号。

•       事件延迟 - 专用PHY具有内部计数器,需要此字段指定加载到这些计数器的延迟值。事件延迟以DDR2DDR3 SDRAM时钟周期为单位。MIG IP内核不使用这些内部计数器因此,该字段应该全部为零。

•       激活预充电 - 专用PHY的内部计数器需要此字段指定与事件延迟计数器相关的DDR2DDR3命令的类型。有效值是:

                        °       00:无动作

                        °       01:激活

                        °       10:预充电

                        °        11:预充/激活。

MIG IP内核不使用这些内部计数器因此,该字段应该全部为零。

1-85        辅助输出属性

属性

类型

描述

MC_AO_WRLVL_EN

矢量[30]

该属性指定在PC_Enable_Calib [1]信号指定的写入均衡期间相关的Aux_Output是否处于活动状态。例如,此属性指定写入均衡期间ODT是否处于活动状态。

WR_CMD_OFFSET_0

矢量[50]

此属性指定在执行相关写命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。例如,该属性可确保ODT信号在正确的时钟周期内生效,以符合JEDEC ODTLonODTLoff规范。

WR_DURATION_0

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在写入命令中保持活动状态的时间。例如,该属性可确保ODT信号在正确的时钟周期内生效,以符合JEDEC ODTLonODTLoff规范。

RD_CMD_OFFSET_0

矢量[50]

该属性指定在执行关联的读命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

RD_DURATION_0

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在读取命令中保持活动的时间。

WR_CMD_OFFSET_1

矢量[50]

此属性指定在执行相关写命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

WR_DURATION_1

矢量[50]

此属性指定DDR2DDR3 SDRAM时钟周期内辅助输出在写入命令中保持有效的时间。

RD_CMD_OFFSET_1

矢量[50]

该属性指定在执行关联的读命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

RD_DURATION_1

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在读取命令中保持活动的时间。

WR_CMD_OFFSET_2

矢量[50]

此属性指定在执行相关写命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

WR_DURATION_2

矢量[50]

此属性指定DDR2DDR3 SDRAM时钟周期内辅助输出在写入命令中保持有效的时间。

RD_CMD_OFFSET_2

矢量[50]

该属性指定在执行关联的读命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

RD_DURATION_2

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在读取命令中保持活动的时间。

WR_CMD_OFFSET_3

矢量[50]

此属性指定在执行相关写命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

WR_DURATION_3

矢量[50]

此属性指定DDR2DDR3 SDRAM时钟周期内辅助输出在写入命令中保持有效的时间。

1-85         辅助输出属性 (续)

属性

类型

描述

RD_CMD_OFFSET_3

矢量[50]

该属性指定在执行关联的读命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

RD_DURATION_3

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在读取命令中保持活动的时间。

CMD_OFFSET

矢量[50]

此属性指定执行相关命令后DDR2DDR3 SDRAM时钟周期中由AO_TOGGLE定义的辅助输出切换的时间。

AO_TOGGLE

矢量[30]

该属性指定哪些辅助输出处于切换模式。在CMD_OFFSET过期后,在PHY控制字中将相关的AO位置1时,反转模式下的辅助输出会反转。

PHY控制模块有多个未启用的计数器,因为在PHY_ClkDDR2DDR3 SDRAM时钟频率的1/41/2频率时使用同步模式。

PHY_Clk的每个上升沿,一个PHY控制字被发送到PHY控制模块,其中有四个存储器时钟周期值的命令和一个2Seq计数值。在同步操作模式下,对控制FIFO的写入使能始终置为有效,并且在有效命令之间不发出操作(NOP)命令。Seq计数必须每增加4个命令序列。Seq字段用于同步跨多个I / O bankPHY控制块。

DDR3 SDRAM RESET_N 信号直接由FPGA逻辑控制,而不是PHY控制字。RDIMM接口的DDR2 SDRAM RESET_N 信号直接由FPGA逻辑控制,而不是PHY控制字。PHY控制模块与PHASER_OUT一起,在读取和写入命令期间生成写入DQSDQ / DQS 3态控制信号。

PHY cmd字段是根据四个命令的序列是否具有写入,读取或者两者都不是。如果在命令序列中存在写入请求,PHY cmd字段被设置为写入。如果在命令序列中有读取请求,则它被设置为读取,并且如果在命令序列中既没有写入请求,也没有读取请求,则它被设置为非数据。写入和读取请求不能在四个命令序列中发出。PHY控制字中的控制偏移字段定义何时读取命令OUT_FIFO并将其传输到IOLOGIC。数据偏移量定义何时读取数据OUT_FIFO相对于正在读取的命令OUT_FIFO。对于读取命令,数据偏移在校准期间确定。

命令路径

校准逻辑或存储控制器请求的命令作为PHY控制字发送到PHY控制模块并同时输入到PHY控制模块

地址/控制/命令OUT_FIFO。由于每个PHY_Clk周期需要四个存储器时钟周期,所以每个地址/控制/命令信号必须具有四个存储器时钟周期的值。

有三种类型的命令:

•       使用自动预充电写入命令,包括写入和写入。这两个写命令的PHY控制字中的PHY命令值是相同的(0x01 )。不同的是输入到OUT_FIFO的地址值。在地址OUT_FIFO中使用自动预充电进行写入时,地址位A101

•       使用自动预充电读取命令,包括读取和读取。这两个读命令的PHY控制字中的PHY命令值是相同的(0x11 )。不同的是输入到OUT_FIFO的地址值。地址位A101,用于在地址OUT_FIFO中进行自动预充电。

•       非数据命令,包括模式寄存器设置,刷新,预充电,预充所有存储区,激活,不操作,取消选择,ZQ校准长和ZQ校准短。所有这些命令的PHY控制字中的PHY命令值是相同的

0x100 )。输入到与这些命令关联的OUT_FIFO RAS_N CAS_N WE_N ,库地址和地址值不同。

1-56 显示了地址/控制/命令路径的框图。OSERDES用于单数据速率(SDR)模式,因为地址/控制/命令是SDR 信号。PHY控制字符合PHY_Ctl_Wr_N 信号,OUT_FIFO符合PHY_Cmd_WrEn 信号。FPGA逻辑无需在PHY控制块的有效命令之间的长时间等待期间发出NOP命令,因为地址/命令专用PHY中的默认值可根据需要设置为

 

OUT_FIFO输出到FPGA引脚的地址/命令路径的时序图如图1-57 所示。

 

数据路径

数据路径包含写入和读取数据路径。7系列FPGA中的数据通路完全采用专用逻辑实现,IN / OUT_FIFO连接FPGA逻辑。除了时钟域交叉之外,IN / OUT_FIFO还提供数据通路串行化/解串行,从而允许FPGA逻辑在DDR2DDR3 SDRAM时钟的1/4频率的低频下工作。1-58 显示了数据路径的框图。

 


 

信号

方向

描述

app_addr [ADDR_WIDTH - 10]

输入

该输入指示当前请求的地址。

app_cmd [20]

输入

该输入选择当前请求的命令。

app_en

输入

这是app_addr []app_cmd [20]app_szapp_hi_pri输入的高有效选通。

app_rdy

输出

此输出表明UI已准备好接受命令。如果在启用app_en时取消断言信号,则必须重试当前的app_cmdapp_addr,直到app_rdy被声明为止。

app_hi_pri

输入

该高电平有效输入提升当前请求的优先级。

app_rd_data

[APP_DATA_WIDTH - 10]

输出

这提供了读命令的输出数据。

app_rd_data_end

输出

该高电平有效输出表明当前时钟周期是app_rd_data []上输出数据的最后一个周期。

app_rd_data_valid

输出

active-High输出表明app_rd_data []是有效的。

app_sz

输入

该输入被保留并且应该被绑定到

app_wdf_data

[APP_DATA_WIDTH - 10]

输入

这提供了写入命令的数据。

app_wdf_end

输入

这个高电平有效输入表明当前时钟周期是app_wdf_data []上输入数据的最后一个周期。

app_wdf_mask

[APP_MASK_WIDTH - 10]

输入

这提供了app_wdf_data []的掩码。

app_wdf_rdy

输出

该输出表明写入数据FIFO已准备好接收数据。写入数据在app_wdf_rdy = 1'b1 app_wdf_wren = 1'b1 时被接受。

app_wdf_wren

输入

这是app_wdf_data []的主动高频闪。

app_correct_en_i

输入

置位时,该高电平有效信号纠正单位数据错误。只有在GUI中启用ECC时,此输入才有效。

在示例设计中,该信号总是与1相关联。

app_sr_req

输入

该输入被保留并且应该被绑定到0

app_sr_active

输出

该输出保留。

app_ref_req

输入

该高电平有效输入请求向DRAM发出刷新命令。

app_ref_ack

输出

该高电平有效输出表示存储器控制器已将请求的刷新命令发送到PHY接口。

app_zq_req

输入

该高电平有效输入请求向DRAM发出ZQ校准命令。

app_zq_ack

输出

此高电平有效输出表示存储器控制器已将请求的ZQ校准命令发送到PHY接口。

ui_clk

输出

这个UI时钟必须是DRAM时钟的一半或四分之一。

init_calib_complete

输出

校准完成后,PHY断言init_calib_complete

app_ecc_multiple_err [70] 1

输出

该信号适用于启用了ECC并且与app_rd_data_valid一起有效的情况。如果来自外部存储器的读取数据在读取脉冲串的每个脉冲中具有两个比特错误,则app_ecc_multiple_err [30]信号非零。SECDED算法不会校正相应的读取数据,并在此信号上放置一个非零值,以通知用户界面上已损坏的读取数据。

ui_clk_sync_rst

输出

这是主动高UI重置。

 

 

input [27:0]       app_addr,

 input [2:0]       app_cmd,

 input             app_en,

 input [511:0]        app_wdf_data,

 input             app_wdf_end,

 input             app_wdf_wren,

 

   1-2         example_design/ rtl / traffic_gen目录中的文件

名称1

描述

memc_traffic_gen.v

这是流量发生器的顶层。

cmd_gen.v

这是命令生成器。该模块提供独立的控制来生成命令类型,地址和突发长度。

cmd_prbs_gen.v

这是一个伪随机二进制序列(PRBS)发生器,用于产生PRBS命令,地址和突发长度。

memc_flow_vcontrol.v

该模块在内存控制器内核和cmd_gen read_data_path write_data_path 模块之间生成流控制逻辑。

read_data_path.v

这是读取数据路径的顶层。

read_posted_fifo.v

该模块存储发送到存储控制器的读命令,其FIFO输出用于生成读数据比较的期望数据。

rd_data_gen.v

该模块为memc_flow_vcontrol.v 生成读取和就绪信号的时序控制。

write_data_path.v

这是写入数据路径的顶层。

wr_data_g.v

该模块为memc_flow_vcontrol.v 生成写入和准备信号的时序控制。

s7ven_data_gen.v

该模块生成不同的数据模式。

a_fifo.v

这是一个使用LUT RAM的同步FIFO

data_prbs_gen.v

这是一个用于生成PRBS数据码型的32位线性反馈移位寄存器(LFSR)。

init_mem_pattern_ctr.v

该模块为流量生成器生成流量控制逻辑。

traffic_gen_top.v

该模块是流量生成器的顶层,包含memc_traffic_gen init_mem_pattern_ctr 模块。

 

 

 

用户接口模块:
提出了用户设计的用户界面
提供了一个简单而又方便的替代本地接口
读取与写入数据缓冲
重新排序读取返回值,以匹配请求的顺序
提出了平面地址空间,并将其转换成SDRAM所需的地址


内存控制器模块:
接收来自用户设计的请求
重新排序请求,以尽量减少死状态,从而达到最高的SDRAM性能
管理SDRAM的row / rank配置
执行高级的SDRAM管理比如刷新、激活或预充电


物理层(PHY)模块:
通过一个简单的界面连接至内存控制器模块,同时将信号转换成实际的信号发送至SDRAM, 反之亦然
在多时钟域内转换和同步控制信号和数据
初始化SDRAM
执行DDR3写操作
执行时钟与读取数据的居中校准

 

修改示例设计

所提供的example_top设计包含流量生成器模块,并且可以进行修改以调整不同的命令和数据模式。可以在example_top.v vhd 模块中修改几个高级参数。1-11 描述了这些参数。

1-11          流量发生器参数在example_top模块中设置

参数

描述

家庭

指示家庭类型。

该参数的值是“VIRTEX7”

MEMORY_TYPE

指示内存控制器类型。

“DDR2”“DDR3”

nCK_PER_CLK

这是内存控制器时钟与DRAM时钟比率。

42(取决于在GUI中选择的PHY到控制器时钟比率)

NUM_DQ_PINS

这是总内存DQ总线宽度。

此参数支持从8到最大72DQ宽度,以8为增量。可用的最大DQ宽度取决于所选存储设备的频率。

MEM_BURST_LEN

这是内存数据突发长度。

这必须设置为8

MEM_COL_WIDTH

这是存储器列地址位的数量。

该选项基于选定的存储设备。

DATA_WIDTH

这是用户界面数据总线宽度。

对于nCK_PER_CLK = 4

DATA_WIDTH = NUM​​_DQ_PINS×8

ADDR_WIDTH

这是内存地址总线宽度。它等于RANK_WIDTH + BANK_WIDTH + ROW_WIDTH + COL_WIDTH

 

MASK_SIZE

此参数指定用户界面数据总线中的掩码宽度。

 

PORT_MODE

设置端口模式。

该参数的有效设置是:

BI_MODE:生成WRITE数据模式并监控READ数据以进行比较。

BEGIN_ADDRESS

设置内存起始地址边界。

该参数定义端口地址空间的起始边界。该值的最低有效位[30]被忽略。


 

参数

描述

END_ADDRESS

设置内存结束地址边界。

该参数定义端口地址空间的结束边界。该值的最低有效位[30]被忽略。

PRBS_EADDR_MASK_POS

设置32AND MASK位置。

该参数与PRBS地址生成器一起使用,将随机地址向下移入端口地址空间。END_ADDRESS值与该掩码中具有“ 的位位置的PRBS地址进行AND运算。

CMD_PATTERN

该参数设置要生成的命令模式电路。对于较大的设备,可将CMD_PATTERN设置为“CGEN_ALL”。该参数允许生成所有支持的命令模式电路。但是,有时候

由于较小的设备资源有限,因此必须限制特定的命令模式。

该信号的有效设置是:

•    CGEN_FIXED:地址,突发长度和指令直接来自fixed_addr_ifixed_bl_ifixed_instr_i输入。

•    CGEN_SEQUENTIAL:地址按顺序递增,增量由数据端口大小决定。

•    CGEN_PRBS32级线性反馈移位寄存器(LFSR)产生伪随机地址,突发长度和指令序列。种子可以从32cmd_seed输入设置。

•    CGEN_ALL(默认):该选项打开上述所有选项,并允许addr_mode_iinstr_mode_ibl_mode_i在运行时间内选择生成类型。

 

参数

描述

DATA_PATTERN

该参数设置要通过rtl逻辑生成的数据模式电路。对于较大的设备,

DATA_PATTERN可以设置为“DGEN_ALL”,从而可以生成所有支持的数据码型电路。在硬件中,使用vio_data_value_mode选择和/或更改数据模式。该模式只能在更改时才能更改

DATA_PATTERN被设置为DGEN_ALL

此参数的有效设置是:

•    ADDR(默认):地址用作数据模式。

•    HAMMER:在DQS的上升沿期间,所有s都在DQ引脚上,在DQS 的下降沿期间,所有s都在DQ引脚上。

•    WALKING1:步行s为对DQ管脚和的起始位置取决于地址值。

•    WALKING0:步进s位于DQ引脚上,起始位置取决于地址值。

•    NEIGHBOR:除一个DQ引脚外,所有DQ引脚均为Hammer模式。地址确定异常引脚位置。

•    PRBS32LFSR生成随机数据并以起始地址播种。

•    DGEN_ALL:该选项打开所有可用选项:

0x1:固定--32fixed_data

0x2ADDRESS - 32位地址作为数据。

0x3HAMMER

0x4SIMPLE8 - 简单8个数据模式,每8个字重复一次。

0x5WALKING1s - 步行1DQ引脚上。

0x6WALKING0s - 步行0位于DQ引脚上。

0x7PRBS - 32LFSR生成随机数据。

0x9:慢速锤 - 这是慢速的锤子数据模式。

0xAPHY_CALIB模式 - 0xFF00AA55,55AA99,66。该模式仅在地址0处生成READ命令。

CMDS_GAP_DELAY

该参数允许每个用户突发命令之间的暂停延迟。

 有效值:032

SEL_VICTIM_LINE

选择状态始终处于逻辑高电平的受害DQ线路。

该参数仅适用于锤子模式。此参数的有效设置是0NUM_DQ_PINS

value = NUM​​_DQ_PINS时,所有DQ引脚都具有相同的Hammer模式。

1.流量发生器可能支持比7系列内存控制器更多的选项。设置必须与内存控制器中支持的值匹配。

命令模式instr_mode_i addr_mode_i bl_mode_i data_mode_i

所述的traffic_gen 模块可以分别独立地设定。所提供的init_mem_pattern_ctr 模块具有接口信号,允许您使用Vivado调试逻辑核心虚拟I / OVIO)实时修改命令模式。

这是变化的命令模式:

1.      vio_modify_enable 设置为

2.      vio_addr_mode_value 设置为:

1Fixed_address 

2PRBS地址。

3:顺序地址。

参数

描述

EYE_TEST

强制流量生成器仅生成写入单个位置,并且不会生成读取事务。

此参数的有效设置为“TRUE”“FALSE”

当设置为“TRUE”时,vio_instr_mode_value中的任何设置都将被覆盖。

3.      vio_bl_mode_value 设置为:

1:固定bl

2PRBS bl。如果bl_mode 值设置为2,则addr_mode值被强制为2以生成PRBS地址。

4.      vio_data_mode_value 设置为:

0:保留。

1:固定数据模式。数据来自fixed_data_i 输入总线。

2DGEN_ADDR (默认)。该地址被用作数据模式。

3DGEN_HAMMER 。在DQS的上升沿期间,所有s都在DQ引脚上,在DQS 的下降沿期间,所有s都在DQ引脚上。

4DGEN_NEIGHBOR 。除了一个引脚,DQS的上升沿期间,所有都位于DQ引脚上。地址确定异常引脚位置。

5DGEN_WALKING1 。步行秒在DQ引脚上。的起始位置取决于地址值。


6DGEN_WALKING0 。步行秒在DQ引脚上。起始位置取决于地址值。

7DGEN_PRBS 。一个32LFSR产生随机数据并以起始地址播种。该数据模式仅适用于PRBS地址模式或顺序地址模式。

修改端口地址空间

SADDR

eaddr

PRBS_SADDR_MASK_POS

PRBS_EADDR_MASK_POS

0x1000

0xFFFF

0x00001000

0xFFFF0000地址

0x2000

0xFFFF

0x00002000

0xFFFF0000地址

0x3000

0xFFFF

0x00003000

0xFFFF0000地址

0x4000

0xFFFF

0x00004000

0xFFFF0000地址

0x5000

0xFFFF

0x00005000

0xFFFF0000地址

0x2000

0x1FFF

0x00002000

0xFFFFE000

0x2000

0x2FFF

0x00002000

0xFFFFD000

0x2000

0x3FFF

0x00002000

0xFFFFC000

0x2000

0x4FFF

0x00002000

0xFFFF8000

0x2000

0x5FFF

0x00002000

0xFFFF8000

0x2000

0x6FFF

0x00002000

0xFFFF8000

0x2000

0x7FFF

0x00002000

0xFFFF8000

0x2000

0x8FFF

0x00002000

0xFFFF0000地址

0x2000

0x9FFF

0x00002000

0xFFFF0000地址

0x2000

0xAFFF

0x00002000

0xFFFF0000地址

0x2000

0xBFFF

0x00002000

0xFFFF0000地址

可以通过更改顶级测试平台文件中的BEGIN_ADDRESSEND_ADDRESS参数来修改端口的地址空间。这两个值必须设置为与端口数据宽度对齐。PRBS_SADDR_MASK_POSPRBS_EADDR_MASK_POS这两个附加参数用于默认PRBS地址模式,以确保超出范围的地址不会发送到端口。PRBS_SADDR_MASK_POS创建一个OR掩码,将PRBS生成的地址的值低于BEGIN_ADDRESS的值移入端口的有效地址空间。应将PRBS_SADDR_MASK_POS设置为等于BEGIN_ADDRESS参数的32位值。PRBS_EADDR_MASK_POS创建一个AND掩码,将带有END_ADDRESS以上值的PRBS生成地址向下移动到端口的有效地址空间中。应将PRBS_EADDR_MASK_POS设置为32位值,并且所有剩余的位都被设置为1-12 显示了设置两个掩码参数的一些示例。

                 1-12         地址空间和PRBS掩码的示例设置

                 1-12         地址空间和PRBS掩码的示例设置

SADDR

eaddr

PRBS_SADDR_MASK_POS

PRBS_EADDR_MASK_POS

0x2000

0xCFFF

0x00002000

0xFFFF0000地址

0x2000

0xDFFF

0x00002000

0xFFFF0000地址

0x2000

0xEFFF

0x00002000

0xFFFF0000地址

0x2000

0xFFFF

0x00002000

0xFFFF0000地址

流量发生器信号描述

流量发生器信号如 1-13所示

1-13         流量发生器信号说明

信号

方向

描述

CLK_I

输入

该信号是时钟输入。

memc_init_done

输入

这是来自内存控制器的输入状态信号,表示它已准备好接受流量。

manual_clear_error

输入

输入信号清除错误标志。

memc_cmd_addr_o [310]

产量

当前交易的起始地址。

memc_cmd_en_o

产量

该高电平有效信号是命令FIFO的写使能信号。

memc_cmd_full_i

输入

这连接到内存控制器的app_rdy的反转。当该输入信号有效时,TG继续断言memc_cmd_en_o memc_cmd_addr_o 值和memc_cmd_instr直到memc_cmd_full_i 被取消断言。

memc_cmd_instr [20]

产量

当前指令的命令码。

命令写入:3'b000

命令阅读:3'b001

memc_rd_data_i [DWIDTH - 10]

输入

读取从内存返回的数据值。

memc_rd_empty_i

输入

该高电平有效信号是存储器控制器中读数据FIFO的空标志。它表示FIFO中没有有效的数据。

memc_rd_en_o

产量

该信号仅用于类似MCB的接口。

memc_wr_data_o [DWIDTH -

10]

产量

将数据值写入存储器控制器的写入数据FIFO中。

memc_wr_en_o

产量

该高电平有效信号是写数据FIFO的写使能。它表明memc_wr_data 上的值是有效的。

memc_wr_full_i

输入

该高电平有效信号是来自存储器控制器的写入数据FIFO的完整标志。当该信号为高电平时,TG保持写数据值并保持memc_wr_en的置位状态,直到memc_wr_full_i 变为低电平。

qdr_wr_cmd_o

产量

该信号仅用于向QDR II +用户界面发送写入命令。

vio_modify_enable

输入

允许vio_xxxx_mode_value 改变流量模式。

 

信号

方向

描述

vio_data_mode_value [30]

输入

该信号的有效设置是:

•    0x0:保留。

•    0x1:固定 - 通过fixed_data_i 输入定义的fixed_data32位。

•    0x2ADDRESS - 32位地址作为数据。数据是基于逻辑地址空间生成的。如果设计具有256位用户数据总线,则用户总线中的每个写入节拍在字节边界中将具有256/8的地址增量。如果起始地址是1,300,则数据是1,300,然后是下一个周期中的1,320。为了简化逻辑,用户数据模式是重复地址值位[310]的增量。

•    0x3HAMMER - 在上升沿期间,所有1都在DQ引脚上

DQS,并且所有的0都在DQ引脚的下降沿

DQS,但参数中定义的VICTIM线除外

“SEL_VICTIM_LINE”。该选项仅在参数DA​​TA_PATTERN =“DGEN_HAMMER”“DGEN_ALL”时有效。

•    0x4SIMPLE8 - 简单8数据模式,每8个字重复一次。模式可以由“simple_datax”输入定义。

•    0x5WALKING1s - 步行1位于DQ引脚上。1的起始位置取决于地址值。该选项仅在参数DA​​TA_PATTERN =“DGEN_WALKING”“DGEN_ALL”时有效。

•    0x6WALKING0s - 步进0位于DQ引脚上。起始位置0取决于地址值。该选项仅在参数DA​​TA_PATTERN =“DGEN_WALKING0”“DGEN_ALL”时有效。

•    0x7PRBS - 32LFSR生成随机数据并以起始地址播种。该选项仅在参数DA​​TA_PATTERN =“DGEN_PRBS”“DGEN_ALL”时有效。

•    0x9:慢速锤 - 这是慢速的锤子数据模式。

•    0xAPHY_CALIB模式 - 0xFF00AA55,55AA99,66。该模式仅在地址零处生成READ命令。这是只有在有效的Virtex ® -7系列。

vio_addr_mode_value [20]

输入

该信号的有效设置是:

•    0x1:固定地址模式。该地址来自fixed_addr_i输入总线。在FIXED地址模式下,data_mode被限制在fixed_data_input。没有生成PRBS数据模式。

•    0x2PRBS地址模式(默认)。该地址由内部32LFSR电路产生。种子可以通过cmd_seed输入总线进行更改。

•    0x3SEQUENTIAL地址模式。地址由内部地址计数器生成。增量由用户界面端口宽度决定。


 

信号

方向

描述

vio_instr_mode_value [30]

输入

该信号的有效设置是:

•    0x1:由fixed_instr_i 定义的命令类型(读/写)。

•    0x2:随机读取/写入命令。

•    0xE:只写入地址零。

•    0xF:只读地址零。

vio_bl_mode_value [30]

输入

该信号的有效设置是:

•    0x1fixed_bl_i输入中定义的固定突发长度。

•    0x2:用户突发长度由内部PRBS发生器生成。每个突发值定义了生成的背靠背命令的数量。

vio_fixed_instr_value

输入

有效的设置是:

•    0x0:写入指令

•    0x1:读指令

vio_fixed_bl_value

输入

有效的设置是1256

vio_pause_traffic

输入

即时暂停流量生成。

vio_data_mask_gen

输入

该模式仅在数据模式模式为数据地址时使用。如果启用此功能,则会在内存中填充内存模式后生成一个随机memc_wr_mask。如果相应的memc_write_mask被声明,写数据字节通道会被8'hFF卡住。

cmp_data [DWIDTH - 10]

产量

预期数据与内存中的回读数据进行比较。

cmp_data_valid

产量

比较数据有效信号。

cmp_error

产量

只要cmp_data与内存中的回读数据不相同,该比较错误标志就会置位。

错误

产量

当回读数据不等于期望值时,该信号有效。

ERROR_STATUS [N0]

产量

错误信号有效时,该信号锁存这些值:

•    [310]:读取起始地址

•    [37:32]:读取突发长度

•    [39:38]:保留

•    [40]mcb_cmd_full

•    [41]mcb_wr_full

•    [42]mcb_rd_empty

•    [64 +DWIDTH - 1):64]expected_cmp_data

•    [64 +2×DWIDTH - 1):64 + DWIDTH]read_data

simple_data0 [310]

输入

用户定义的简单数据0用于简单8重复数据模式。

simple_data1 [310]

输入

用户定义的简单数据1用于简单8重复数据模式。

simple_data2 [310]

输入

用户定义的简单数据2用于简单的8个重复数据模式。

simple_data3 [310]

输入

用户定义的简单数据3用于简单的8重复数据模式。

simple_data4 [310]

输入

用户定义的简单数据4用于简单的8个重复数据模式。

信号

方向

描述

simple_data5 [310]

输入

用户定义的简单数据5用于简单的8重复数据模式。

simple_data6 [310]

输入

用户定义的简单数据6用于简单的8重复数据模式。

simple_data7 [310]

输入

用户定义的简单数据7用于简单的8个重复数据模式。

fixed_data_i [310]

输入

用户定义的固定数据模式。

fixed_instr_i [20]

输入

用户定义的固定命令模式。

000 :写入命令

001 :读命令

fixed_bl_i [50]

输入

用户定义的固定突发长度。每个突发值定义生成的背对背命令的数量。

内存初始化和流量测试流程

上电后,初始化存储器控制块指示流量发生器通过存储器初始化过程用选定的数据模式初始化存储器。

内存初始化

1.      data_mode_i 输入被设置为选择的数据模式(例如,data_mode_i [30] = 0010 的地址作为数据图案)。

2.      start_addr_i 输入被设置为限定下边界的地址。

3.      end_addr_i 输入被设置为限定所述上边界的地址。

4.      bl_mode_i 设置为01 以从fixed_bl_i 输入获取突发长度。

5.      fixed_bl_i 输入设置为1632

6.      instr_mode_i 设置为0001 ,以获得从指令fixed_instr_i 输入。

7.      fixed_instr_i 输入被设置到存储器设备中的“WR”指令值。

8.      为顺序地址模式填充内存空间,addr_mode_i 设置为11 

9.      mode_load_i 被断言一个时钟周期。

当内存空间使用所选数据模式初始化时,初始化内存

控制块指示流量生成器开始通过流量测试流程过程运行流量(默认情况下,addr_mode_i instr_mode_i bl_mode_i 输入设置为选择PRBS模式)。

交通测试流程

1.      addr_mode_i 输入被设置为想要的模式(PRBS是默认值)。

2.      cmd_seed_i data_seed_i 输入值用于内部PRBS发生器设置。其他模式不需要此步骤。

3.      instr_mode_i 输入被设置为想要的模式(PRBS是默认值)。

4.      bl_mode_i 输入被设置为想要的模式(PRBS是默认值)。

5.      data_mode_i 输入应具有相同的值作为详述的存储器模式初始化阶段存储器初始化

6.      run_traffic_i 输入被触发,才能启动运行流量。

7.      如果在测试期间发生错误(例如,读取的数据与期望的数据不匹配),错误位将被设置,直到应用复位。

8.      接收到错误时,error_status总线将锁定1-13,页面66定义的值。

通过一些修改,可以更改示例设计,以便在run_traffic_i 取消断言时动态更改addr_mode_i instr_mode_i bl_mode_i 。但是,在更改设置后,需要重复执行存储器初始化步骤,以确保将适当的模式加载到内存空间中。

注意:

°       禁用芯片选择选项时,仿真测试平台始终将存储器模型芯片选择位设置为零以实现正确操作。

°       禁用数据遮罩选项时,模拟测试台始终将存储器模型数据遮罩位置零以便正确操作。

 

7系列FPGA存储器接口解决方案内核如图1-49 所示。

X-Ref目标 - 1-49

6 \ VWHPFORFNV \ VBFONBSDQGV \ VBFONBQV \VBFONBL5HIHUHQFHFORFNFONBUHIBSDQGFONBUHIBQFONBUHIBLDQGV \ VWHPUHVHWV \VBUVWBQSRUW FRQQHFWLRQVDUHQRWVKRZQLQEORFNGLDJUDP

                                                    1-49        7系列FPGA存储器接口解决方案

用户FPGA逻辑

1-49 所示的用户FPGA逻辑模块是任何需要连接到外部DDR2DDR3 SDRAMFPGA设计。用户FPGA逻辑通过用户界面连接到内存控制器。内核提供了一个示例用户FPGA逻辑。

AXI4从接口模块

AXI4从机接口将AXI4事务映射到UI,为存储器控制器提供工业标准总线协议接口。

用户界面块和用户界面

UI块将用户界面呈现给用户FPGA逻辑块。它通过提供一个平坦的地址空间和缓冲读写数据来为本地接口提供一个简单的替代方案。

内存控制器和本地接口

内存控制器(MC)的前端向UI块提供本地接口。本地接口允许用户设计提交内存读取和写入请求,并提供将数据从用户设计移动到外部存储设备的机制,反之亦然。内存控制器的后端连接到物理接口并处理该模块的所有接口要求。内存控制器还提供重新排序选项,对接收到的请求进行重新排序以优化数据吞吐量和延迟。

PHY和物理接口

PHY的前端连接到内存控制器。PHY的后端连接到外部存储设备。PHY处理所有的存储设备信号排序和时序。

IDELAYCTRL

任何使用IDELAY的银行都需要IDELAYCTRLIDELAY与数据组(DQ)相关联。任何使用这些信号的银行/时钟区域都需要IDELAYCTRL

MIG工具实例化一个IDELAYCTRL,然后使用IODELAY_GROUP属性(请参阅iodelay_ctrl.v 模块)。基于此属性,Vivado Design Suite可在设计中根据需要正确复制IDELAYCTRL

IDELAYCTRL参考频率应设为200 MHz。基于

设置了IODELAY_GROUP属性后,Vivado Design Suite将为存在IDELAY块的每个区域复制IDELAYCTRL。当用户自行创建多控制器设计时,每个MIG输出都具有与该基元实例化的组件。这违反了IDELAYCTRL的规则和IODELAY_GRP属性的使用。IDELAYCTRL需要只有一个具有正确设置属性的组件的实例化,并允许工具根据需要进行复制。

用户界面

用户界面如1-17 所示,并连接到FPGA用户设计以允许访问外部存储设备。

1-17       用户界面

信号

方向

描述

app_addr [ADDR_WIDTH - 10]

输入

该输入指示当前请求的地址。

app_cmd [20]

输入

该输入选择当前请求的命令。

app_en

输入

这是app_addr []app_cmd [20]app_szapp_hi_pri输入的高有效选通。

app_rdy

产量

此输出表明UI已准备好接受命令。如果在启用app_en时取消断言信号,则必须重试当前的app_cmdapp_addr,直到app_rdy被声明为止。

app_hi_pri

输入

该高电平有效输入提升当前请求的优先级。

app_rd_data

[APP_DATA_WIDTH - 10]

产量

这提供了读命令的输出数据。

app_rd_data_end

产量

该高电平有效输出表明当前时钟周期是app_rd_data []上输出数据的最后一个周期。

app_rd_data_valid

产量

active-High输出表明app_rd_data []是有效的。

app_sz

输入

该输入被保留并且应该被绑定到

app_wdf_data

[APP_DATA_WIDTH - 10]

输入

这提供了写入命令的数据。

app_wdf_end

输入

这个高电平有效输入表明当前时钟周期是app_wdf_data []上输入数据的最后一个周期。

app_wdf_mask

[APP_MASK_WIDTH - 10]

输入

这提供了app_wdf_data []的掩码。

app_wdf_rdy

产量

该输出表明写入数据FIFO已准备好接收数据。写入数据在app_wdf_rdy = 1'b1 app_wdf_wren = 1'b1 时被接受。

app_wdf_wren

输入

这是app_wdf_data []的主动高频闪。

app_correct_en_i

输入

置位时,该高电平有效信号纠正单位数据错误。只有在GUI中启用ECC时,此输入才有效。

在示例设计中,该信号总是与1相关联。

app_sr_req

输入

该输入被保留并且应该被绑定到0

app_sr_active

产量

该输出保留。

app_ref_req

输入

该高电平有效输入请求向DRAM发出刷新命令。

app_ref_ack

产量

该高电平有效输出表示存储器控制器已将请求的刷新命令发送到PHY接口。

app_zq_req

输入

该高电平有效输入请求向DRAM发出ZQ校准命令。

1-17       用户界面(续)

信号

方向

描述

app_zq_ack

产量

此高电平有效输出表示存储器控制器已将请求的ZQ校准命令发送到PHY接口。

ui_clk

产量

这个UI时钟必须是DRAM时钟的一半或四分之一。

init_calib_complete

产量

校准完成后,PHY断言init_calib_complete

app_ecc_multiple_err [70] 1

产量

该信号适用于启用了ECC并且与app_rd_data_valid一起有效的情况。如果来自外部存储器的读取数据在读取脉冲串的每个脉冲中具有两个比特错误,则app_ecc_multiple_err [30]信号非零。SECDED算法不会校正相应的读取数据,并在此信号上放置一个非零值,以通知用户界面上已损坏的读取数据。

ui_clk_sync_rst

产量

这是主动高UI重置。

1.该信号仅被引入memc_ui_top 模块级别。该信号只能在启用ECC时使用。

app_addr[ADDR_WIDTH - 10]

此输入指示当前正在提交给UI的请求的地址。用户界面汇总外部SDRAM的所有地址字段,并为您提供一个平坦的地址空间。

app_cmd [20]

此输入指定当前提交给UI的请求的命令。可用命令如1-18 所示。1-18app_cmd [20]的命令

手术

app_cmd [20]代码

001

000

app_en

该输入在请求中闪烁。您必须将所需值应用于app_addr []app_cmd [20]app_hi_pri ,然后声明app_en 以将请求提交给UI。这通过声明app_rdy来启动UI确认的握手。app_hi_pri

该输入表明当前请求是高优先级。

app_wdf_data[APP_DATA_WIDTH - 10]

该总线提供当前正在写入外部存储器的数据。

app_wdf_end

该输入表明当前周期中app_wdf_data []总线上的数据是当前请求的最后一个数据。

app_wdf_mask[APP_MASK_WIDTH - 10]

该总线指示将app_wdf_data []的哪些字节写入外部存储器,哪些字节保持其当前状态。字节通过将值“1”设置为app_wdf_mask的相应位来屏蔽。例如,如果应用程序数据的宽度是256,掩模宽度取的值32。所述的至少显著字节[70]app_wdf_data 使用的[0]位被掩蔽app_wdf_mask 和最显著字节[248 255]app_wdf_data app_wdf_maskBit [31] 掩码。因此,如果必须屏蔽最后一个DWORD,即app_wdf_data字节0,1,23则应app_wdf_mask 设置为32'h0000_000F

app_wdf_wren

该输入表明app_wdf_data []总线上的数据是有效的。

app_rdy

此输出向您显示当前正在提交给UI的请求是否被接受。如果在app_en 被声明后UI没有声明这个信号,那么当前的请求必须重试。在以下情况下,app_rdy 输出未被声明:

                        °          PHY /内存初始化尚未完成

°所有的银行机器都被占用(可以视为命令缓冲区已满)

      请求读取并且读取缓冲区已满

      请求写入,并且没有写入缓冲区指针可用

                        °         正在插入定期读取

app_rd_data[APP_DATA_WIDTH - 10]

该输出包含从外部存储器读取的数据。

app_rd_data_end

此输出表明 当前循环中app_rd_data []总线上的数据是当前请求的最后一个数据。

app_rd_data_valid

该输出表明app_rd_data []总线上的数据 有效。

app_wdf_rdy

该输出表明写入数据FIFO已准备好接收数据。写入数据在app_wdf_rdy app_wdf_wren 都被声明时被接受。app_ref_req

置位时,此高电平有效输入请求存储控制器向DRAM发送刷新命令。它必须脉冲一个周期才能发出请求,然后至少在app_ref_ack 信号被断言以确认请求并指示它已发送之前解除置位。

app_ref_ack

置位时,该高电平有效输入确认刷新请求,并指示该命令已从存储器控制器发送至PHY

app_zq_req

置位时,该高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。它必须脉冲一个周期才能发出请求,然后至少在app_zq_ack 信号被断言以确认请求并指示它已被发送之前解除置位。

app_zq_ack

置位时,该高电平有效输入确认ZQ校准请求,并指示该命令已从存储器控制器发送至PHYui_clk_sync_rst

这是与ui_clk 同步的UI重置。

ui_clk

这是UI的输出时钟。它必须是输出到外部SDRAM的时钟频率的一半或四分之一,这取决于在GUI中选择的2141模式。

init_calib_complete

校准完成后,PHY断言init_calib_complete 在将命令发送到内存控制器之前,应用程序不需要等待init_calib_complete 

 

用户界面块

UI块将用户界面呈现给用户设计。它为本地界面提供了一个简单的替代方案。UI块:

•       缓冲区读取和写入数据

•       重新排列读取返回数据以匹配请求顺序

•       提供一个平坦的地址空间并将其转换为SDRAM所需的寻址

本地接口

本地接口连接到FPGA用户设计,允许访问外部存储设备。

命令请求信号

本地接口提供一组请求从存储器控制器读取或写入命令到存储器设备的信号。这些信号汇总在1-76

1-76        本地接口命令信号

信号

方向

描述

接受

产量

该输出表明内存接口接受最后一个周期驱动的请求。

银行[20]

输入

该输入为当前请求选择银行。

bank_mach_next []

产量

该输出保留,应保持不连接。

CMD [20]

输入

该输入选择当前请求的命令。

col [COL_WIDTH - 10]

输入

该输入选择当前请求的列地址。

data_buf_addr [70]

输入

该输入表示内存控制器的数据缓冲区地址:

•    处理写入命令时查找数据。

•    处理读命令时放置数据。

hi_priority

输入

该输入保留,应连接到逻辑

[]

输入

该输入保留,应连接到逻辑

1-76         本地接口命令信号(续)

信号

方向

描述

[ROW_WIDTH - 10]

输入

该输入选择当前请求的行地址。

use_addr

输入

用户设计选通该输入以指示在先前状态下驱动的请求信息是有效的。

银行,行和列包括用于读取和写入操作的存储器设备上的目标地址。命令是通过使用cmd [20]输入到核心来指定的。1-77 中显示了可用的读取和写入命令。1-77存储器接口命令

手术

cmd [20]代码

内存写入

000

内存读取

001

保留的

所有其他代码

接受

该信号向用户设计指示核心是否接受请求。当接受信号被断言时,接受在最后一个周期提交的请求,并且用户设计可以继续提交更多请求或闲置。当接受信号无效时,最后一个周期提交的请求不被接受,并且必须重试。

use_addr

用户设计声明use_addr 信号来选通上一个周期中提交给本地接口的请求。

data_buf_addr

用户设计必须包含读取和写入命令期间使用的数据的缓冲区。当一个请求被提交给本地接口时,用户设计必须在缓冲区中指定一个位置来处理请求。对于写入命令,data_buf_addr是包含要写入外部存储器的源数据的缓冲区中的地址。对于读取命令,data_buf_addr是从外部存储器接收读取数据的缓冲区中的地址。处理请求时,核心会回复此地址。

写命令信号

本机接口有内存控制器正在处理写命令时使用的信号(1-78 )。这些信号连接到用户设计中缓冲区的控制,地址和数据信号。

1-78         本地接口写入命令信号

信号

方向

描述

wr_data [2 × nCK_PER_CLK × PAYLOAD_WIDTH - 10]

输入

这是写命令的输入数据。

wr_data_addr [DATA_BUF_ADDR_WIDTH - 10]

产量

该输出为写入命令提供源数据缓冲区的基地址。

wr_data_mask [2 × nCK_PER_CLK × DATA_WIDTH / 8-10]

输入

该输入为写入数据提供字节使能。

wr_data_en

产量

该输出指示存储器接口正从数据缓冲器读取写入命令的数据。

wr_data_offset [00]

产量

该输出为写入命令提供源数据缓冲区的偏移量。

wr_data

该总线是需要写入外部存储器的数据。该总线可以连接到用户设计中缓冲区的数据输出。

wr_data_addr

当提交当前写入请求时,该总线是data_buf_addr 的回。所述wr_data_addr 总线可以与结合wr_data_offset 信号和施加到在用户设计一个缓冲区的地址输入。

wr_data_mask

该总线是当前正在写入外部存储器的数据的字节使能(数据屏蔽)。当相应的wr_data_mask 信号无效时写入存储器的字节。wr_data_en

置位时,该信号表明内核正在从用户设计中读取写入命令的数据。该信号可以与用户设计中的缓冲器的芯片选择相关联。 wr_data_offset

当突发长度需要多个单周期完成时,该总线用于逐步通过数据缓冲区。该总线与wr_data_addr 结合,可以应用于用户设计中缓冲区的地址输入。

阅读命令信号

当内存控制器正在处理读命令时,本地接口提供一组信号(1-79 )。这些信号与处理写入命令的信号相似,不同之处在于它们将数据从存储设备传送到用户设计中的缓冲区。

1-79         本地接口读取命令信号

信号

方向

描述

rd_data [2 × nCK_PER_CLK × PAYLOAD_WIDTH - 10]

产量

这是读取命令的输出数据。

rd_data_addr [DATA_BUF_ADDR_WIDTH - 10]

产量

该输出为读命令提供目标缓冲区的基地址。

rd_data_en

产量

该输出表明有效的读数据在rd_data总线上可用。

rd_data_offset [10]

产量

该输出为读命令提供目标缓冲区的偏移量。

rd_data

该总线是从外部存储器读取的数据。它可以连接到用户设计中缓冲区的数据输入。

rd_data_addr

当提交当前读取请求时,该总线是data_buf_addr 的回。该总线可以与rd_data_offset 信号组合使用,并在用户设计中应用于缓冲区的地址输入。

rd_data_en

该信号指示何时读取请求的rd_data 有效读取数据可用。它可以与用户设计中的缓冲器的芯片选择和写入启用相关联。

rd_data_offset

当突发长度需要多个单周期完成时,该总线用于逐步通过数据缓冲区。该总线可以与rd_data_addr 结合使用,并应用于用户设计中缓冲区的地址输入。

本地接口维护命令信号

1-80 列出了本地接口维护命令信号。

1-80          本地接口维护命令信号

信号

方向

描述

app_sr_req

 输入

该输入被保留并且应该被绑定到0

app_sr_active

 产量

该输出保留。

app_ref_req

 输入

此高电平有效输入请求发送刷新命令给

DRAM

app_ref_ack

 产量

该高电平有效输出表示存储器控制器已将请求的刷新命令发送到PHY接口。

app_zq_req

 输入

该高电平有效输入请求向DRAM发出ZQ校准命令。

app_zq_ack

 产量

此高电平有效输出表示存储器控制器已将请求的ZQ校准命令发送到PHY接口。

app_ref_req

置位时,此高电平有效输入请求存储控制器向DRAM发送刷新命令。它必须脉冲一个周期才能发出请求,然后至少在app_ref_ack 信号被断言以确认请求并指示它已发送之前解除置位。

app_ref_ack

置位时,该高电平有效输入确认刷新请求,并指示该命令已从存储器控制器发送至PHY

app_zq_req

置位时,该高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。它必须脉冲一个周期才能发出请求,然后至少在app_zq_ack 信号被断言以确认请求并指示它已被发送之前解除置位。

app_zq_ack

置位时,该高电平有效输入确认ZQ校准请求,并指示该命令已从存储器控制器发送至PHY

时钟建筑

PHY设计要求使用PLL模块来生成各种时钟,并且全局和本地时钟网络都用于在整个设计中分配时钟。PHY还需要一个与PLL相同的MMCM。该MMCM补偿BUFGPHY的插入延迟。

时钟生成和分配电路和网络驱动PHY内的块,大致可分为四个独立的通用功能:

•       内部(FPGA)逻辑

•       写路径(输出)I / O逻辑

•       读取路径(输入)并延迟I / O逻辑

•       IDELAY参考时钟(200 MHz

PHY需要一个MMCM和一个PLLPLL用于生成大多数内部逻辑的时钟,相位器的频率参考时钟以及在多I / O bank实现中保持PHY控制模块同步所需的同步脉冲。

对于400 MHz933 MHz之间的DDR3 SDRAM时钟频率,相位器参考时钟频率与存储器时钟频率相同。对于400 MHz以下的DDR2DDR3 SDRAM时钟频率,其中一个移相器频率参考时钟以与存储器时钟相同的频率运行,第二个频率参考时钟必须是存储器时钟频率的2倍或4倍,以满足范围要求400 MHz933 MHz。两个相位器参考频率必须由相同的PLL产生,因此它们彼此同相。时钟架构的框图如图1-50 所示。freq_refclk的相位根据工作频率和选择用于存储器接口引脚的存储体而变化。

•       GUI中选择HP存储区时,如果存储频率≥400 MHz,则相位为337.5

•       当选择HP存储库用于GUI中的存储器接口引脚并且存储频率在200-400 MHz(不包括400 MHz)时,相位为315

•       对于在GUI中存储器接口引脚选择HP存储区且存储频率≥400 MHz 时的低压器件,相位为337.5

•       对于低压设备,如果在GUI中为存储器接口引脚选择了HP存储体,并且存储频率在200-400 MHz之间(不包括400 MHz),则相位为

0

•       如果在GUI中选择HR存储器接口引脚的HR存储区并且存储频率≥400 MHz,则相位为337.5

•       当在GUI中为存储器接口引脚选择HR库时,存储器频率在200-400 MHz(不包括400 MHz)之间时,相位为0

PLL乘(M)和除(D)值的默认设置是系统时钟输入频率等于存储器时钟频率。这个11的比例是不需要的。PLL输入分频器(D)可以是7系列FPGA时钟资源用户指南UG472[参考9]列出的任何值。只要满足PLLE2操作条件并且遵守这里列出的其他约束条件即可。PLL乘法(M)值必须介于116之间(含)。对于800 Mb / s及以上,内存时钟的PLL输出分频器(O)必须为2,而对于400800 Mb / s,则必须为4PLL VCO频率范围必须保持在硅数据手册中指定的范围内。sync_pulse必须是mem_refclk频率的1/16,并且必须具有1/166.25%的占空比。有关PLL物理布局和系统时钟CCIO输入的信息,请参见设计指南,第181

 

内部(FPGA)逻辑时钟

内部FPGA逻辑由DDR2DDR3 SDRAM时钟频率的一半或四分之一频率的全局时钟资源提供时钟,这取决于在MIG中选择的4121模式。该PLL还输出高速DDR2DDR3内存时钟。

写路径(输出)I / O逻辑时钟

包含数据和控件的输出路径由PHASER_OUT定时。PHASER_OUT为每个字节组向OUT_FIFOOSERDES / ODDR提供同步时钟。PHASER_OUT为其关联的字节组生成一个字节时钟(OCLK),一个分割字节时钟(OCLKDIV)和一个延迟字节时钟(OCLK_DELAYED)。这些时钟直接由频率基准时钟产生,并且彼此同相。字节时钟与频率参考时钟频率相同,分频字节时钟频率为频率参考时钟的一半。OCLK_DELAYED用于为DQS ODDR 提供时钟,以实现写入DQS 与其相关DQ 之间所需的90°相位偏移位。PHASER_OUT还驱动写入期间生成DQS 所需的信号 ,与数据字节组相关的DQS DQ 3状态以及字节组的OUT_FIFO的读取使能。地址/控制的时钟细节和使用PHASER_OUT的写路径如图1-56 1-58所示

读取路径(输入)I / O逻辑时钟

输入读数据通路由PHASER_IN模块提供时钟。PHASER_IN块为每个字节组提供同步时钟给IN_FIFOIDDR / ISERDESPHASER_IN模块接收关联字节组的DQS 信号,并为DDR2DDR3 SDRAM数据采集生成两个延迟时钟:读字节时钟(ICLK)和读分字节时钟(ICLKDIV)。ICLK是频率参考时钟的延迟版本,与相关的DQS 相位一致。ICLKDIV用于将数据捕获到ISERDES中的第一级触发器中。ICLKDIVICLK保持一致,是ISERDES中最后一批触发器的并行传输时钟。ICLKDIV还用作与字节组关联的IN_FIFO的写入时钟。PHASER_IN块还驱动字节组的IN_FIFO的写入使能(WrEnable)。使用PHASER_IN的读取路径的时钟细节如图1-58 所示。

IDELAY参考时钟

必须向IDELAYCTRL模块提供200 MHz IDELAY时钟。IDELAYCTRL模块持续校准I / O区域中的IDELAY元素,以应对变化的环境条件。IP内核假定外部时钟信号正在驱动IDELAYCTRL模块。如果PLL时钟驱动IDELAYCTRL输入时钟,则需要将PLL锁定信号合并到IODELAY_CTRL.v 模块内的rst_tmp_idelay 信号中。

这确保了在使用之前时钟稳定。

内存控制器

在核心默认配置中,内存控制器(MC)位于UI块和物理层之间。这是在描绘1-51 

存储器控制器是存储器接口的主要逻辑块。内存控制器接收来自UI的请求并将它们存储在逻辑队列中。可以对请求进行重新排序以优化系统吞吐量和延迟。

内存控制器块被组织为四个主要部分:

•       可配置数量的银行机器

•       可配置数量的等级机器

•       列机器

•       一个仲裁块

银行机器

大部分内存控制器逻辑驻留在银行机器中。银行机器对应于DRAM银行。给定的银行机器在任何给定时间管理单个DRAM银行。但是,银行机器分配是动态的,因此不必为每个实体银行设置银行机器。银行的数量可以配置为在区域和性能之间进行折衷。预充电政策部分对此进行了更详细的讨论。

银行机器分配给特定DRAM组的持续时间与用户请求相耦合,而不是目标DRAM组的状态。当请求被接受时,它被分配给银行机器。当请求完成时,银行机器被释放并且可用于分配到另一个请求。银行机器发出完成请求所需的所有命令。

代表当前的请求,银行机器必须生成行命令和列命令来完成请求。行和列命令是独立的,但必须符合DRAM时序要求。

以下简化的例子说明了这个概念。考虑当单个请求到达时内存控制器和DRAM空闲的情况。游泳池的银行机器:

1.      接受你的请求

2.      激活目标行

3.      发出列(读取或写入)命令

4.      预充电目标行

5.      返回到闲置的银行机器池

当多个请求到达不同的行或银行时,类似的功能适用。

现在考虑一个请求到达的情况,目标是一个开放的DRAM银行,由一个已经活跃的银行机器管理。已经激活的银行机器识别新的请求以同一DRAM存储区为目标并跳过预充电步骤(步骤)。位于闲置池头部的银行机器接受新的用户请求并跳过激活步骤(步骤)。

最后,当请求全部到达同一个目标DRAM存储区时,前一请求和后一请求都到达,控制器将跳过激活(步骤)和预充电(步骤)的操作。

银行机器尽可能快地为DRAM银行预充电,除非另一个待处理的请求指向同一银行。预充电政策部分对此进行了更详细的讨论。

为了优化存储器接口吞吐量,列命令可以重新排序。排序算法名义上确保数据一致性。重新排序” 部分详细介绍了重新排序功能。

排名机器

等级机器对应于DRAM等级。排名机器监控银行机器的活动并跟踪排名或设备特定的时间参数。例如,排名机器监视在时间窗口内发送给排名的激活命令的数量。在发送了允许的激活次数之后,等级机器产生禁止信号,该禁止信号防止银行机器发送任何进一步的激活到等级,直到时间窗口足够地移动以允许更多的激活。等级机器被静态分配给物理DRAM等级。

柱机

单列机器生成管理DQ数据总线所需的定时信息。虽然可以有多个DRAM等级,但由于存在单个DQ总线,所有DRAM等级中的所有列都作为一个单元进行管理。列机器监视银行机器发出的命令,并产生禁止信号返回银行机器,以便有序地使用DQ总线。

仲裁块

仲裁模块接收从银行机器发送命令到DRAM阵列的请求。行命令和列命令是独立仲裁的。对于每个命令机会,仲裁器块选择一行和一列命令以转发到物理层。仲裁块实施循环协议以确保前进。

重新排序

DRAM访问被分成两个准独立部分,即行命令和列命令。每个请求占用一个逻辑队列条目,并且每个队列条目都有一个关联的银行机器。这些银行机器跟踪当前绑定的DRAM等级或银行的状态(如果有的话)。

如有必要,银行机器将尝试代表当前请求激活正确的排名,银行或行。在这样做的过程中,银行机器查看DRAM的当前状态以确定是否满足各种时序参数。最终,所有时间参数都得到满足,并且银行机器进行仲裁以发送激活。仲裁以简单的循环方式完成。仲裁是必要的,因为多个银行机器可能会同时请求发送行命令(激活和预充电)。

并非所有请求都需要激活。如果先前的请求激活了相同的排名,银行或行,则后续请求可能会继承银行机器状态并避免预充/激活罚款。

在必要的等级,银行或行被激活并且满足RASCAS延迟时间之后,银行机器尝试发出CAS-READCAS-WRITE命令。与行命令不同,所有请求都会发出CAS命令。在仲裁发送CAS命令之前,银行机器必须查看DRAM的状态,DQ总线的状态,优先级和顺序。最终,所有这些因素都假定它们有利的状态,并且银行机器仲裁以发送CAS命令。以类似于行命令的方式,循环法仲裁器使用优先级方案并选择下一列命令。

循环仲裁者本身是重新排序的来源。假设例如一个空闲的存储器控​​制器在处理刷新时接收到一连串的新请求。这些请求排队并等待刷新完成。在DRAM准备好接收新的激活之后,所有等待请求同时断言它们的仲裁请求。仲裁器独立于请求顺序,仅基于其循环算法选择要发送的下一个激活。列命令可以观察到类似的行为。

控制器支持三种排序模式:

•       STRICT - 在此模式下,控制器始终按照在本机界面接收到的确切顺序向内存发出命令。这种模式适用于无法从重新排序中获益并且需要最低延迟的情况。由于读取的数据按顺序恢复,因此可能不需要用户界面层,从而减少延迟。该模式对调试也很有用。

•       NORM - 在此模式下,控制器重新排序读取但不写入以提高效率。所有的写入请求都是在请求顺序中相对于所有其他写入请求发出的,并且给定排名存储区内的请求按顺序退出。这确保了在先前的写入完成之前无法观察稍后写入的结果。

注意: 此重新排序仅在本地界面中可见。用户界面将读取请求重新排列回原始请求顺序。

•       轻松 -这是控制器的最有效的方式。可以根据需要对写入和读取进行重新排序,以实现排名库队列之间的最大效率。因此在这种模式下,可以观察写入的重新排序。但是,这种行为在用户界面层是不可观察的,因为这些请求在排序库中按顺序退出,并且用户界面层按顺序返回读取请求。因此建议使用RELAXED模式与用户界面层一起使用。

预充电政策

控制器执行积极的预充电策略。当每个事务完成时,控制器检查请求的输入队列。如果当前打开的银行/行的队列中没有请求,则控制器关闭该请求以最小化对银行中其他行的请求延迟。因为队列深度等于银行机的数量,所以通过增加银行机的数量(nBANK_MACHS)可以获得更高的效率。随着这个数量的增加,FPGA逻辑时序变得更具挑战性。在某些情况下,随着银行机器数量的增加和内存时钟频率的降低,整体系统效率会更高。应使用目标设计命令行为来执行仿真,以确定最佳设置。

错误更正代码

内存控制器可选地实现纠错码(ECC)。该代码保护DRAM阵列的内容免受损坏。使用单个错误正确的双重错误检测(SECDED)代码。所有单个错误都会被检测并更正。检测到两位的所有错误。超过两位的错误可能会或可能不会被检测到。

ECC框图如图1-52 所示。这些块在存储器控制器(mc.v )模块中实例化。

ECC模式是可选的,仅支持72位数据宽度。当启用ECC模式时,数据掩码功能被禁用。当启用ECC模式时,总是写入整个DQ宽度。DRAM DM位不能使用,因为ECC在整个DQ数据宽度上运行。称为ECC的顶级参数控制ECC逻辑的添加。当此参数设置为“ON”时,ECC被启用,并且当参数设置为“OFF”时,ECC被禁用。

ECC功能被实现为三个功能块。写入数据合并和ECC生成块。一个读数据ECC解码和正确的块以及一个数据缓冲块,用于临时保存读取 - 修改 - 写入周期的读取数据。第四块生成ECC H矩阵并将这些矩阵传递给ECC生成和校正块。

对于完整突发写入命令,从写入数据缓冲器中获取的数据遍历ECC合并并生成块。该块计算ECC位并将它们附加到数据中。ECC产生步骤给出一个CLK状态。因此,与ECC未启用时相比,数据必须从写入数据缓冲器提前一个状态相对于写入命令获取。在用户界面级别,必须在将命令写入命令​​缓冲区后不迟于一个状态将数据写入写入数据缓冲区。除早期的数据要求外,ECC不会为写入带来其他性能损失。

对于读取周期,所有数据都会遍历ECC解码修复(ecc_dec_fix )块。当PHY指示phy_rddata_valid 信号的读数据可用性时,该过程开始。解码修复过程分为两个CLK状态。在第一种状态下,计算出综合征。在第二种状态下,对综合征进行解码并执行任何指示的比特翻转(校正)。同样在第二状态中,ecc_single ecc_multiple 指示是基于由存储控制器核心逻辑产生的校正子位和定时信号ecc_status_valid 来计算的。核心逻辑还提供了一个ecc_err_addr总线。该总线包含当前读命令的地址。通过查看ecc_single ecc_multiple ecc_err_addr 总线可以记录错误位置。ECC对读取请求施加了两种状态延迟惩罚。-修改-

小于全部DRAM突发的任何写入都必须作为读 - 修改 - 写周期来执行。必须读取指定位置,如果执行任何更正,与写入数据合并,计算ECC,然后写回到DRAM阵列。wr_bytes命令是为ECC操作定义的。当给出wr_bytes命令时,存储器控制器总是执行读 - 修改 - 写周期而不是简单的写周期。字节使能必须始终有效,即使是简单的命令。具体而言,当启用ECC模式时,必须为所有wr命令声明所有字节使能。要部分写入内存,app_wdf_mask需要与ECC启用设计的wr_bytes命令一起驱动。1-81 显示了启用ECC模式时的可用命令。

                 1-81       app_cmd [20]的命令

手术

app_cmd [20]代码

000

001

写字节

011

当给出wr_bytes命令时,存储器控制器执行读 - 修改 - 写(RMW)周期。当wr_bytes命令位于队列头部时,它首先发出读取。但与正常的读命令不同,请求保留在队列中。在读响应队列中设置一个位,指示这是一个RMW周期。当读取数据返回该读取命令时,app_rd_data_valid未被声明。相反,ECC被解码,如果有任何更正,则数据被写入ECC数据缓冲器。同时,原始的wr_bytes命令正在检查所有读取的返回值。基于存储在读取返回队列中的data_buf_addrwr_bytes请求可以确定其读取数据何时在ECC数据缓冲区中可用。现在,wr_bytes请求开始仲裁以发送写入命令。当命令被授予时,

wr_bytes命令的性能明显低于正常写入命令。在最好的情况下,每个wr_bytes命令都需要一个DRAM读取周期和一个DRAM写入周期,而不是简单的DRAM写入周期。读写和写入读取周转惩罚进一步降低吞吐量。

内存控制器最多可缓冲nBANK_MACHS wr_bytes命令。只要这些命令在等级库上不冲突,内存控制器就将读取和写入串起来,避免了大部分的读写和写入读取周转惩罚。但是,如果wr_bytes命令流到一个单独的rank-bank,则每个RMW周期将被完全序列化,并且吞吐量会显着降低。

1-82 提供了用户界面上ECC端口的详细信息。

1-82        ECC操作的用户界面

信号

方向

描述

app_correct_en_i

输入

置位时,该高电平有效信号纠正单位数据错误。该输入仅在启用ECC模式时有效。

app_ecc_multiple_err [70]

产量

该信号适用于启用ECC的情况。它与app_rd_data_valid一起有效。如果来自外部存储器的读取数据在读取脉冲串的每个脉冲中有两个比特错误,则app_ecc_multiple_err信号是非零的。SECDED算法不会校正相应的读取数据,并在此信号上放置一个非零值,以通知用户界面上已损坏的读取数据。

该信号在21模式下为4位宽。

app_raw_not_ecc_i [70]

输入

当启用ECC_TEST“ON”)时,此信号适用。它与app_rd_data_valid一起有效。该信号被置位以控制各个块以ECC位中的原始数据写入。

该信号在21模式下为4位宽。

app_wdf_mask [APP_MASK_WIDTH - 10]

输入

该信号为app_wdf_data []提供掩码。

ECC自检功能

在正常操作条件下,写入DRAM阵列的数据的ECC部分在用户界面处不可见。这对于系统自检是有问题的,因为没有办法测试DRAM阵列中对应于ECC位的位。也没有办法发送错误来测试ECC生成和校正逻辑。

由顶级参数ECC_TEST控制,可以生成DRAM阵列测试模式。当ECC_TEST参数为“ON”时,DQ数据总线的整个宽度通过用户界面中的读取和写入缓冲区扩展。当ECC_TEST“ON”时,ECC校正启用被解除置位。

要将任意数据写入DRAM阵列的数据和ECC部分,将所需数据写入扩展宽度写入数据FIFO,并将数据置为相应的app_raw_not_ecc_i位。app_raw_not_ecc_i7位宽(21模式下是4位),允许在ECC位或正常计算的ECC位中使用原始数据写入各个ECC块。这样,可以将任意的模式写入DRAM阵列。

在读取界面中,扩展数据与正常数据一起出现。但是,校正器可能试图纠正读取的数据。在阵列模式测试中这可能不是所期望的,因此应将app_correct_en_i设置为零以禁用更正。

通过以上两项功能,可以实现阵列模式测试。可以通过写入数据模式来测试ECC生成逻辑,但不会声明app_raw_not_ecc_i并取消确认app_correct_en_i。数据和计算出的ECC位可以被读出并进行比较。ECC解码正确的逻辑可以通过断言app_correct_en_i并如上所述写入所需的原始模式来测试。当数据被读回时,可以观察到解码正确的操作。

PHY

PHY为外部DDR2DDR3 SDRAM提供物理接口。PHY产生连接到存储设备所需的信号时序和顺序。它包含时钟,地址和控制生成逻辑,写入和读取数据路径以及上电后初始化SDRAM的状态逻辑。此外,PHY包含校准逻辑,以执行读写数据路径的定时训练,以考虑系统静态和动态延迟。

PHY是作为DDR2DDR3 SDRAM的单个HDL代码库提供的。MIG工具通过包含在XDC文件中的顶级HDL参数和约束来定制SDRAM类型和众多其他设计特定参数。

整体PHY架构

7系列FPGA PHY由专用模块和软校准逻辑组成。通过背靠背互连将专用块彼此相邻构建,以最小化构建高性能物理层所需的时钟和数据路径路由。称为字节组时钟的I / O bank内的专用时钟结构有助于最大限度地减少由字节组时钟驱动器驱动的负载数量。字节组时钟由移相器模块驱动。相位器模块(PHASER_INPHASER_OUT)是多级可编程延迟线环路,可以动态跟踪DQS信号变化并提供精确的相位调整。

每个7系列FPGA I / O bank都有专用模块,包括一个PHY控制模块,四个

PHASER_INPHASER_OUT块,四个IN / OUT_FIFOIOLOGICISERDESOSERDESODDRIDELAY)和IOB。一个I / O bank中存在四个字节组,每个字节组包含PHASER_INPHASER_OUTIN_FIFOOUT_FIFO以及十二个IOLOGICIOB块。一个字节组中的十个IOI中的十个用于DQDM位,另外两个IOI用于实现差分DQS信号。1-53 显示了单个I / O bank中可用的专用块。单个PHY控制块与I / O bank内的全部四个PHASER_INPHASER_OUT块进行通信。

存储器控制器和校准逻辑与慢速时钟域中的专用PHY进行通信,该时钟域可以是除以4或除以2的版本

DDR2DDR3内存时钟。PHY设计的框图如图1-54 所示。

 

存储器初始化和校准序列

在系统复位失效后,PHY执行所需的内存上电初始化序列。接下来是写入和读取数据路径的多个时序校准阶段。校准完成后,PHY指示初始化完成,并且控制器可以开始向存储器发出命令。

1-55的校准阶段对应于以下部分:

•       内存初始化,第134

•       PHASER_IN锁相,第135

•       PHASER_IN DQSFOUND校准,第135

•       写入均衡,第136

•       多用途寄存器读取调节,第139

•       OCLKDELAYED校准,第140

•       写入校准,第141

•       阅读调平,第143

•       PRBS读取调整,第146

•       动态校准和定期读取行为,第146

I / O架构

每个7系列FPGA I / O bank都有专用模块,包括一个PHY控制模块,四个

PHASER_INPHASER_OUT块,四个IN / OUT_FIFOISERDESOSERDESODDRIDELAYIOB。单个PHY控制块与I / O bank内的全部四个PHASER_INPHASER_OUT块进行通信。

PHY控制块

PHY控制模块是中央控制模块,用于管理FPGA逻辑和专用PHY之间的数据和控制信息流。这包括控制IN / OUT_FIFOISERDES / OSERDES之间的地址,命令和数据流以及控制PHASER_INPHASER_OUT块。PHY控制模块以缓慢的频率(DDR2DDR3 SDRAM时钟的1/4频率)PHY_Clk速率从校准逻辑或存储控制器接收控制字,并以DDR2DDR3 SDRAM时钟速率(CK 频率)。

校准逻辑或存储器控制器通过将地址,命令和数据(用于写入命令)写入到DDR2DDR3 SDRAM命令序列中来启动

IN / OUT_FIFO,同时或随后将PHY控制字写入PHY控制模块。PHY控制字定义了PHY控制块启动执行DDR2DDR3 SDRAM命令所执行的一组操作。

PHY控制模块为其I / O bank内的字节组块提供控制接口。当需要多I / O bank实现时,给定I / O bank中的每个PHY控制块控制该bank中的字节组元素。这要求PHY控制块与其相邻的PHY控制块保持同相。中央PHY控制模块被配置为三个I / O bank实施的主控制器。对于两个银行实施,可以将任一PHY控制块指定为主控制器。

PHY控制接口由校准逻辑或存储器控制器用于将PHY控制字写入PHY。该接口中的信号与PHY_Clk同步,如1-83所示。这是一个基本的FIFO式界面。当PHY_Ctl_WrEn为高且PHY_Ctl_Full为低时,在PHY_Clk的上升沿将控制字写入控制字FIFO。对于多I / O bank PHY,必须将相同的控制字写入每个PHY控制模块才能正常工作。

1-83        PHY控制接口

信号

方向

描述

PHY_CLK

输入

这是控制字FIFOPHY接口时钟。PHY控制字信号在该时钟的上升沿捕获。

PHY_Ctl_Wr_N

输入

该低电平有效信号是控制字FIFO的写使能信号。当该信号有效时,控制字在PHY_Clk的上升沿写入控制字FIFO

PHY_Ctl_Wd [310]

输入

这是1-84描述的PHY控制字。

PHY_Ctl_Full

产量

该高电平有效输出是控制字FIFO的完整标志。它表明FIFO不能再接受控制字和块写入控制字FIFO

PHY_Ctl_AlmostFull

产量

该高电平有效输出是控制字FIFO的几乎满标志。它表示只要PHY_Ctl_Full信号无效,FIFO就可以接受不超过一个附加控制字。

PHY_Ctl_Ready

产量

PHY控制模块准备好开始接收命令时,该高电平有效输出置位。

PHY控制字分为几个字段,如1-84 所示。

1-84        PHY控制字

3

1

3

0

2

9

2

8

2

7

2

6

2

2

4

2

3

2

2

2

1

2

0

1

9

1

8

1

7

1

6

1

1

4

1

3

1

2

1

1

1

0

9

8

7

6

4

3

2

1

0

Act Pre

事件延迟

CAS插槽

SEQ

 

数据偏移

 

保留ved

低指数

AUX_OUT

控制偏移

PHY Cmd

•       PHY命令 - 该字段定义了PHY控制模块为管理通过专用PHY的命令和数据流而采取的操作。PHY命令是:

°写入(Wr - 0x01  - 该命令指示PHY控制模块读取地址,命令和数据OUT_FIFO,并将从这些FIFO读取的数据传输到与其关联的IOI

°读(Rd - 0x03  - 该命令指示PHY控制模块读取地址,命令OUT_FIFO,并将从这些FIFO中读取的数据传输到与其关联的IOI。另外,从存储器读取的数据在从数据IOI到达数据IN_FIFO之后被传送。

°       非数据(ND - 0x04  - 该命令指示PHY控制模块读取地址和命令OUT_FIFO,并将从这些FIFO读取的数据传输到其相关的IOI

•       控制偏移量 - 此字段用于控制何时读取地址和命令IN / OUT_FIFO并将其传输到IOI。控制偏移量以DDR2DDR3 SDRAM时钟周期为单位。

•       辅助输出 - 该字段用于控制何时使用辅助输出信号(Aux_Output [30])。辅助输出可以配置为在读取和写入命令期间激活。定时偏移和持续时间由1-85,第128页中描述的属性控制。这些输出不被MIG工具生成的DDR2DDR3接口使用它们被设置为0

•       低索引(Bank - 专用PHY具有内部计数器,需要此字段指定用于数据命令的八个DDR2DDR3 SDRAM存储区中的哪一个。MIG IP内核不使用这些内部计数器因此,该字段应该全部为零。

•       保留 - 该字段必须始终设置为2'b00 

•       数据偏移量 - 此字段用于根据PHY命令控制何时读取或写入数据IN / OUT_FIFO。数据偏移量以DDR2DDR3 SDRAM时钟周期为单位。

•       Seq - 该字段包含一个序列号,与 来自PLL Sync_In 控制信号结合使用,以保持两个或更多PHY控制块执行从各自控制队列读取的命令同步。具有给定seq值的命令必须在Seq字段指定的特定阶段期间由PHY控制块内的命令解析器执行。

•       CAS插槽 - 存储器控制器用于写入/读取(CAS)命令的插槽号。

•       事件延迟 - 专用PHY具有内部计数器,需要此字段指定加载到这些计数器的延迟值。事件延迟以DDR2DDR3 SDRAM时钟周期为单位。MIG IP内核不使用这些内部计数器因此,该字段应该全部为零。

•       激活预充电 - 专用PHY的内部计数器需要此字段指定与事件延迟计数器相关的DDR2DDR3命令的类型。有效值是:

                        °       00:无动作

                        °       01:激活

                        °       10:预充电

                        °        11:预充/激活。

MIG IP内核不使用这些内部计数器因此,该字段应该全部为零。

1-85        辅助输出属性

属性

类型

描述

MC_AO_WRLVL_EN

矢量[30]

该属性指定在PC_Enable_Calib [1]信号指定的写入均衡期间相关的Aux_Output是否处于活动状态。例如,此属性指定写入均衡期间ODT是否处于活动状态。

WR_CMD_OFFSET_0

矢量[50]

此属性指定在执行相关写命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。例如,该属性可确保ODT信号在正确的时钟周期内生效,以符合JEDEC ODTLonODTLoff规范。

WR_DURATION_0

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在写入命令中保持活动状态的时间。例如,该属性可确保ODT信号在正确的时钟周期内生效,以符合JEDEC ODTLonODTLoff规范。

RD_CMD_OFFSET_0

矢量[50]

该属性指定在执行关联的读命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

RD_DURATION_0

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在读取命令中保持活动的时间。

WR_CMD_OFFSET_1

矢量[50]

此属性指定在执行相关写命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

WR_DURATION_1

矢量[50]

此属性指定DDR2DDR3 SDRAM时钟周期内辅助输出在写入命令中保持有效的时间。

RD_CMD_OFFSET_1

矢量[50]

该属性指定在执行关联的读命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

RD_DURATION_1

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在读取命令中保持活动的时间。

WR_CMD_OFFSET_2

矢量[50]

此属性指定在执行相关写命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

WR_DURATION_2

矢量[50]

此属性指定DDR2DDR3 SDRAM时钟周期内辅助输出在写入命令中保持有效的时间。

RD_CMD_OFFSET_2

矢量[50]

该属性指定在执行关联的读命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

RD_DURATION_2

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在读取命令中保持活动的时间。

WR_CMD_OFFSET_3

矢量[50]

此属性指定在执行相关写命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

WR_DURATION_3

矢量[50]

此属性指定DDR2DDR3 SDRAM时钟周期内辅助输出在写入命令中保持有效的时间。

1-85         辅助输出属性 (续)

属性

类型

描述

RD_CMD_OFFSET_3

矢量[50]

该属性指定在执行关联的读命令后,DDR2DDR3 SDRAM时钟周期中辅助输出变为活动状态的时间。

RD_DURATION_3

矢量[50]

此属性指定在DDR2DDR3 SDRAM时钟周期内辅助输出在读取命令中保持活动的时间。

CMD_OFFSET

矢量[50]

此属性指定执行相关命令后DDR2DDR3 SDRAM时钟周期中由AO_TOGGLE定义的辅助输出切换的时间。

AO_TOGGLE

矢量[30]

该属性指定哪些辅助输出处于切换模式。在CMD_OFFSET过期后,在PHY控制字中将相关的AO位置1时,反转模式下的辅助输出会反转。

PHY控制模块有多个未启用的计数器,因为在PHY_ClkDDR2DDR3 SDRAM时钟频率的1/41/2频率时使用同步模式。

PHY_Clk的每个上升沿,一个PHY控制字被发送到PHY控制模块,其中有四个存储器时钟周期值的命令和一个2Seq计数值。在同步操作模式下,对控制FIFO的写入使能始终置为有效,并且在有效命令之间不发出操作(NOP)命令。Seq计数必须每增加4个命令序列。Seq字段用于同步跨多个I / O bankPHY控制块。

DDR3 SDRAM RESET_N 信号直接由FPGA逻辑控制,而不是PHY控制字。RDIMM接口的DDR2 SDRAM RESET_N 信号直接由FPGA逻辑控制,而不是PHY控制字。PHY控制模块与PHASER_OUT一起,在读取和写入命令期间生成写入DQSDQ / DQS 3态控制信号。

PHY cmd字段是根据四个命令的序列是否具有写入,读取或者两者都不是。如果在命令序列中存在写入请求,PHY cmd字段被设置为写入。如果在命令序列中有读取请求,则它被设置为读取,并且如果在命令序列中既没有写入请求,也没有读取请求,则它被设置为非数据。写入和读取请求不能在四个命令序列中发出。PHY控制字中的控制偏移字段定义何时读取命令OUT_FIFO并将其传输到IOLOGIC。数据偏移量定义何时读取数据OUT_FIFO相对于正在读取的命令OUT_FIFO。对于读取命令,数据偏移在校准期间确定。

命令路径

校准逻辑或存储控制器请求的命令作为PHY控制字发送到PHY控制模块并同时输入到PHY控制模块

地址/控制/命令OUT_FIFO。由于每个PHY_Clk周期需要四个存储器时钟周期,所以每个地址/控制/命令信号必须具有四个存储器时钟周期的值。

有三种类型的命令:

•       使用自动预充电写入命令,包括写入和写入。这两个写命令的PHY控制字中的PHY命令值是相同的(0x01 )。不同的是输入到OUT_FIFO的地址值。在地址OUT_FIFO中使用自动预充电进行写入时,地址位A101

•       使用自动预充电读取命令,包括读取和读取。这两个读命令的PHY控制字中的PHY命令值是相同的(0x11 )。不同的是输入到OUT_FIFO的地址值。地址位A101,用于在地址OUT_FIFO中进行自动预充电。

•       非数据命令,包括模式寄存器设置,刷新,预充电,预充所有存储区,激活,不操作,取消选择,ZQ校准长和ZQ校准短。所有这些命令的PHY控制字中的PHY命令值是相同的

0x100 )。输入到与这些命令关联的OUT_FIFO RAS_N CAS_N WE_N ,库地址和地址值不同。

1-56 显示了地址/控制/命令路径的框图。OSERDES用于单数据速率(SDR)模式,因为地址/控制/命令是SDR 信号。PHY控制字符合PHY_Ctl_Wr_N 信号,OUT_FIFO符合PHY_Cmd_WrEn 信号。FPGA逻辑无需在PHY控制块的有效命令之间的长时间等待期间发出NOP命令,因为地址/命令专用PHY中的默认值可根据需要设置为

 

OUT_FIFO输出到FPGA引脚的地址/命令路径的时序图如图1-57 所示。

 

数据路径

数据路径包含写入和读取数据路径。7系列FPGA中的数据通路完全采用专用逻辑实现,IN / OUT_FIFO连接FPGA逻辑。除了时钟域交叉之外,IN / OUT_FIFO还提供数据通路串行化/解串行,从而允许FPGA逻辑在DDR2DDR3 SDRAM时钟的1/4频率的低频下工作。1-58 显示了数据路径的框图。

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值