一度由于DDR3的IP核使用而发狂。ide
后来由于解决问题,得一感悟。后面此贴会完整讲述ddr3 ip的使用。(XILINX K7)ui
感悟:对于有供应商支持的产品,遇到问题找官方的流程。按照官方的指导进行操做。因为使用软件版本不一样可能语法之间有出入或着不兼容,此时常识寻找下载版本最接近的官方Guide来操做,你就会发现解决那些莫名其妙问题的突破点。.net
问题:code
1.综合blog
a.问题:Unable to set attribute "DQS_AUTO_RECAL" with value "0" on instance <phaser_in_gen.phaser_in> of block <PHASER_IN_PHY>. This property is already defined with value "1" on the block definition by a VHDL generic or a Verilog parameter. Apply the desired value by overriding the default VHDL generic or Verilog parameter. Using an attribute is not allowed.ip
定位到代码:内存
generate产品
if ( PO_DATA_CTL == "TRUE" || ((RCLK_SELECT_LANE==ABCD) && (CKE_ODT_AUX =="TRUE"))) begin : phaser_in_genit
//(* DQS_AUTO_RECAL = DQS_AUTO_RECAL, DQS_FIND_PATTERN = DQS_FIND_PATTERN *) io
PHASER_IN_PHY #(...)
phaser_in(...)
else
...
根据code中,if语句里面的几个表达式真值最终括号中真值是0,所以不执行if转而执行else。所以这个部分就用不上了,因此code如何就无论。虽不知(*...*)是何语法,但问题可能出在这里。所以注释掉,从新综合。就能够了。
2.USE_DM_PORT=1 or =0.1表明使能DM(数据掩码)功能。(能够用,缘由有待探究)
即写入的数据是否有一部分须要被屏蔽掉。若是在IP核生成时选择checked dm,通常生成的代码中USE_DM_PORT会为1,这样就会正确生成bit文件。若是手动改成0(同在ip核生成页面选择not checked dm同样),就会致使实现过程失败。那么纠结的问题在于:仿真时USE_DM_PORT设为0,能够获得预期的结果(写了数,而后读,读到的数就是写进去的数)。而设为1时,结果就是错误的。读出来的数并不是写进去的数,并且看到仿真图中,写数据时,dm线是X(不定值)。dm为1则屏蔽数据。可是后来将USE_DM_PORT设为1,并下板运行。发现读到的数据经过串口发回来,刚好是写进去的数据。
3.另外一个在map过程当中出现的问题。
是关于双向数据引脚的约束问题。经过官方的solution解决,“CONFIG DCI_CASCADE = "33 32 34";”具体后面再加上来。
如今达到的效果:连续写入8次数据,而后连续读出来,数据正确。继续作一下只取其中几回的数据...看是否正确2015.11.15?
4.要读的数据相应的地址(已查明)—查看内存颗粒相应手册。关于Burst Type的解说。
引用其中一句话:The ordering of accesses within a burst is determined by the burst length, the burst type, and the starting column address。
在一个突发传输中访问数据的顺序取决于突发长度、类型及开始的列地址。
真相以下图。
突发长度BL=8.本实例中采用的ddr3,是一个rank,数据位宽64bit,那么进行一次数据突发传输,将传送8*64bit的数据。若是进行8次这样的突发传输——
写:他们的列地址依次是10‘h0、10'h八、10'h十、10'h1八、10'h20、10'h2八、10'h30、10'h38.等
读:他们的列地址依次是10‘h0、10'h八、10'h十、10'h1八、10'h20、10'h2八、10'h30、10'h38.等
问题现象:
读地址是上面写的地址时,数据读取正确。假如赋予的读地址是10'h三、10'h5等,那么读出来的数据就不是咱们觉得的10'h3-10'ha地址对应的数据。
转载:http://blog.csdn.net/dawnhan/article/details/49783535