Skip to content
字数
923 字
阅读时间
4 分钟

DDR在PS部分 PL想对DDR访问需要AXI接口 AXI接口时序

创建一个带AXI接口的IP核 打开IP核管理 在ip管理工程中创建新ip 创建带AXI4接口的ip核 路径修改为当前工程路径下的“ ip_repo”文件夹 全功能AXI 编辑ip 生成AXI例化模块和AXI时序模块 ip工程路径如下 自动生成的AXI4 ip核大致功能: 根据外部输入按键,当检测到外部信号上升沿的时候,开始对DDR3的内存进行读写 读写的范围时4096个地址的字节 先写,再读,读完后进行比较。 若读写正确,error信号为低电平。若读写错误,error信号拉高

代码分析:

  • 参数
  • 用户接口信号(主要是AXI4的接口)
  • 例化AXI时序模块(AXI的时序在此模块中实现)

参数可以在功能模块中修改默认值 端口信号 后面的端口信号都是AXI4的接口信号 例化主接口时序核心代码 参数传递(顶层模块参数传递) 函数:计算输入的值的位宽。位宽是4 计算突发请求的位宽 该参数用在写突发的计数 和 读突发的计数。作为位宽 状态机参数 写状态要写4k,读也读4k 写地址通道 写数据通道 写响应通道:从机返回给主机,主机只有bready信号 读地址通道 读数据通道 其余信号

==AXI信号看着很多,其实需要关注的信号很少 操作时关注data或valie等影响时序的数值就行==

输入信号打拍

==AXI4状态机分析:==

看完状态机在回来看握手机制的时序代码

对==写地址==通道的valid信号进行赋值 对==写地址==通道的地址进行赋值 对==写数据==通道的valid进行赋值 先看==写索引==信号如何赋值 其实这个index就是统计传了多少数据用的 这样就可以通过index的值拉高wlast信号了 数据产生这里给了个很简单的累加数据 bready只是响应一下,所以信号好处理 从机发过来一个bvalid,判断一下,bready拉高。只拉高一个时钟周期 ==写响应==的错误判断 ==读地址==通道和==读数据==通道与前面写的类似 成功读握手 读数据计数 rready大部分都是拉高状态。last和rready同时,最后一个读完时才拉低 ==读错误==逻辑 读响应RRESP与BRESP逻辑一致 错误标志 会在COMPARE状态机中赋值到端口 start_single_burst_write拉高后把burst_write_active拉高 而burst_write_active拉高后又把start_single_burst_write拉低 只是==为了确保只持续一个脉冲== 写完成信号什么时候被拉高 写突发次数计数 总共发起了多少次写 最后一次突发 拉高writes_done burst_read_active与写的类似,省略 读操作完成 reads_done和writes_done主要控制状态机跳转

贡献者

The avatar of contributor named as dz13718198068 dz13718198068

文件历史

撰写