电子说
从《黑客帝国》深入工程师世界,我们可以发现这些工程师其实都是爱做梦的孩子。他们在科幻的电子世界里“权倾一方”,像孩子一样打造着自己想要的美梦。今天,我们就来向这些长不大的孩子学习学习,如何在Arria10中Get刷新技能!
一般来说,定期刷新内存内容的要求通常是由内存控制器处理。然而,在Arria10中的用户控制刷新项还能够支持指定内存刷新的时间。因此,如果能够借助流量模式方面的特定知识,那么我们就可以指定刷新操作时间,从而避免打断读/写操作、提升效率。
在基于UNIPHY的内存控制器中,我们可以通过专用的用户控制刷新接口发送用户控制刷新请求。但由于该接口不支持Arria 10硬内存控制器,因此为了实现用户控制刷新,需要通过内存映射配置和状态寄存器接口(简称MMR接口)来发送请求。
那么该如何通过内存映射配置和状态寄存器接口(简称MMR接口)来发送请求呢?为此,我们得掌握如何在内存IP参数化过程中启用用户控制刷新选项。首先,需要在“一般”选项卡中选择硬PHY和硬控制器配置。
Attention: 只有DDR3、DDR4和LPDDR3协议支持该配置。
剩下的,就只是一些简单的程序操作,其目的就是正常实施内存IP的参数化。(详情步骤请参观前文视频。)
以上设置将为MMR接口开放附加端口,创建用于与这些端口通信的用户逻辑。(但此时的MMR接口并不支持空发读取/写入。)然后再将这些信号与GND进行绑定。不过由于该接口并不支持背压,因此“waitrequest”始终处于较低电平。只有在成功完成校准后,用户才能够访问MMR接口。
用于启动用户控制刷新的寄存器
Attention:地址以十六进制值列出。
将cfg_usr_rfsh_en字段设置为1来启用刷新。该字段对应地址19h的位数4。
mmr_refresh_req字段宽4位,每位对应每个队列接收的刷新请求。
我们可读取mmr_refresh_ack字段,了解刷新操作是否在进行中。该字段对应地址32h的位数0。
成功完成校准后向队列0发送刷新请求的预期时间图
如上图所示:将数据0x0000_0010写入cfg_usr_rfsh_en字段,是用于启用用户刷新。然后将数据0x0000_0001写入mmr_refresh_request字段,向队列0发送刷新请求。在32个时钟周期后,读取mmr_refresh_ack字段,直至显示readdatavalid信号。
若读取数据为1b’1,则表示刷新正在进行。而我们只能在看到确认信号后,才能再发出下一个刷新请求。当然,如果想要禁用刷新,则将数据0x0000_0000写入mmr_refresh_req字段即可。怎么样,这些操作还是挺简单的吧?
本期主题更多的是如何通过内存映射配置和状态寄存器接口(简称MMR接口)来发送请求。作为一名优秀的攻城狮,相信您掌握此方法自然很容易。但您是否还有其它更好的方法Get Arria10中的刷新技能呢?
全部0条评论
快来发表一下你的评论吧 !