紫光FPGA DDR3 IP使用和注意事项(axi4协议)

2023-12-18 06:01

本文主要是介绍紫光FPGA DDR3 IP使用和注意事项(axi4协议),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

紫光DDR3 IP使用

对于紫光ddr3 IP核的使用需要注意事情。

阅读ddr ip手册:

image-20231206105944936

image-20231206101247948

image-20231206101119692

image-20231206101100731

1、注意:对于写地址通道,axi_awvalid要一直拉高,axi_awready才会拉高。使用的芯片型号时PG2L100H-6FBG676,不同的型号IP核接口和axi的握手协议也不一样(一定要注意),这点要注意,这也给我挖了一个很大的坑,一把心酸一把泪啊。下图是上板之后通过debug和jtag_hub IP核抓取的信号

image-20231206090853901

与芯片匹配的IP核:

image-20231206091155195

image-20231206093658806

2、写地址握手的过程,代码解析

用户需要一直拉高axi_awvalid地址有效信号,直至ddr返还axi_awready信号,两者同时为高完成握手信号,完成握手之后用户 就可以把axi_awvalid信后拉低,为下次握手做好准备。下面代码就是握手的过程

8'd1:begin//先拉高axi_awvalid信号,然后 等待axi_awready信号axi_awuser_ap  <= 'b0;axi_awvalid <= 1;if(axi_awvalid & axi_awready)//握手信号beginaxi_awvalid <= 1'b0;//完成握手用户拉低axi_awvalid信号,为下次握手做好准备axi_awaddr<=28'h0000111;//握手成功就写入首地址,axi_awid<=8'h01;axi_awlen<=8'd120;//实际长度为 axi_awlen+1state<=8'd2;endelse//等待写地址握手成功beginstate<=8'd1;endend 

image-20231206094510840

这段代码是用状态机的方式对ddr循环写地址,只有两个状态,状态1写入地址0x0000111,状态2写入地址0x0000311,对应上面图的


reg [7:0] cnt /* synthesis syn_keep = 1 */;// synthesis syn_keep = 1 防止信号被优化的语句
//reg [256-1:0] rd_data /* synthesis syn_keep = 1 */;
reg rd_valid /* synthesis syn_keep = 1 */;
always @(posedge axi_clk or negedge rst_n)
begin
if (!rst_n) beginstate<=8'd0;axi_awvalid<=1'b0;//axi_wvalid<=1'b0;axi_arvalid<=1'b0;axi_wdata<=256'b0;axi_aruser_ap <= 1'b0;axi_awuser_ap <= 1'b0;wr_wlast<=1'b0;end
elsebegincase(state) 8'd0:begin//空闲状态if(ddr_init_done==1'b1 && test_start==1'b0)state<=8'd1;elsestate<=8'd0; axi_awvalid<=1'b0;axi_arvalid<=1'b0;axi_wdata<=256'b0;end    8'd1:begin//先拉高axi_awvalid信号,然后 等待axi_awready信号axi_awuser_ap  <= 'b0;axi_awvalid <= 1;//这里注意,一定要先拉高axi_awvalid这个信号,否则ddr3 IP不会返还这个axi_awready信号。axi_awready没有被拉高的原因就在这里axi_awaddr<=28'h0000111;//握手成功就写入首地址,axi_awid<=4'h1;axi_awlen<=4'd12;//实际长度为 axi_awlen+1,只能有4bit,axi_awlen[3:0]if(axi_awvalid & axi_awready)//握手信号beginaxi_awvalid <= 1'b0;//完成握手用户拉低axi_awvalid信号,为下次握手做好准备state<=8'd2;endelse//等待写地址握手成功beginstate<=8'd1;endend 8'd2:begin//先拉高axi_awvalid信号,然后 等待axi_awready信号axi_awuser_ap  <= 'b0;axi_awvalid <= 1;axi_awaddr<=28'h0000311;//握手成功就写入首地址,axi_awid<=4'h1;axi_awlen<=4'd12;//实际长度为 axi_awlen+1if(axi_awvalid & axi_awready)//握手信号beginaxi_awvalid <= 1'b0;//0state<=8'd0;endelse//等待写地址握手成功beginstate<=8'd2;endend 

3、读ddr时,ddr的位宽在配置ip时设置为32,axi总线的宽度为256,256 /32=8,所以读ddr时每读一个数据地址就要偏移8,否则从ddr3中读出来的数据是不对的。

8'd6:begin//写读ddr地址axi_arvalid<=1'b1;axi_araddr<=axi_araddr + 'd8;//地址偏移8,否则读出来的数据是不对的axi_arid<= axi_arid + 4'h1;axi_arlen<=4'd4;//实际长度为 axi_awlen+1axi_aruser_ap <= 1'b0;  if(axi_arvalid & axi_arready)beginaxi_arvalid<=1'b0;state<=8'd7;endelsebegin//axi_arvalid<=1'b0;state<=8'd6;endend

image-20231212113740887
紫光使用的axi4协议是简化版的协议,跟标准的不一样,一定要注意。不同的FPGA芯片型号ddr3的ip核也不一样,axi握手时序也不一样,需要仔细阅读文档。

---晓凡  20231217日于武汉书

这篇关于紫光FPGA DDR3 IP使用和注意事项(axi4协议)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507284

相关文章

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty