ddr2 刷新问题
.selfrefresh_enter (1'b0), //如果给1,进入刷新模式是不能读写数据的,我没有退出,如果之后再给0,应该是可以继续进行读写的。
.selfrefresh_mode (c1_selfrefresh_mode)
他这种默认设置是没有进入自刷新模式。
查看ug388手册描述如下
selfrefresh_enter
Input
This input is rising-edge sensitive. When asserted,
the MCB requests the memory device to enter self-
refresh mode. The signal must remain asserted until
the selfrefresh_mode signal goes active.
通过上述资料可以确定,自动生成的IP core没有配置刷新设置。
我测试代码能够实现读写数据一致,读写长度为128byte,在配置读写命令的时候,加上刷新与不加没发现数据有什么变化。
整体下来,我没有做刷新设置处理,可是数据还是正确的。
我想了解一下刷新要在什么情况下起作用,什么时候必须配置刷新?
1.self-refresh一般是ddr在low-power的情况下用的,以此来保持dram里面的data。
2.dram一般而言的refresh是auto-refresh,就是普通的refresh cmd,这个是在normal状态下保持dram的data的,有别于self-refresh。
3.另外你测试refresh能不能保持data的时候,你的方法有点问题,因为你先写如dram一个data,对应的dram的某一个row就被active了,如果你还停留在这个address,那么这个被active的row是不需要刷新也可以保持data的。
4.建议你先写addr1,然后再写addr2(和addr1跨度比较大),然后再读addr1,看看你之前写入到addr1的data还能不能保持。
您好:我将写入数据的地址递增幅度加大,
assign wr_bank_address[1:0] = wr_address[24:23] ;
assign wr_ras_address[12:0] = wr_address[22:10] ;
assign wr_cas_address[9:0] = wr_address[9:0] ;
每次加14‘b10_0000_0100_0000
[attach]630626[/attach]
上图是我用chipscope抓出来的,放大之后对比,数据还是正确的,
我现在设置是,先写入数据,写进去好多数据之后开始发送读命令,一直读之前被写的一个地址,发现读出来的数据不对。
我在每次发送读写命令的时候都带着刷新命令了
c3_p2_cmd_instr = 3’b011 ;
c3_p3_cmd_instr = 3'b010 ;
我对于刷新不了解,如果不是上述那样给命令的话,我再继续看手册,希望您能给予肯定的答复。

你现在想确定的问题是不刷新为什么读写还正确?
1.首先,正常模式下的refresh不是你说的那个self-refresh,和这个一点关系都没有,这个self-refresh一般设定为0,就是不进入self-refresh。
2.看一下你在generate ddr ip的时候有没有refresh相关的设定,比如说refresh 周期是多少,时候disable refresh cmd,也许xilinx的ddr ip的control不能够disable refresh cmd。
3.如果不disable refresh cmd的话,xilinx的ddrc会根据设定的refresh时间,周期性的发出refresh cmd,所以无论你怎样读写data,都能够保持。
对,我就是想知道我不给刷新命令为什么还能够读出正确的数据, 我重新进入ip core里面查看,只有一个高温是否进入自刷新模式,我在生成的txt文件里面找到了我的配置。
High Temparature Self Refresh Rate : Disable
查看手册,发现在生成的ddr2顶层配置如下
localparam C1_MEM_TRAS = 40000;
localparam C1_MEM_TRCD = 15000;
localparam C1_MEM_TREFI = 7800000;
localparam C1_MEM_TRFC = 105000;
localparam C1_MEM_TRP = 15000;
localparam C1_MEM_TWR = 15000;
localparam C1_MEM_TRTP = 7500;
localparam C1_MEM_TWTR = 7500;
localparam C1_MEM_DDR3_AUTO_SR = "ENABLED";
Possible values: “ENABLED“, “MANUAL“(这个配置只适合DDR3,是不是只能在ddr3的情况才可以用户去配置刷新命令,ddr2只能受ip core 自动刷新呢?)
在其他的地方没有发现Self Refresh是解释自刷新的时序。
对于refresh 是在告诉数据流的时候产生该命令,read with refresh 是在跨行的情况去操作,
我现在是跨多行,不刷新,去读取之前的数据都能读出来,也都是正确的。
我之前了解一点sdram,那个好像是每次操作完都要刷新一次,可是现在发现刷新命令就没起作用,也没看到有配置进入自刷新模式。
您看我应该怎么去验证这个东西还是再仔细看手册呢?我打算建一个ddr3看看能否更改那个自刷新配置。
对,我就是想知道我没有设置刷新,为什么还能正确的读出来数据。
根据您的提示,我重新看一下ddr2 ip core ,发现只有在高温的时候可以配置是否进入self refresh
生成的txt里面有 High Temparature Self Refresh Rate : Disable
查看手册,有几个参数配置,看了一下ddr2 生成的顶层,参数配置如下:
localparam C1_MEM_TRAS = 40000;
localparam C1_MEM_TRCD = 15000;
localparam C1_MEM_TREFI = 7800000;
localparam C1_MEM_TRFC = 105000;
localparam C1_MEM_TRP = 15000;
localparam C1_MEM_TWR = 15000;
localparam C1_MEM_TRTP = 7500;
localparam C1_MEM_TWTR = 7500;
还发现一个地方
localparam C1_MEM_DDR3_AUTO_SR = "ENABLED"; (手册上说这个配置只适合ddr3,Possible values: “ENABLED“, “MANUAL“ ,我想是不是只有ddr3可以配置为设计者能够去定义刷新,ddr2不可以配置,只能自动刷新)
其余的地方提到self refresh 是说时序的。
refresh介绍是高速数据流的时候发送该命令,read with refresh 跨行的时候配置,
我现在是跨好多行,不配置刷新命令,但是还能读出正确数据。
您看我现在再仔细看手册还是应该怎么去验证?我打算新建一个ddr3 ip core ,看看能否可配置。
回复 5# gjb649666926
对,我就是想知道我没有设置刷新,为什么还能正确的读出来数据。
根据您的提示,我重新看一下ddr2 ip core ,发现只有在高温的时候可以配置是否进入self refresh
生成的txt里面有 High Temparature Self Refresh Rate : Disable
查看手册,有几个参数配置,看了一下ddr2 生成的顶层,参数配置如下:
localparam C1_MEM_TRAS = 40000;
localparam C1_MEM_TRCD = 15000;
localparam C1_MEM_TREFI = 7800000;
localparam C1_MEM_TRFC = 105000;
localparam C1_MEM_TRP = 15000;
localparam C1_MEM_TWR = 15000;
localparam C1_MEM_TRTP = 7500;
localparam C1_MEM_TWTR = 7500;
还发现一个地方
localparam C1_MEM_DDR3_AUTO_SR = "ENABLED"; (手册上说这个配置只适合ddr3,Possible values: “ENABLED“, “MANUAL“ ,我想是不是只有ddr3可以配置为设计者能够去定义刷新,ddr2不可以配置,只能自动刷新)
其余的地方提到self refresh 是说时序的。
refresh介绍是高速数据流的时候发送该命令,read with refresh 跨行的时候配置,
我现在是跨好多行,不配置刷新命令,但是还能读出正确数据。
您看我现在再仔细看手册还是应该怎么去验证?我打算新建一个ddr3 ip core ,看看能否可配置。
回复 5# gjb649666926
对,我就是想知道我没有设置刷新,为什么还能正确的读出来数据。
根据您的提示,我重新看一下ddr2 ip core ,发现只有在高温的时候可以配置是否进入self refresh
生成的txt里面有 High Temparature Self Refresh Rate : Disable
查看手册,有几个参数配置,看了一下ddr2 生成的顶层,参数配置如下:
localparam C1_MEM_TRAS = 40000;
localparam C1_MEM_TRCD = 15000;
localparam C1_MEM_TREFI = 7800000;
localparam C1_MEM_TRFC = 105000;
localparam C1_MEM_TRP = 15000;
localparam C1_MEM_TWR = 15000;
localparam C1_MEM_TRTP = 7500;
localparam C1_MEM_TWTR = 7500;
还发现一个地方
localparam C1_MEM_DDR3_AUTO_SR = "ENABLED"; (手册上说这个配置只适合ddr3,Possible values: “ENABLED“, “MANUAL“ ,我想是不是只有ddr3可以配置为设计者能够去定义刷新,ddr2不可以配置,只能自动刷新)
其余的地方提到self refresh 是说时序的。
refresh介绍是高速数据流的时候发送该命令,read with refresh 跨行的时候配置,
我现在是跨好多行,不配置刷新命令,但是还能读出正确数据。
您看我现在再仔细看手册还是应该怎么去验证?我打算新建一个ddr3 ip core ,看看能否可配置。

回复 5# gjb649666926 这两个是我发现在生成ddr2和ddr3的配置区别
我之前发的回复不知道为什么需要管理员审核,一直发布出去!
好东西就要分享
好东西就要分享
1.再强调一下,dram正常的刷新不叫self-refresh,self-refresh是dram进入low power模式下的refresh,你可以查看ddr2 spec的cmd 真值表,普通的refresh的cke=1,csn=0,ras=0,cas=0,wen=1,而self-refresh必须要cke拉低,请你不要混淆了这两种refresh,你在文中多次提到的refresh都是self-refresh。
2.另外,看起来你生成的ddr的ip不能够disable refresh。也就是说你的controller会周期性的发出refresh 命令,哪个trefi就是refresh的书信周期,如果disable不了,你可以尝试把这个parameter设定很大,例如放大100倍,或者1000倍甚至更大,这样ddr controller就会隔很长时间再发出一个refresh命令。
3.然后你再试试跨row去读写。
另外,这更ddr2或者是ddr3没有关系,ddr2和ddr3本来就没有什么本质区别,只是速度不同以及一些mode不一样罢了,基本的read/write/active/precharge/refresh都是一样的。
您好:
1、经过更改,总是有错误,能编译通过,下载到电路板里,跑的一直是之前的程序。 下面是报错信息,
ERRORIT:242 - Attribute MEM_REFI_VAL on MCB instance
在ug388文档里
In general, the MIG tool or IP Configurator tools are responsible for setting all parameter values, so the values should not be modified directly.
没有说不可以更改参数,
我将localparam C1_MEM_TREFI = 7800000; 参数上调,发现每次编译都报上面那个错误,不影响生成.bit ,
我读请求分两种情况都测试了,一种是洗完之后大约100个时钟,第二种是根据写了好多个地址之后发送一个读请求。
将这个参数移到顶层也是如此;
我将这个C1_MEM_BURST_LEN参数改变也没有上述错误。
如果我将参数改小就没有上述那个错误。如果调到9000000这种情况是可以的,扩大0.5倍都有问题,但是读取到的数据还是正确的。是不是我这样改不可以呢?
2、
self_refresh和refresh应该是没有冲突的吧?如果有self_refresh就不需要refresh了吧?
您好:
1、经过更改,总是有错误,能编译通过,下载到电路板里,跑的一直是之前的程序。 下面是报错信息,
ERRORIT:242 - Attribute MEM_REFI_VAL on MCB instance
在ug388文档里
In general, the MIG tool or IP Configurator tools are responsible for setting all parameter values, so the values should not be modified directly.
没有说不可以更改参数,
我将localparam C1_MEM_TREFI = 7800000; 参数上调,发现每次编译都报上面那个错误,不影响生成.bit ,
我读请求分两种情况都测试了,一种是洗完之后大约100个时钟,第二种是根据写了好多个地址之后发送一个读请求。
将这个参数移到顶层也是如此;
我将这个C1_MEM_BURST_LEN参数改变也没有上述错误。
如果我将参数改小就没有上述那个错误。如果调到9000000这种情况是可以的,扩大0.5倍都有问题,但是读取到的数据还是正确的。是不是我这样改不可以呢?
2、
self_refresh和refresh应该是没有冲突的吧?如果有self_refresh就不需要refresh了吧?
1.self-refresh和normal refresh有区别,DRAM interface的控制信号不一样,CKE就不一样,不可能在normal的模式下做self-refresh的。
2.修改IP的parameter不行的话,我也没有其他的方法了。
3.实在不行,你可以在你generate的IP外对ras/cas/wen这几根信号线做一下mux,当{ras,cas,wen} = 3'b001的时候,也就是refresh的时候,你强制让{ras,cas,wen}变成3‘b111,也就是nop指令,这样就在硬件上面彻底屏蔽掉refresh command了。
