fpga - Spartan 7 4:1 Mig Generated DDR3 接口的写入内存时序
问题描述
我试图了解 7 系列 FPGA 的写入内存时序,它使用 MIG 生成的内存控制器的 UI(以 4:1 运行)。
我关注的文档是 Xilinix 的ug586文档。我特别想理解这里复制的图 1:77:
我的理解是,在前几个周期中,app_addr
app_en
app_wdf_data
app_wdf_wren
正确app_wdf_end
断言并写入数据。见蓝线。
有趣的点出现在 (1) 处,其中app_rdy
被取消断言,这意味着内存控制器很忙。此时app_addr
,在同一地址 (2) 上保持,直到app_rdy
在 (6) 处重新声明。到目前为止,一切都说得通。
我感到困惑的是要写什么来解决a30
?选择是数据 (3) 或 (4) 或 (5)。图表和逻辑意味着(3)被写入a30
(见粉红色虚线)。但我不知道为什么。查看文档中的图 1-75,您可以提前一个时钟给写入数据,但与app_rdy
在 (7) 处的时钟上升沿重新启用时相比,(3) 处的数据提前 2 个时钟。所以剩下的是(4)或(5)。但在这个演示中,这些似乎都没有意义。那么写什么a30
以及如何解决这个问题?
(我也对写到后续地址的内容感兴趣,但一旦我理解了a30
,我也应该能够理解这些)
解决方案
我会回答我自己的问题,因为我在这里找到了几乎相同的答案。
基本上,混淆是命令队列(由 and 控制)与写队列(由andapp_en
控制app_rdy
)是分开的。app_wdf_rdy
app_wdf_wren
这意味着您可以在实际请求写入之前将数据排队等待写入 - 事实上,您可以继续排队写入数据,直到app_wdf_ready
被取消断言。
您必须为每个写入命令排队一些写入数据。您可以在写入命令之前,在与写入命令相同的时钟或最多两个时钟之后将写入数据排队。写入数据是一个 FIFO 队列,因此您甚至可以在发出单个写入命令之前将大量写入数据排队!
(混淆来自文档中的示例,该示例提前一个时钟显示排队数据 - 但如果您阅读文本,您会得到:
- 写入数据与相应的写入命令一起呈现(BL8 的后半部分)。
- 写入数据出现在相应的写入命令之前。
- 写入数据在相应的写入命令之后呈现,但不应超过两个时钟周期的限制
请注意,在第 2 点中,没有提到允许您多早地排队数据的限制。
这意味着 - 在我的例子中 - (3)被写入地址a30
,就像它在写入队列中一样。
推荐阅读
- java - 如何在 Java Swing 应用程序中实现页面?
- python - 为什么用地图对象更新集合会破坏地图对象?
- python - 生成有效 IP 地址列表并在 Python Selenium 循环中随机使用
- assembly - 如何将定义的四元数(8 字节)作为参数传递给 32 位 NASM 程序集中的子程序
- python-3.x - 为什么服务器上的 Python 文件中的 f.write() 不起作用?
- ios - 如何在 Swift 中调整视图高度?
- php - Wordpress remove user registration for custom implementation
- ios - 如何使用 AVAudioPlayer 关闭视频中的音频?
- rest - WebSphere 8.5.5.9 和 Jersey 2.25
- google-maps - 如何在 Flutter 上使用 placeId 获取 Google Place?