紫光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解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者