DDR3 NATIVE接口

参考:

DDR3 控制器 MIG IP 详解完整版 (native&Vivado&Verilog)_mig ip核-CSDN博客

APP和AXI接口有许多相似的地方(握手部分),

但是由于和物理芯片直接相关,有更多不一样的地方。

addr的计算方式;

写命令和写数据到达时间可以各有前后等; 

Memory Controller and Native Interface

The front end of the Memory Controller (MC) presents the native interface to the UI block. The native interface allows the user design to submit memory read and write requests and provides the mechanism to move data from the user design to the external memory device, and vice versa. The backend of the Memory Controller connects to the physical interface and handles all the interface requirements to that module. The Memory Controller also provides a reordering option that reorders received requests to optimize data throughput and latency.

内存控制器 (MC) 的前端向 UI 块提供本机接口。本机接口允许用户设计提交存储器读取和写入请求,并提供将数据从用户设计移动到外部存储器设备的机制,反之亦然。内存控制器的后端连接到物理接口并处理该模块的所有接口要求。内存控制器还提供重新排序选项,可以对收到的请求进行重新排序,以优化数据吞吐量和延迟。

IDELAYCTRL

An IDELAYCTRL is required in any bank that uses IDELAYs. IDELAYs are associated with the data group (DQ). Any bank/clock region that uses these signals require an IDELAYCTRL.

The MIG tool instantiates one IDELAYCTRL and then uses the IODELAY_GROUP attribute (see the iodelay_ctrl.v module). Based on this attribute, the Vivado Design Suite properly replicates IDELAYCTRLs as needed within the design.

The IDELAYCTRL reference frequency is set by the MIG tool to either 200 MHz, 300 MHz, or 400 MHz depending on memory interface frequency and speed grade of the FPGA. Based on the IODELAY_GROUP attribute that is set, the Vivado Design Suite replicates the IDELAYCTRLs for each region where the IDELAY blocks exist.

任何使用 IDELAY 的BANK都需要 IDELAYCTRL。 IDELAY 与数据组 (DQ) 关联。使用这些信号的任何存储体/时钟区域都需要 IDELAYCTRL。
MIG 工具实例化一个 IDELAYCTRL,然后使用 IODELAY_GROUP 属性(请参阅 iodelay_ctrl.v 模块)。基于此属性,Vivado Design Suite 根据设计中的需要正确复制 IDELAYCTRL。
MIG 工具将 IDELAYCTRL 参考频率设置为 200 MHz、300 MHz 或 400 MHz,具体取决于存储器接口频率和 FPGA 的速度等级。根据设置的 IODELAY_GROUP 属性,Vivado Design Suite 会为 IDELAY 块所在的每个区域复制 IDELAYCTRL。

基本接口信号:

  mig_7series_0 MIG_APP (// Memory interface ports.ddr3_addr                      ( ddr3_addr),            // output [13:0]	ddr3_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 [31:0]		ddr3_dq.ddr3_dqs_n                     ( ddr3_dqs_n),           // inout [3:0]		ddr3_dqs_n.ddr3_dqs_p                     ( ddr3_dqs_p),           // inout [3:0]		ddr3_dqs_p.init_calib_complete            ( init_calib_complete),  // output			init_calib_complete.ddr3_cs_n                      ( ddr3_cs_n),            // output [0:0]		ddr3_cs_n.ddr3_dm                        ( ddr3_dm),              // output [3:0]		ddr3_dm.ddr3_odt                       ( ddr3_odt),             // output [0:0]		ddr3_odt// 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            MIG IP 核使能.app_wdf_data                   ( app_wdf_data       ),  // input [255:0]	app_wdf_data      用户写数据.app_wdf_end                    ( app_wdf_end        ),  // input			app_wdf_end       wdata_last.app_wdf_wren                   ( app_wdf_wren       ),  // input			app_wdf_wren      DDR3 写使能 .app_rd_data                    ( app_rd_data        ),  // output [255:0]	app_rd_data.app_rd_data_end                ( app_rd_data_end    ),  // output			app_rd_data_end   rdata_last.app_rd_data_valid              ( app_rd_data_valid  ),  // output			app_rd_data_valid .app_rdy                        ( app_rdy            ),  // output			app_rdy.app_wdf_rdy                    ( app_wdf_rdy        ),  // output			app_wdf_rdy.app_sr_req                     ( app_sr_req         ),  // input			app_sr_req.app_ref_req                    ( app_ref_req        ),  // input			app_ref_req.app_zq_req                     ( app_zq_req         ),  // input			app_zq_req.app_sr_active                  ( app_sr_active      ),  // output			app_sr_active     保留.app_ref_ack                    ( app_ref_ack        ),  // output			app_ref_ack       刷新请求.app_zq_ack                     ( app_zq_ack         ),  // output			app_zq_ack        ZQ 校准请求//Ui .ui_clk                         ( ui_clk             ),  // output			ui_clk.ui_clk_sync_rst                (                    ),  // output			ui_clk_sync_rst.app_wdf_mask                   ( app_wdf_mask       ),  // input [31:0]		app_wdf_mask      写数据屏蔽// System Clock Ports.sys_clk_i                      ( O_CLK_200MHZ      ),.sys_rst                        ( PLL0_LOCK         ) // input sys_rst);

app_wdf_mask:写入掩码

This bus indicates which bytes of app_wdf_data[] are written to the external memory and which bytes remain in their current state. The bytes are masked by setting a value of 1 to the corresponding bits in app_wdf_mask. For example, if the application data width is 256, the mask width takes a value of 32. The least significant byte [7:0] of app_wdf_data is masked using Bit[0] of app_wdf_mask and the most significant byte [255:248] of app_wdf_data is masked using Bit[31] of app_wdf_mask. Hence if you have to mask the last DWORD, that is, bytes 0, 1, 2, and 3 of app_wdf_data, the app_wdf_mask should be set to 32'h0000_000F.

该总线指示 app_wdf_data[] 的哪些字节被写入外部存储器以及哪些字节保持当前状态。通过将值设置为 1 来屏蔽字节app_wdf_mask 中的相应位。例如,如果应用程序数据宽度为256,则掩码宽度取值为32。app_wdf_data的最低有效字节[7:0]被掩码使用 app_wdf_mask 的 Bit[0] 和 app_wdf_data 的最高有效字节 [255:248]使用 app_wdf_mask 的 Bit[31] 进行屏蔽。因此,如果您必须屏蔽最后一个 DWORD,那么也就是说,app_wdf_data 的字节 0、1、2 和 3,app_wdf_mask 应设置为32'h0000_000F。

app_addr

This input indicates the address for the request currently being submitted to the UI. The UI aggregates all the address fields of the external SDRAM and presents a flat address space to you.

app_addr的自增和ddr3的片数是有关的;

例子:

1片ddr3:一个地址16位;

data_width =  128:8x16

所以地址一次自增8位;

2片ddr3:一个地址32位;

data_width =  256:8x32

所以地址一次还是自增8位;

app_cmd[2:0]

This input specifies the command for the request currently being submitted to the UI. The available commands are shown in Table 1-18.

READ 001

WR     000

app_en

与app_rdy握手的时候,

app_addr和app_cmd才有效;                                       

app_wdf_wren

与app_wdf_rdy握手的时候,传输的数据才有效;

This input indicates that the data on the app_wdf_data[] bus is valid.

app_wdf_data[APP_DATA_WIDTH – 1:0]

This bus provides the data currently being written to the external memory.

app_wdf_end

This input indicates that the data on the app_wdf_data[] bus in the current cycle is the last data for the current request.

app_rd_data[APP_DATA_WIDTH – 1:0]

This output contains the data read from the external memory.

app_rd_data_end

This output indicates that the data on the app_rd_data[] bus in the current cycle is the last data for the current request.

app_rd_data_valid

This output indicates that the data on the app_rd_data[] bus is valid

app_rdy

This output indicates to you whether the request currently being submitted to the UI is accepted. If the UI does not assert this signal after app_en is asserted, the current request must be retried. The app_rdy output is not asserted if:

此输出向您指示当前提交到 UI 的请求是否被接受。如果在 app_en 置位后 UI 未置位此信号,则必须重试当前请求。在以下情况下,app_rdy 输出不会被断言:

° PHY/Memory initialization is not yet completed

° All the bank machines are occupied

(can be viewed as the command buffer being full)

- A read is requested and the read buffer is full

- A write is requested and no write buffer pointers are available

° A periodic read is being inserted

° PHY/Memory 初始化尚未完成

° 所有 Bank 机器都被占用(可以视为命令缓冲区已满)

- 请求读取且读取缓冲区已满

- 请求写入,但没有可用的写入缓冲区指针

° 正在插入定期读取

app_wdf_rdy

This output indicates that the write data FIFO is ready to receive data. Write data is accepted when both app_wdf_rdy and app_wdf_wren are asserted.

该输出表明写入数据 FIFO 已准备好接收数据。当 app_wdf_rdy 和 app_wdf_wren 都置位时,写入数据被接受。

app_ref_req

When asserted, this active-High input requests that the Memory Controller send a refresh command to the DRAM. It must be pulsed for a single cycle to make the request and then deasserted at least until the app_ref_ack signal is asserted to acknowledge the request and indicate that it has been sent.

置位后,该高电平有效输入请求内存控制器向 DRAM 发送刷新命令。它必须在一个周期内产生脉冲以发出请求,然后至少在 app_ref_ack 信号被置为有效以确认请求并表明请求已发送之前被置为无效。

app_ref_ack

When asserted, this active-High input acknowledges a refresh request and indicates that the command has been sent from the Memory Controller to the PHY.

置位后,该高电平有效输入会确认刷新请求并指示命令已从内存控制器发送到 PHY。

app_zq_req

When asserted, this active-High input requests that the Memory Controller send a ZQ calibration command to the DRAM. It must be pulsed for a single cycle to make the request and then deasserted at least until the app_zq_ack signal is asserted to acknowledge the request and indicate that it has been sent.

置位后,该高电平有效输入请求内存控制器向 DRAM 发送 ZQ 校准命令。它必须在一个周期内产生脉冲以发出请求,然后至少在 app_zq_ack 信号被置为有效以确认请求并表明请求已发送之前被置为无效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python算法题集_搜索二维矩阵

Python算法题集_搜索二维矩阵 题74:搜索二维矩阵1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【矩阵展开为列表二分法】2) 改进版一【行*列区间二分法】3) 改进版二【第三方模块】 4. 最优算法5. 相关资源 本文为Python算法题集之…

c++中string的使用!!!(适合初学者 浅显易懂)

我们先初步的认识一下string,string底层其实是一个模版类 typedef basic_string<char> string; 我们先大致的把string的成员函数列举出来 class string { private: char * str; size_t size; size_t capacity; }; 1.string的六大默认函数 1.1 构造函数、拷贝构造 注&am…

基础刷题50之四(有效的字母异位词)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解1、排序2、哈希表 三、文心一言解释1、排序2、哈希表 总结 前言 刚上研一&#xff0c;有人劝我好好学C&#xff0c;当时用的不多就没…

动态规划(算法竞赛、蓝桥杯)--数位DP--Windy树

1、B站视频链接&#xff1a;E37 数位DP Windy数_哔哩哔哩_bilibili 题目链接&#xff1a;[SCOI2009] windy 数 - 洛谷 #include <bits/stdc.h> using namespace std; const int N 12; int a[N]; //把整数的每一位数字抠出来&#xff0c;存入数组 int f[N][10]; /…

代码随想录算法训练营第36天—动态规划04 | ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

01背包 https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1cg411g7Y6 常见的背包问题类型&#xff08;大厂面试重点掌握01背包和完全背包即可&#xf…

LeetCode-1944题: 队列中可以看到的人数(原创)

【题目描述】 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff0c;heights[i] 表示第 i 个人的高度。一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 。更正式的&…

能量不等式证明

波动方程初值问题能量不等式的证明 Gronwall 不等式 若非负函数 G ( τ ) G(\tau) G(τ) 在 [ 0 , T ] [0,T] [0,T] 上连续可微&#xff0c; G ( 0 ) 0 G(0)0 G(0)0&#xff0c;且对 τ ∈ [ 0 , T ] \tau\in[0,T] τ∈[0,T]满足 d G ( τ ) d τ ≤ C G ( τ ) F ( τ …

BJFU|大数据基础考前速记(含考试大纲与复习笔记)

考试大纲与复习笔记在文末 考前速记 2010年前后&#xff0c;大数据、云计算、物联网的快速发展拉开了第三次信息化浪潮的大幕。 信息科技需要解决信息存储、信息处理和信息传输三个核心问题。解决方式是&#xff1a;存储设备容量不断增加、CPU处理能力大幅提升、网络带宽不断…

Flutter图片内存占用过大问题

图片(Image)加载原理&#xff1a; Image &#xff1a; 显示图⽚的Widget&#xff0c;通过ImageState管理ImageProvider的⽣命周期。 ImageProvider&#xff1a; 图⽚的抽象概念。 根据Image创建实例时调用的工厂方法的不同&#xff08;Image.network或者Image.assetImage&#…

mysql根据时间段生成时间

在开发过程中&#xff0c;经常会遇到统计&#xff0c;如果统计的时间段内有间隔&#xff0c;不管是左连接还是右连接都不会有&#xff0c;所以这时候我们需要写个语句能补全这段时间内所有的时间&#xff0c;然后用时间去关联业务查询。 select num : num 1,date_format(addda…

WPF DataGrid常用属性

AlternationCount属性&#xff1a;表示有几行不同的颜色来回替换&#xff0c;如果设置2则表示有两个颜色交替循环 AutoGenerateColumns属性&#xff1a;是否生成列 CanUserAddRows属性&#xff1a;用户是否可以添加行 CanUserDeleteRows属性&#xff1a;用户是否可以删除行 …

【FPGA/IC】CRC电路的Verilog实现

前言 在通信过程中由于存在各种各样的干扰因素&#xff0c;可能会导致发送的信息与接收的信息不一致&#xff0c;比如发送数据为 1010_1010&#xff0c;传输过程中由于某些干扰&#xff0c;导致接收方接收的数据却成了0110_1010。为了保证数据传输的正确性&#xff0c;工程师们…

2023年第三届中国高校大数据挑战赛(第二场)D题思路

赛题D&#xff1a;行业职业技术培训能力评价 中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴熟的技术工人进入工厂。某行业在全国有多所不同类型&#xff08;如国家级、省级等&#xff09;的职业技术培训学校&#xff0c;进行 5 种技能培训。…

禁止使用搜索引擎,你了解吗?

员工A&#xff1a;“我今天想搜索的时候&#xff0c;用不了浏览器了&#xff0c;你能用么&#xff1f;” 员工B&#xff1a;“不知道啊我试一下啊” “也不行” 员工C&#xff1a;“为什么啊&#xff1f;” 针对上述对话&#xff0c;我们不禁思考&#xff1a; 公司为什么禁…

python基础9_序列类型

回顾: 什么是变量?,有什么用? 可以变化的量, 就是个容器,多次变化,方便后续使用, 前面介绍了哪些数据类型? bool, str, int, float 用什么函数查看数据的类型? a "hello" print(type(a)) 到了这一步,,我们认识了哪些数据类型呢? int 整型(整数), float…

office下常见问题总结——(持续更新学习记录中......)

目录 Wordword2019中, 当给选定的汉字设置格式后&#xff0c;其他相同汉字也会自动应用相同的格式?在Word中&#xff0c;当输入数字后加上句点&#xff08;.&#xff09;时会自动被识别为标题,如何关闭功能?如何让当前的word中的样式 ,匹配全局模版中的样式?在word中,为什么…

一、NLP中的文本分类

目录 1.0 文本分类的应用场景 1.1 文本分类流程 ​编辑 1.2 判别式模型 1.3 生成式模型 1.4 评估 1.5 参考文献 1.0 文本分类的应用场景 &#xff08;1&#xff09;情感分析&#xff1a;中性&#xff0c;正向评论&#xff0c;负向评论&#xff0c;黄色言论&#xff0c;暴…

Java基础 - 8 - 算法、正则表达式、异常

一. 算法 什么是算法&#xff1f; 解决某个实际问题的过程和方法 学习算法的技巧&#xff1f; 先搞清楚算法的流程&#xff0c;再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…

Matlab偏微分方程拟合 | 完整源码 | 视频教程

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

call()与apply()的作用与区别

概念 每个函数都包含两个非继承而来的方法&#xff1a;apply()和call()。 call与apply都属于Function.prototype的一个方法&#xff0c;所以每个function实例都有call、apply属性&#xff1b; 作用 call()方法和apply()方法的作用相同&#xff1a;改变this指向。 区别 他们…