昨晚找了一下,发现DDR3读写在工程上多是通过例化MIG,调用生成IPcore的HDL Functional Model。我说嘛,自己哪能写出那么繁琐的,不过DDR读写数据可以用到状态机,后期再添砖加瓦吧,当下先对比一下网上找的一段程序和自己例化后的程序。
另外,仿真了十余分钟,最后的是什么鬼?一头雾水T.T。想着每一次要分析信号要等那么久就难受。
更重要的是分享一波关于“Xilinx平台下DDR3设计教程”的资料。就其中的“仿真篇”而言,亲测可行,还是中文版
datasheet看着亲切。0.0
********************20170519更新:确定关键信号及学习博客********************
前天师兄确定说是利用MIG IP core进行例化,参考了几份关于UG重点详解:https://wenku.baidu.com/view/63e8c92d195f312b3069a5ea.html
http://blog.chinaaet.com/chinaaetwoaini/p/5100050615
更重要的是找到了“XILINX DDR3 IP核使用教程完版”http://download.csdn.net/download/kpsuwen/9374463
do sim.do仿真后加入“app_cmd、app_addr、app_en、app_rdy、app_wdf_wren、app_wdf_end、app_wdf_rdy、app_wdf_data”等用户核心信号(下图是UG586文档第58页中的“内存接口示意图”)。我们主要关心的是左侧关于写操作的交互信号。
********************20170520更新:对用户信号进行总结及简单的读写时序********************
这几个信号的分析总结在“XILINX DDR3 IP核使用教程完版”中都有所提及,我就稍微的总结一下:
1.写操作由两套系统:地址域和数据域。
1.1.地址域:在地址域上,app_rdy(controlled by DDR3)、app_en(controlled by user)同时拉高为1时地址app_addr(29bit=rank 1+bank 3+row 15+ column 10)才有效;
1.2.数据域:在数据域上,app_wdf_rdy(controlled by DDR3)、app_wdf_wren(controlled by user)同时拉高为1时数据app_wdf_data才有效。
1.3.app_wdf_data和app_rd_data[APP_DATA_WIDTH-1:0]信号都是数据信号,其中“2 * nCK_PER_CLK * PAYLOAD_WIDTH”,“nCK_PER_CLK=4”,“PAYLOAD_WIDTH = (ECC_TEST == "OFF") ? DATA_WIDTH : DQ_WIDTH”,“ECC_TEST == OFF”故“PAYLOAD_WIDTH =DATA_WIDTH=64”。2*4*64=512。数据位宽与BL有关,BL=8表示DDR3-SDRAM每次可以写入8个64bit数据,512bit
1.4.地址和数据不一定需要同步,可提前或者滞后两个时钟,见下图。另外下图也可看出命令信号app_cmd和地址信号app_addr是对齐绑定的,而不和数据域绑定。
写通道:
读通道:
2.读操作
写时序仿真结果图:
分析:以clk为基础时钟,“app_en=1、app_rdy=1”时“app_addr”有效,四个时钟,写入了四个地址,另外需要强调一点的是:
app_addr[ADDR_WIDTH – 1:0] 是ddr3的地址,精确到每个col地址,但是因为实际突发长度(Burst Length)要求8所以每个数据都是第4位开始。因此第四位开始app_addr进行二进制增加。
读时序仿真结果图:
分析:暂时搁置
********************20170521更新:关于V7系列的mig例化********************
早上大致看了以下师兄給的VC709板关于mig例化仿真文档,双BANK,先是bank a,再是bank b,最后bank a_b,xilinx 用K7系列和V7系列例化的过程几乎一致,只是V7的这份user guide的仿真环境是vivado,用ise应该是一样的效果,今天中午的问题卡在了在例化过程中加入.dxc引脚文件时报错了,见下图:
郁闷的很,大概直译一下“对于某些端口,即使对于所选择的配置是必需的,也不提供位置约束。 以下是提供的UCF中缺少的端口:ddr3_addr[15]”,ddr3_addr[15:0],16bit,单单最后这位的引脚配置报错,我尝试手动输入这120余个引脚信息,但是IO standard又不能强行输入,就放弃了此想法。sublime打开xilinx官网down的dxc文件,找到ddr3_addr[15]口,见下图:
对比了一下ddr3_addr[15]和ddr3_addr[14:0]之间的差别,没发现有毛病。难道我思考方向错了?!
花了40min中,按照dxc中的信息强行把管脚配置完毕,人工配置太累了,下图是配置管脚后的:
输入完后系统会识别IO标准:
终于又可以继续了... ...
**********20170713更新:上面遇到的问题是因为ise不支持xdc引脚文件的缘故,vivado平台下正常**********
Here is the Summary
********************20170522更新:DDR3内部核心频率、时钟频率、数据传输频率********************
1.核心频率/Core Frequency/:(解释1)内存cell阵列的工作频率,它是内存的真实运行频率。(解释2)每款芯片都有其自己的极限频率,这个极限频率就是内存的核心频率,或者说是它能正常工作的频率,因此把内存的频率称为内存的真实频率。
2.时钟频率:(解释1)I/O Buffer(输入/输出缓存)的传输频率。(解释2)内存作为数字逻辑芯片,本身不产生频率,频率是主板上的频率发生器外加给它的,主板上产生的这个频率称为时钟频率。
3.数据传输频率:内存与系统交换数据的频率,也称为内存的等效频率或者接口频率。
*****三者在内存中的关系*****
核心频率就是内存的工作频率,到DDR2、DDR3才有了时钟频率概念,时钟频率是将核心频率通过倍频技术得到的一个频率。///DDR内存核心频率和时钟频率相同,但在传输数据的时候在脉冲的上升沿和下降沿都传输了一次,所以数据传输频率是核心频率的2倍;DDR2内存将核心频率倍频2倍得到了时钟频率,同样在上升沿和下降沿各传输一次数据,所以数据传输频率就是核心频率的4倍、时钟频率的两倍;DDR3内存的时钟频率是核心频率的4倍,同样在上升沿和下降沿各传输一次数据,所以数据传输频率就是核心频率的8倍。
Following are three examples.
DDR2-800:核心频率200MHz,时钟频率400MHz,数据传输频率800MHz;
DDR3-800:核心频率100MHz,时钟频率400MHz,数据传输频率800MHz;
DDR3-1066:核心频率166MHz,时钟频率533MHz,数据传输频率1066MHz.