FPGA-ddr3 MIG IP核的使用

1. MIG配置

1.1. xilinx FPGA芯片分类

1.1.1. A7 K7 (纯FPGA)

MIG IP核有两种接口 native和AXI4接口

  • native接口
    在这里插入图片描述

  • axi4接口
    在这里插入图片描述

1.1.2. ZYNQ (异构)

在这里插入图片描述

2. 配置

在这里插入图片描述

输入时钟周期 一般设为200Mhz

2.1. 如何选择系统的200M时钟?

在这里插入图片描述

1、外部50Mhz,通过FPGA的PLL锁相环 输出稳定的200M时钟
在这里插入图片描述

此时选择 no buffer【PLL输出默认勾选buffer】

2、如果外部直接输入 不通过pll
如果是差分的就使用diff 如果是单端就使用single ended

2.2. 如何选择参考时钟?

在这里插入图片描述

一般默认是200M 是固定死的 直接使用系统时钟就可以

2.3. XADC

1、监控开发板温度
2、模拟型号转化位数字信号

注意:XADC只能使用一次,在一个模块使用了XADC,在其他的模块就不能再使用了

3. 配置细节

3.1. 带宽

在这里插入图片描述

  1. 上图中两个双向箭头处的数据带宽是一样的
  2. 我们实际上就是在写左边的双线箭头部分的接口

带宽的计算:

  1. 用户端
    1. 200M * (4 * 32)
  2. axi端
    1. 800M * 16 * 2

3.2. no buffer是什么意思

no buffer就是MIG IP核内部没有例化IBUF原语

原语:在这里插入图片描述

4. 使用MIG IP核

4.1. 信号参数:

 // Memory interface ports   与axi进行数据交互的   不用管这部分的信号
    .ddr3_addr              (ddr3_addr            ),// output [13:0]    addr3_addr
    .ddr3_ba                (ddr3_ba              ),// output [2:0]		ddr3_ba
    .ddr3_cas_n             (ddr3_cas_n           ),// output			ddr3_cas_n
    .ddr3_ck_n              (ddr3_ck_n            ),// output [0:0]		ddr3_ck_n
    .ddr3_ck_p              (ddr3_ck_p            ),// output [0:0]		ddr3_ck_p
    .ddr3_cke               (ddr3_cke             ),// output [0:0]		ddr3_cke
    .ddr3_ras_n             (ddr3_ras_n           ),// output			ddr3_ras_n
    .ddr3_reset_n           (ddr3_reset_n         ),// output			ddr3_reset_n
    .ddr3_we_n              (ddr3_we_n            ),// output			ddr3_we_n
    .ddr3_dq                (ddr3_dq              ),// inout [15:0]		ddr3_dq
    .ddr3_dqs_n             (ddr3_dqs_n           ),// inout [1:0]		ddr3_dqs_n
    .ddr3_dqs_p             (ddr3_dqs_p           ),// inout [1:0]		ddr3_dqs_p
    .ddr3_cs_n              (ddr3_cs_n            ),// output [0:0]		ddr3_cs_n
    .ddr3_dm                (ddr3_dm              ),// output [1:0]		ddr3_dm
    .ddr3_odt               (ddr3_odt             ),// output [0:0]		ddr3_odt
    
    //MIG IP核初始化信号
    .init_calib_complete    (init_calib_complete  ),// output			init_calib_complete

    // Application interface ports   命令信号
    .app_addr               (app_addr             ),// input [27:0]		app_addr
    .app_cmd                (app_cmd              ),// input [2:0]		app_cmd
    .app_en                 (app_en               ),// input			app_en
    .app_rdy                (app_rdy              ),// output			app_rdy
    //写数据相关的信号
    .app_wdf_data           (app_wdf_data         ),// input [127:0]	app_wdf_data
    .app_wdf_end            (app_wdf_end          ),// input			app_wdf_end
    .app_wdf_wren           (app_wdf_wren         ),// input			app_wdf_wren
    .app_wdf_rdy            (app_wdf_rdy          ),// output			app_wdf_rdy
    .app_wdf_mask           (app_wdf_mask         ),// input [15:0]		app_wdf_mask

    .app_rd_data            (app_rd_data          ),// output [127:0]	app_rd_data
    .app_rd_data_end        (app_rd_data_end      ),// output			app_rd_data_end
    .app_rd_data_valid      (app_rd_data_valid    ),// output			app_rd_data_valid
    //下面的信号的作用不是特别大  可以直接把输入信号置零
    .app_ref_req            (app_ref_req          ),// input			app_ref_req  信号的刷新请求
    .app_ref_ack            (app_ref_ack          ),// output			app_ref_ack  信号的刷新响应
    .app_zq_req             (app_zq_req           ),// input			app_zq_req   校准请求 
    .app_zq_ack             (app_zq_ack           ),// output			app_zq_ack   校准响应
    .app_sr_req             (app_sr_req           ),// input			app_sr_req
    .app_sr_active          (app_sr_active        ),// output			app_sr_active

    //与XADC信号有关  一般直接将这个信号置零就可以了
    .device_temp_i          (device_temp_i        ),// input [11:0]		device_temp_i

    //ip核提供给用户端使用的时钟
    .ui_clk                 (ui_clk               ),// output			ui_clk
    .ui_clk_sync_rst        (ui_clk_sync_rst      ),// output			ui_clk_sync_rst


    // Reference Clock Ports
    .clk_ref_p              (clk_ref_p            ),// input			clk_ref_p
    .clk_ref_n              (clk_ref_n            ),// input			clk_ref_n


    // System Clock Ports
    .sys_clk_i              (sys_clk_i            ),
    .sys_rst                (sys_rst              ) // input sys_rst

4.2. 时序图

4.2.1. 写时序

在这里插入图片描述

注意:

  1. 不支持突发 一个地址一个数据
  2. 写地址和写数据的顺序可以互换 三种方式都可以

4.2.2. 读时序

在这里插入图片描述

4.3. MIG IP 核用户端的 app_addr 地址信号如何与 DDR3 芯片的地址对应起来?

在这里插入图片描述

下面举一个例子:
在这里插入图片描述

在这里插入图片描述

bank23 = 8
row215 = 32k
col210 = 1k

按照上面的数据写就行 也就实现了app_addrDDR3芯片的地址对齐的操作

5. 补充ddr与sdram关系

  • 最开始就是sdram,然后为了提高数据传输效率,就把sdram改成了双沿传输数据,所以第二代sdram就叫ddr了,要适应双沿传输数据

  • ddr就在sdram的基础上增加了一些控制和存储。其实自刷新,back,突发传输,潜伏期这些跟sdram的原理都是一样的。

  • ddr现在大多都是用ip核开发,反而是sdram一般都是自己写驱动,所以开始的入门的时候还是建议读一下sdram的手册,然后自己写一个sdram控制器,你就知道这些数据的含义了,后面ddr主要看下增加的内容,调用ip核设置参数就行了。

  • 如果写过sdram控制器,对写ddr控制器也是有帮助的。sdram接口相比spi,uart还是要复杂很多的,对前期练习状态机之类的帮助极大,写过和没写过,区别还是很大的

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Xilinx FPGA平台DDR3设计保姆式教程(3)是关于使用MIG IP及DDR读写时序的教程。 首先,MIG(Memory Interface Generator)是Xilinx提供的IP,用于简化DDR3控制器接口的设计。在使用MIG IP前,需要根据DDR3芯片的规格参数,使用MIG生成一个适用于特定器件的IP文件。生成IP文件后,可以将其添加到设计中。 使用MIG IP时,需要正确设置IP的参数,以满足设计需求。这些参数包括时钟频率、数据宽度、时序参数等。为了正确设置这些参数,可以参考DDR3芯片的数据手册和Xilinx提供的MIG IP使用手册。 在DDR3读写时序中,有多个重要的信号需要注意。首先是时钟信号,它用于同步数据的传输。时钟信号的频率应根据DDR3规格进行设置,通常为DDR3规格中指定的频率(比如900MHz)的一半。然后是地址信号,它用于指定要读写的存储单元的位置。地址信号的宽度应根据DDR3规格进行设置,通常为规定的位数(比如13位)。接下来是控制信号,包括读使能信号和写使能信号,用于控制读写操作的进行。最后是数据信号,用于实际的数据传输。数据信号的宽度应根据DDR3规格和设计需求进行设置。 在设计中,需要根据DDR3芯片的时序要求,来设置合适的读写延迟和时序参数。这些参数可以通过MIG IP的配置界面进行设置。此外,还需要根据DDR3芯片要求,使用适当的芯片选择信号和刷新操作,以确保DDR3的正常工作。 综上所述,使用Xilinx FPGA平台进行DDR3设计时,可以使用MIG IP来简化接口设计,并根据DDR3规格和时序要求来设置相关参数。合理设置这些参数,可以保证DDR3的正常读写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值