紫光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使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3