从零开始讲DDR(4)——Xilinx方案

news2024/12/27 2:48:23

        本文依据的是xilinx的PG150文档,主要介绍的是xilinx的ultrascale系列中内存资源的使用。


一、方案概述

        Xilinx UltraScale™架构中的DDR3/DDR4 SDRAM ip核旨在支持高性能的内存接口解决方案。这些ip可以用于将DDR3和DDR4 SDRAM内存类型集成到设计中,提供完整的内存控制器和物理层(PHY)解决方案。下面是该ip的大致架构:

        可以看到在xilinx提供的DDR操作方案中,大致的设计方向与我们之前讨论的方式是一致的。同样是包含了DDRC(图中的Memory Controller)和DDRPYH(图中的Physcial Layer)结构。此外尽管图中没有体现,但是xilinx同样提供了AXI4 从接口来便于用户操作DDR。

 

二、方案架构

        该方案的结构如下图所示:

        对于一个DDR使用设计方案来讲,最重要的部分当然是DDRC的设计,也就是图中的Memory Controller部分。

        这里的DDRC被设计用于从用户接口接收读写相关的所有事务,并将这些事务发送到DRAM,且使用尽可能少的FPGA资源。控制器在DRAM与系统时钟比为4:1的情况下运行,每个系统时钟周期可以发送一条激活(Activate)、一条列地址选通(CAS)和一条预充电(Precharge)命令。

        控制器命令路径的关键模块包括:

  • Group FSMs(状态机组):这些状态机组负责将事务排队,检查DRAM时序,并决定何时请求发送预充电(Precharge)、激活(Activate)和CAS(列地址选通)命令。

  • “安全”逻辑和仲裁单元:这些逻辑单元在基于额外的DRAM时序检查对Group FSMs之间的事务进行重新排序的同时,确保所有DRAM命令请求能够持续向前进行。

  • 最终仲裁器(Final Arbiter):最终仲裁器负责决定向物理层(PHY)发送哪些命令,并将决策结果反馈给前面的模块。

        简单看了一下其他的部分,文档中讲的也比较简单,考虑到作为使用者,理解方案的具体实现原理不是我们的第一诉求,我们跳过这部分的内容,直接进入到大家喜闻乐见的使用环节。

三、方案使用

        原文在这部分还介绍了一些时钟、复位信号的要求包括一些管脚和PCB相关的内容,我们同样不关心这部分的内容,直接进入到协议描述阶段,对于一个ip,我们最关心的就是它的功能和输入输出信号,功能我们简单了解了,接下来就来介绍接口信号。

        这个ip提供了三种对外的接口形式供用户选择:

  • User Interface
  • AXI4 Slave Interface
  • PHY Only Interface

3.1 User Interface 

信号输入/输出描述
app_addr[APP_ADDR_WIDTH – 1:0]
input表示当前请求的地址
app_cmd[2:0]
input表示当前请求的指令,000表示数据写入,001表示数据读,011表示按byte写入
app_autoprecharge
input这个信号会知识控制器在当前请求的DRAM CAS命令上设置A10自动预充电位
app_en
input地址信号,指令信号的使能信号
app_rdy
output该信号表示用户接口已经准备好接收指令了,如果在启用app_en时取消断言该信号,则必须重试当前的app_cmd、app_autoprecharge和app_addr,直到断言app_rdy为止。
app_hi_pri
input保留,设置成0
app_rd_data [APP_DATA_WIDTH – 1:0]
output读出的数据内容
app_rd_data_end
output该信号拉高表示当前的时钟周期是app_rd_data上输出数据的最后一个周期
app_rd_data_valid
output该信号拉高表示app_rd_data 数据有效
app_wdf_data [APP_DATA_WIDTH – 1:0]
input写入的数据内容
app_wdf_end
input该信号拉高表示当前的时钟周期是app_wdf_data上输入数据的最后一个周期
app_wdf_mask [APP_MASK_WIDTH – 1:0]
input这为app_wdf_data提供了掩码。对于DDR3接口,app_wdf_mask端口出现在Vivado IDE中的“启用数据掩码”选项中。对于DDR4接口,app_wdf_mask端口出现在TRUE的“ECC”Vivado IDE选项值中。对于“ECC”Vivado IDE选项值为FALSE,端口显示为DM_NO_DBI和DM_DBI_RD。
app_wdf_rdy
output此输出表明写入数据FIFO已经准备好接收数据。当app_wdf_rdy = 1‘b1和app_wdf_wren = 1’b1时,将接受写入数据
app_wdf_wren
inputapp_wdf_data的使能信号
app_ref_req
input用户刷新请求
app_ref_ack
output用户刷新请求完成
app_zq_req
input用户ZQCS请求
app_zq_ack
output用户ZQCS请求完成
ui_clk
output用户始终频率必须是DRAM时钟频率的1/4
init_calib_complete
outputPHY会在校准完成时断言init_calib_complete,只有当init_calib_complet拉高,用户的写入数据才有效
ui_clk_sync_rst
output高有效复位
addn_ui_clkout1
output根据用户需求提供额外的时钟输出
addn_ui_clkout2
output根据用户需求提供额外的时钟输出
addn_ui_clkout3
output根据用户需求提供额外的时钟输出
addn_ui_clkout4
output根据用户需求提供额外的时钟输出
dbg_clk
output调试时钟。不要将任何信号连接到dbg_clk,并保持端口打开
sl_iport0
input[36:0]输入端口0(* KEEP =“true”*)
sl_oport0
output[16:0]输出端口0(* KEEP =“true”*)
c0_ddr4_app_correct_en_i
inputDDR4正确启用输入

         有些信号的详细内容仅仅靠着表格中的三言两语很难讲清楚,这里我们另起篇幅,讲一下需要额外注意的信号内容。

3.1.1 地址信号 app_addr[APP_ADDR_WIDTH – 1:0]

       此输入指示当前正在提交给用户界面的请求的地址。用户界面聚合了外部SDRAM的所有地址字段,并提供了一个平面的地址空间。 这个平面地址空间不是什么复杂的概念,其实就是把我们 已经知道的DDR的row,column,bank组合起来,形成一个信号罢了。但是怎么对这几个信号进行排序和长度划分却是需要用户参与考虑的。在内部,MEM_ADDR_ORDER负责定义这个信息,暴露给我们用户的视角,我们需要决定:

         这里的 Memory Address Map 官方推荐就选择 ROW_COLUMN_BANK 形式,其他可供选择的内容还有:ROW_BANK_COLUMN,BANK_ROW_COLUMN和ROW_COLUMN_BAN_INTLV。这里我们就以ROW_COLUMN_BANK 为例,其他的形式可以查阅手册pg150中的 Table 4-15 到 Table 4-24 部分。这里需要注意的是app_addr的低3位映射到了列地址的低三位,这是用来表示 SDRAM 突发顺序的部分,由于控制器不支持突发排序,因此这些低阶位被忽略,使有效的最小app_addr步长hex 8。

3.1.2 写信号时序 

        对于写操作来说,支持以下3种情况:

  • 写数据与写命令严格对齐
  • 写数据提前写命令一个周期
  • 写数据滞后于写命令,这种情况下,滞后时间最多支持2个时钟周期

3.2 AXI Slave Interface 

        AXI4从接口块将AXI4事务映射到用户接口(UI),为内存控制器提供一种行业标准的总线协议接口。AXI4从接口在通过DDR3/DDR4 SDRAM工具提供的设计中是可选的,且在这两个工具中的RTL实现是一致的。

3.2.1 可配置参数

        对于这里的AXI4 从接口来说,官方提供了一些相关参数,这里我们进行一个简单的介绍:

参数名称可选值描述
C_S_AXI_ADDR_WIDTH
DDR3: 25–35
DDR4: 27–37

地址信号线的位宽。

它取决于内存密度和所选择的配置。

计算方式为:

DDR3:log2(RANKS)+ROW_WIDTH+COL_WIDTH+BANK_WIDTH+log2(PAYLOAD_WIDTH)-3

DDR4:log2(RANKS)+ROW_WIDTH+COL_WIDTH+BANK_WIDTH+BANK_GROUP_WIDTH+log2(PAYLOAD_WIDTH)-3 PAYLOAD_WIDTH

PAYLOAD_WIDTH含义是外部存储器接口的数据宽度,对于AXI设计,它被限制为8、16、32或64

_S_AXI_DATA_WIDTH
32, 64, 128, 256, 512
数据信号的宽度
C_S_AXI_ID_WIDTH
1-16每个通道的ID信号的位宽
C_S_AXI_SUPPORTS_NARROW_BURST
0,1此参数仅适用于C_S_AXI_DATA_WIDTH等于APP_DATA_WIDTH时。当C_S_AXI_DATA_WIDTH等于APP_DATA_WIDTH并且启用此参数时,AXI从服务器将实例化一个升级器。当主服务器发送AXI窄传输(比传输数据总线窄的传输)时,升级器打包连续传输,在用户界面呈现单个请求。因此,如果这个AXI从服务器可以接收窄段传输,则必须启用参数C_S_AXI_SUPPORTS_NARROW_BURST。如果不是,当从属接收到窄传输时,它会导致意外行为。当C_S_AXI_DATA_WIDTH等于APP_DATA_WIDTH并且已知AXI从服务器从未接收到窄传输时,可以禁用此参数以避免升级器的实例化,从而节省实现区域。在这种情况下,确保在实际模拟期间AXI从线从不接收窄传输。当C_S_AXI_DATA_WIDTH小于APP_DATA_WIDTH时,总是实例化升级器,且此参数无效。
C_RD_WR_ARB_ALGORITHM
TDM, ROUND_ROBIN,
RD_PRI_REG,
RD_PRI_REG_STARVE_LIMIT,
WRITE_PRIORITY_REG,
WRITE_PRIORITY
仲裁算法的方案
C_ECC
ON, OFF
此参数指定是否为该设计启用了ECC。ECC只在72位设计时支持启用,而对所有其他数据宽度禁用

3.2.2 AXI从接口信号

        除了个别信号,基本就是非常标准的AXI接口,从命名中就可以很直观地看出信号对应的是AXI的哪个通道,下表通过颜色对不同的信号做了一个简单的区分。

  • 写地址通道:红色
  • 写数据通道:黄色
  • 写响应通道:蓝色
  • 读地址通道:紫色
  • 读数据通道:绿色
名称位宽输入/输出有效状态描述
ui_clk1O时钟信号,由内存控制器提供到ui接口,AXI接口信号同步于ui_clk
ui_clk_sync_rst1O复位信号,由内存控制器提供到ui接口,AXI接口信号同步于ui_clk
aresetn1IAXI Shim的输入复位信号,应与FPGA逻辑时钟同步
s_axi_awidC_S_AXI_ID_WIDTHI写地址ID
s_axi_awaddrC_S_AXI_ADDR_WIDTHI写地址
s_axi_awlen8I突发长度,代表一次突发中传输的数量
s_axi_awsize3I突发大小,代表表示突发中每个传输的大小
s_axi_awburst2I突发类型,仅支持INCR/WRAP
s_axi_awlock1I锁类型(当前实现未使用)
s_axi_awcache4I缓存类型(当前实现未使用)
s_axi_awprot3I保护类型(当前实现未使用)
s_axi_awqos4I服务质量(当前实现未使用)
s_axi_awvalid1I写地址有效,该信号表示有效的写地址和控制信息已可用
s_axi_awready1O写地址就绪,该信号表示从机已准备好接受地址和相关控制信号
s_axi_wdataC_S_AXI_DATA_WIDTHI写数据
s_axi_wstrbC_S_AXI_DATA_WIDTH/8I写选通
s_axi_wlast1I写最后一个信号,该信号表示写突发传输中的最后一次传输
s_axi_wvalid1I写有效信号,该信号表示写数据和触发信号已准备好
s_axi_wready1O写就绪信号,该信号表示从机已准备好接收写数据
s_axi_bidC_S_AXI_ID_WIDTHO响应ID,该信号是写响应的识别标签
s_axi_bresp2O写响应信号,该信号表示写响应的状态
s_axi_bvalid1O写响应有效信号
s_axi_bready1I响应就绪信号
s_axi_aridC_S_AXI_ID_WIDTHI读地址ID
s_axi_araddrC_S_AXI_ADDR_WIDTHI读地址
s_axi_arlen8I读突发长度
s_axi_arsize3I读突发大小
s_axi_arburst2I读突发类型仅支持INCR/WRAP
s_axi_arlock1I锁类型(当前实现未使用)
s_axi_arcache4I缓存类型(当前实现未使用)
s_axi_arprot3I保护类型(当前实现未使用)
s_axi_arqos4I服务质量(当前实现未使用)
s_axi_arvalid1I读地址有效信号
s_axi_arready1O读地址就绪信号
s_axi_ridC_S_AXI_ID_WIDTHO读ID标签
s_axi_rdataC_S_AXI_DATA_WIDTHO读数据
s_axi_rresp2O读响应
s_axi_rlast1O读最后一个信号
s_axi_rvalid1O读有效信号
s_axi_rready1I读就绪信号
dbg_clk1O调试时钟,不要连接任何信号到该信号引脚,保持引脚在实例化时开放

3.2.3 读写传输示例

3.2.3.1 完整写操作

3.2.3.2 完整读操作

3.2.3.3 窄传输写操作
3.2.3.4 窄传输读操作

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

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

相关文章

干货 | 2024数智新时代制造业数字化创新实践白皮书(免费下载)

导读:本白皮书将对制造业发展历程、现状、趋势与核心难题做深入解读,并在此基础上提出了相应的制造行业解决方案,结合业内实践成功的客户案例来详析信息化转型的有效方法,以供生产制造行业的从业者参考交流。

计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

解决SVN蓝色问号的问题

桌面或文件夹右键,选择TortoiseSVN->Settings打开设置对话框,选择Icon Overlays->Overlay Handlers->取消钩选Unversioned。确定,重启系统即可

扫码挪车是怎么实现的呢?一篇文章带你了解一下!扫码挪车小程序基础版上线了!!!

挪车小程序系统源码的功能特点 快速定位与挪车请求:车主通过小程序可以快速定位车辆位置,并发送挪车请求。系统会自动将请求发送给附近的车主,提醒其尽快挪车。实时通信与交互:小程序支持实时通信功能,车主之间可以通…

【安当产品应用案例100集】017-助力软件服务商高效集成多因素认证

一、企业案例背景 在本案例中,某企业作为一家软件技术服务商,为包括银行、政府机构在内的多个行业提供定制化的软件服务。由于各个行业的安全需求各异,例如银行和政府机构倾向于使用UKEY进行身份验证,而其他企业则可能偏好使用数…

[Python学习日记-26] Python 中的文件操作

[Python学习日记-26] Python 中的文件操作 简介 操作模式 循环文件 其他功能 混合模式 修改文件 简介 在 Python 中的文件操作其实和我们平时使用的 Word 的操作是比较类似的,我们先说一下 Word 的操作流程,流程如下: 找到文件&#x…

Leetcode Hot 100刷题记录 -Day19(回文链表)

回文链表 问题描述: 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2&#xff…

UnLua访问C++属性、动态生成Actor

一、访问C属性、动态生成Actor 1、在C类MyBaseActor中新增蓝图可编辑属性:Name public:UPROPERTY(EditAnywhere)FString Name;2、在继承自C的蓝图子类BP_BaseActor中给Name赋值 3、在Lua中实现点击按钮动态生成Actor,并访问其Name属性 function WBP_FirstLua_C:Construct()s…

FreeRTOS下UART的封装

FreeRTOS下UART的封装_哔哩哔哩_bilibili Git使用的一个BUG: 当出现这个问题是因为git本身的安全证书路径有问题,我们需要重新指定路径 P1:UART程序层次

AIGC时代算法工程师的面试秘籍(第二十二式2024.9.2-9.15) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试经验,力求让读者在获得心仪offer的同时,增强技术基本面。也欢迎大家提出宝贵的优化建议,一起交流学习💪 欢迎大家关注Rocky…

【VLM小白指北 (1) 】An Introduction to Vision-Language Modeling

开一个新坑Vision-Language Modeling (VLM) ,原文76页,慢慢更,for beginners,但也不能之前啥都不会啊。 原文链接:An Introduction to Vision-Language Modeling Introduction 存在的问题:将语言与视觉相…

制造解法 Manufactured Solutions 相关的论文的阅读笔记

Verification of Euler/Navier–Stokes codes using the method of manufactured solutions https://doi.org/10.1002/fld.660 粘性项与扩散项之间的平衡 For the Navier–Stokes simulations presented herein, the absolute viscosity is chosen to be a large constant va…

java8 常用操作案例【经典版】超赞!

目录 一 案例 1.1 对象转list 1.2 过滤对象 1.3 排序 1.4 匹配 1.5 最大值最小值 1.6 拼接字符串 1.7 求和 1.8 分组 1.9 分组求和 1.10 综合案例 一 案例 1.1 对象转list /*** author admin对象转map ; mapper层实体类获取,到业务层转换为DTO,* return void…

当你在Linux系统中使用MySQL命令行工具查询数据库时,如果中文显示为问号(?)或其他乱码,简单解决办法。(2)

文章目录 1、问题出现2、解决办法 1、问题出现 2、解决办法 mysql -u [username] -p --default-character-setutf8 [database_name]rootab66508d9441:/# mysql -uroot -p123456 --default-character-setutf8 tingshu_album mysql: [Warning] Using a password on the command …

【时时三省】(C语言基础)指针笔试题3

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 笔试题3 首先创建了一个数组 数组里面放了1 2 3 4 &a取出的是数组的地址 数组地址加1 如下图 直接从1跳到了四后面 然后强制类型转换成了int* 转换成int*之…

分布式锁优化之 使用lua脚本改造分布式锁保证判断和删除的原子性(优化之LUA脚本保证删除的原子性)

文章目录 1、lua脚本入门1.1、变量:弱类型1.2、流程控制1.3、在lua中执行redis指令1.4、实战:先判断是否自己的锁,如果是才能删除 2、AlbumInfoApiController --》testLock()3、AlbumInfoServiceImpl --》testLock() 1、lua脚本入门 Lua 教程…

STM32F407单片机编程入门(十四) 内部RTC实时时钟详解及实战含源码

文章目录 一.概要二.RTC基本介绍三.STM32单片机RTC内部结构图四.CubeMX配置一个RTC时间例程五.CubeMX工程源代码下载六.小结 一.概要 RTC(Real-Time Clock)是一种用于追踪和记录实际时间的时钟系统。在STM32中,RTC通常用于提供实时时钟和日期…

【python】修改字典的内容

person {"name": "John", "age": 30, "city": "New York"} print("最开始的信息:",person)def process_person_info(person):# 检查对象中是否包含所有必要的键if name in person and age in person …

MySQL缓冲池详解

Buffer Pool 本文参考开源项目:小林coding在线文档; 01-缓冲池概述 ​ 在MySQL查询数据的时候,是通过存储引擎去磁盘做IO来获取数据库中的数据,这样每次查询一条数据都要去做一次或者多次磁盘的IO,无疑是非常慢的。…

(C++23) expected 基础使用

文章目录 ⭐前言⭐expected🎛️基础使用🎛️单子操作 (Monadic operations)🎚️and_then & or_else🎚️transform & transform_error ⭐END🌟跋🌟交流方式 ⭐前言 在 C17 中,提出了 op…