cyclone V控制DDR3的读写,quartusII配置DDR3 ip核后,如何调用实现DDR3的读写呢,谢谢

2019-07-15 23:07发布

DDR3的IP核配置完毕后,产生了好多文件,请问如何调用这些文件实现DDR3的读写呢?看了一些文章,说是要等到local_init_done为高电平后,才能进行读写操作。请问DDR3的控制命令如RASn,CASn等,是IP核自动产生的么?要如何配置条件,给DDR3写入数据并读取DDR3的数据,谢谢,现在头绪不清,第一次做,拜托各位解惑了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
twz
1楼-- · 2019-07-16 00:59
本帖最后由 twz 于 2016-1-14 20:48 编辑

没有用过Altera的芯片,只用过Xilinx的。但是原理应该差不多。所谓DDR3 IP核,实际上是DDR3控制器。这个控制器的接口有两类,一类面向用户,另一类直接连到DDR3芯片。它起什么作用呢?实际上就是简化DDR3的读写时序(因为直接实现DDR3读写时序太复杂了)。用户只要通过操作控制器的用户接口,就可以实现DDR3的读写操作了。控制器可以自动完成DDR3的初始化,并根据用户接口产生DDR3的读写时序,自动产生楼主说的RASn,CASn,WE, DQ这些信号,从而实现DDR3的读写。一般配置完IP后,在该IP目录下会生成仿真文件,可以通过运行这个现成的仿真文件来熟悉DDR3 IP的使用。另外要有看user_guide的习惯,user_guide里会介绍IP的使用方法。
ttnba
2楼-- · 2019-07-16 02:20
楼上的写得很好!让我明白了IP的作用!向你学习!还有什么相关资料吗
兰儿
3楼-- · 2019-07-16 04:07
twz 发表于 2016-1-14 20:46
没有用过Altera的芯片,只用过Xilinx的。但是原理应该差不多。所谓DDR3 IP核,实际上是DDR3控制器。这个控制器的接口有两类,一类面向用户,另一类直接连到DDR3芯片。它起什么作用呢?实际上就是简化DDR3的读写时序(因为直接实现DDR3读写时序太复杂了)。用户只要通过操作控制器的用户接口,就可以实现DDR3的读写操作了。 ...

谢谢您的回答。您说的IP控制器产生的两类接口,altera的DDR3 ip产生的文件中生成的接口如下:
module ddr3ip (
                input  wire        pll_ref_clk,               //      pll_ref_clk.clk
                input  wire        global_reset_n,            //     global_reset.reset_n
                input  wire        soft_reset_n,              //       soft_reset.reset_n
                output wire        afi_clk,                   //          afi_clk.clk
                output wire        afi_half_clk,              //     afi_half_clk.clk
                output wire        afi_reset_n,               //        afi_reset.reset_n
                output wire        afi_reset_export_n,        // afi_reset_export.reset_n
                output wire [14:0] mem_a,                     //           memory.mem_a
                output wire [2:0]  mem_ba,                    //                 .mem_ba
                output wire [0:0]  mem_ck,                    //                 .mem_ck
                output wire [0:0]  mem_ck_n,                  //                 .mem_ck_n
                output wire [0:0]  mem_cke,                   //                 .mem_cke
                output wire [0:0]  mem_cs_n,                  //                 .mem_cs_n
                output wire [1:0]  mem_dm,                    //                 .mem_dm
                output wire [0:0]  mem_ras_n,                 //                 .mem_ras_n
                output wire [0:0]  mem_cas_n,                 //                 .mem_cas_n
                output wire [0:0]  mem_we_n,                  //                 .mem_we_n
                output wire        mem_reset_n,               //                 .mem_reset_n
                inout  wire [15:0] mem_dq,                    //                 .mem_dq
                inout  wire [1:0]  mem_dqs,                   //                 .mem_dqs
                inout  wire [1:0]  mem_dqs_n,                 //                 .mem_dqs_n
                output wire [0:0]  mem_odt,                   //                 .mem_odt
                output wire        avl_ready,                 //              avl.waitrequest_n
                input  wire        avl_burstbegin,            //                 .beginbursttransfer
                input  wire [25:0] avl_addr,                  //                 .address
                output wire        avl_rdata_valid,           //                 .readdatavalid
                output wire [63:0] avl_rdata,                 //                 .readdata
                input  wire [63:0] avl_wdata,                 //                 .writedata
                input  wire [7:0]  avl_be,                    //                 .byteenable
                input  wire        avl_read_req,              //                 .read
                input  wire        avl_write_req,             //                 .write
                input  wire [2:0]  avl_size,                  //                 .burstcount
                output wire        local_init_done,           //           status.local_init_done
                output wire        local_cal_success,         //                 .local_cal_success
                output wire        local_cal_fail,            //                 .local_cal_fail
                input  wire        oct_rzqin,                 //              oct.rzqin
                output wire        pll_mem_clk,               //      pll_sharing.pll_mem_clk
                output wire        pll_write_clk,             //                 .pll_write_clk
                output wire        pll_locked,                //                 .pll_locked
                output wire        pll_write_clk_pre_phy_clk, //                 .pll_write_clk_pre_phy_clk
                output wire        pll_addr_cmd_clk,          //                 .pll_addr_cmd_clk
                output wire        pll_avl_clk,               //                 .pll_avl_clk
                output wire        pll_config_clk,            //                 .pll_config_clk
                output wire        pll_mem_phy_clk,           //                 .pll_mem_phy_clk
                output wire        afi_phy_clk,               //                 .afi_phy_clk
                output wire        pll_avl_phy_clk            //                 .pll_avl_phy_clk
        );
其中的output wire [14:0] mem_a,                     //           memory.mem_a
                output wire [2:0]  mem_ba,                    //                 .mem_ba
                output wire [0:0]  mem_ck,                    //                 .mem_ck
                output wire [0:0]  mem_ck_n,                  //                 .mem_ck_n
                output wire [0:0]  mem_cke,                   //                 .mem_cke
                output wire [0:0]  mem_cs_n,                  //                 .mem_cs_n
                output wire [1:0]  mem_dm,                    //                 .mem_dm
                output wire [0:0]  mem_ras_n,                 //                 .mem_ras_n
                output wire [0:0]  mem_cas_n,                 //                 .mem_cas_n
                output wire [0:0]  mem_we_n,                  //                 .mem_we_n
                output wire        mem_reset_n,               //                 .mem_reset_n
                inout  wire [15:0] mem_dq,                    //                 .mem_dq
                inout  wire [1:0]  mem_dqs,                   //                 .mem_dqs
                inout  wire [1:0]  mem_dqs_n,                 //                 .mem_dqs_n
                output wire [0:0]  mem_odt,                   //                 .mem_odt
是DDR3的接口,请问您说的面向用户的接口产生读写时序,如实现向DDR3写数据操作,是我直接给DDR3的DQ赋给数据就可以么?哪些信号是用户接口用于实现写操作呢?
谢谢您啦,对DDR3这块儿真的是不太明白
远去的背影
4楼-- · 2019-07-16 05:51
你好,你的DDR3调试的怎么样了?最近我也在调,想咨询你几个问题
runileking
5楼-- · 2019-07-16 11:24
 精彩回答 2  元偷偷看……
初牛犊
6楼-- · 2019-07-16 14:05
twz 发表于 2016-1-14 20:46
没有用过Altera的芯片,只用过Xilinx的。但是原理应该差不多。所谓DDR3 IP核,实际上是DDR3控制器。这个控制器的接口有两类,一类面向用户,另一类直接连到DDR3芯片。它起什么作用呢?实际上就是简化DDR3的读写时序(因为直接实现DDR3读写时序太复杂了)。用户只要通过操作控制器的用户接口,就可以实现DDR3的读写操作了。 ...

你好大神,最近在调试xilinx的ddr3,由于开发板的问题,我必须把生成的ddr差分时钟改为单端时钟然后在自己添加个pll的ip接到ddr上,我想知道怎么把ddr的差分时钟改为单端时钟,然后怎么和pll相连,敬请大神指点迷经。

一周热门 更多>