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

news2024/11/28 8:49:28

紫光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)//握手信号
             begin
               axi_awvalid <= 1'b0;//完成握手用户拉低axi_awvalid信号,为下次握手做好准备
               axi_awaddr<=28'h0000111;//握手成功就写入首地址,
               axi_awid<=8'h01;
               axi_awlen<=8'd120;//实际长度为 axi_awlen+1
               state<=8'd2;
             end
            else//等待写地址握手成功
              begin
               state<=8'd1;
              end
         end 

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) 
  begin
    state<=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
else
  begin
    case(state) 
    8'd0:begin//空闲状态
            if(ddr_init_done==1'b1 && test_start==1'b0)
               state<=8'd1;
            else
               state<=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)//握手信号
             begin
               axi_awvalid <= 1'b0;//完成握手用户拉低axi_awvalid信号,为下次握手做好准备
               state<=8'd2;
             end
            else//等待写地址握手成功
              begin
               state<=8'd1;
              end
         end 

   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+1
           if(axi_awvalid & axi_awready)//握手信号
             begin
               axi_awvalid <= 1'b0;//0
               state<=8'd0;
             end
            else//等待写地址握手成功
              begin
               state<=8'd2;
              end
         end 




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+1
           axi_aruser_ap <= 1'b0;  
           if(axi_arvalid & axi_arready)
             begin
               axi_arvalid<=1'b0;
               state<=8'd7;
             end
            else
              begin
               //axi_arvalid<=1'b0;
               state<=8'd6;
              end
         end

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

---晓凡  20231217日于武汉书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1318640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wireshark下载安装

下载 Wireshark Download 等待下载完成 安装 双击 下面的一定垚勾选上 下图的也一定要勾选上 修改为不重启&#xff0c;不需要重启也是正常的

嵌入式中的门电路详讲

NOT门电路 NOT(非门)是数字逻辑电路中的一种基本逻辑门,也称为反相器。它执行的是逻辑非操作,即将输入信号取反。NOT门具有一个输入和一个输出。 A输入,B输出,以下是真值表: A B 0 1 1 0 AND门电路 AND(与门)是数字逻辑电路中的一种基本逻辑门,用于执行逻辑与操作。…

从 0 开始实现一个 SpringBoot + Vue 项目

从 0 开始实现一个 SpringBoot Vue 项目 从 0 开始实现一个 SpringBoot Vue 项目软件和工具创建 SpringBoot 后端项目创建 MySQL 数据库配置文件实现增删改查接口Model 层mapper 层service 层controller 层测试 从 0 开始实现一个 SpringBoot Vue 项目 软件和工具 后端开发…

jmeter如何循环运行到csv文件最后一行后停止

1、首先在线程组中设置’循环次数‘–勾选永远 2、csv数据文件设置中设置&#xff1a; 遇到文件结束符再次循环?——改为&#xff1a;False 遇到文件结束符停止线程?——改为&#xff1a;True 3、再次运行就会根据文档的行数运行数据 &#xff08;如果需要在循环控制器中&…

[python]用python获取EXCEL文件内容并保存到DBC

目录 关键词平台说明背景所需库实现过程方法1.1.安装相关库2.代码实现 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 背景 在搭建自动化测试平台的时候经常会提取DBC文件中的信息并保存为excel或者其他文件格式&#xff0c;用于自动化测试。本文…

STL容器之string(上)

目录 什么是STL string类 string类常见接口 string类的常见构造函数 string类对象的容器操作 string类对象的访问及遍历操作 string类对象的修改操作 拓展 从本期开始&#xff0c;我们将正式学习C中的STL&#xff0c;美国的麦克阿瑟将军说过&#xff1a;“C不能没有STL就…

轻量封装WebGPU渲染系统示例<52>- Json数据描述材质、纹理等3D渲染场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene3.ts 当前示例运行效果: ​​​​​​​ Json数据: {"renderer": {"mtplEnabled": true,"camera": {"eye&quo…

Linux实操——安装Mysql

安装Mysql 一、检查是否已经安装了mariadb数据库,并卸载二、下载mysql包&#xff0c;并通过ftp上传到服务器三、解压安装包四、创建数据存储文件夹五、创建执行mysqld命令的用户&#xff0c;并初始化mysql六、启用传输安全七、启动mysql&#xff0c;验证是否安装成功 总结 博主…

若依 ruoyi-vue3+ts-plus+ 宇道 yudao-ruoyi-vue-pro前端显示部门名称

想在 index.vue 上显示列表里对应的部门名称 效果 引入dept import * as DeptApi from "/api/system/dept"; 初始化时 /** 初始化 **/ onMounted(async () > {getList();deptNameList.value await DeptApi.getSimpleDeptList(); }) 加载id 对应的部门名称 …

威联通硬盘休眠后修改系统定时任务

按照网上一些教程&#xff0c;成功将威联通的机械硬盘设置了自动休眠。但是发现每天有多个整点硬盘会自动唤醒&#xff0c;怀疑是系统内置的定时任务触发了硬盘唤醒。 通过查看系统日志中事件和访问记录&#xff0c;判断出一些引发硬盘唤醒的自动任务&#xff0c;将这些定时任…

机器学习项目精选 第一期:超完整数据科学资料合集

大噶吼&#xff0c;不说废话&#xff0c;分享一波我最近看过并觉得非常硬核的资源&#xff0c;包括Python、机器学习、深度学习、大模型等等。 1、超完整数据科学资料合集 地址&#xff1a;https://github.com/krishnaik06/The-Grand-Complete-Data-Science-Materials Pytho…

【基础算法】试除法判定质数(优化)

文章目录 算法优化模板题目代码实现 算法优化模板 bool is_prime(int n){if(n < 2) return false;for(int i 2;i < n / i;i ){ //优化内容if(n % i 0){return false;}}return true; }注意这里的一个总要优化是for循环的终止条件是i<n/i。为什么不是i<n或者i<…

Java EE 网络之网络初识

文章目录 1. 网络发展史1.1 独立模式1.2 网络互连1.3 局域网 LAN1.4 广域网 WAN 2. 网络通信基础2.1 IP 地址2.2 端口号2.3 认识协议2.4 五元组2.5 协议分层2.5.1 什么是协议分层2.5.2 分层的作用2.5.3 OSI七层协议2.5.4 TCP/IP五层协议2.5.5 网络设备所在分层 2.6 分装和分用 …

10天玩转Python第9天:python 面向对象 全面详解与代码示例

今日内容 异常 模块和包 导入模块(导包)if __name__ "__main__": Unitest 框架的学习 了解, 基本组成 异常 异常传递[了解] 异常传递是 Python 中已经实现好了,我们不需要操作, 我们知道异常会进行传递. ​ 异常传递: 在函数嵌套调用的过程中, 被调用的函数 ,发…

获取MODIS的NDVI/EVI产品

目录 简介源代码运行流程参考博文 简介 本项目是使用MODIS的NDVI产品&#xff08;MOD13Q1&#xff09;,可获取从2000年至今的所有数据&#xff0c;更新频率为16天 MOD13Q1 V6.1产品以每像素为基础提供植被指数(VI)值。这里有两个主要的植被层。第一种是归一化植被指数(NDVI)&a…

LeedCode刷题---滑动窗口问题(二)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、将X减到0的最小操作数 题目链接&#xff1a;将 x 减到 0 的最小操作数 题目描述 给你一个整数数组 nums 和一个整数 x 。每一…

MetaAI语音翻译大模型Seamless登场,主打AI无缝同声传译

论文题目&#xff1a; Seamless: Multilingual Expressive and Streaming Speech Translation 论文链接&#xff1a; https://ai.meta.com/research/publications/seamless-multilingual-expressive-and-streaming-speech-translation/ 代码链接&#xff1a; GitHub - facebook…

2024年转行软件测试,报培训班3个月出来就是高薪工作,真的靠谱吗?

作为一个已在IT行业工作8年&#xff0c;分享一下我的经验&#xff0c;供大家参考。 讲真&#xff0c;现在想通过培训班培训几个月就进入IT行业&#xff0c;越来越来难了&#xff1b;如果是在2018年以前&#xff0c;还有机会&#xff0c;一方面&#xff0c;那个时候IT行业还不算…

Linux系统log日志简单清理

系统空间告急 清理log日志 找出当前目录中文件最大的10个文件&#xff1a; cd /var/log du -s ./* | sort -nr | head 系统日志log文件&#xff1a; ll -h /var/log/journal 只保留100MB的日志 journalctl --vacuum-size100M 系统暴力爆破SSH日志&#xff1a; ll -h /var/lo…

Flask基本用法:一个HelloWorld,搭建服务、发起请求

目录 1、简介 2、安装 3、Flask使用示例 参考 1、简介 官网文档 Flask是一个轻量的web服务框架&#xff0c;我们可以利用它快速搭建一个服务&#xff0c;对外提供接口&#xff0c;其他人可以轻松调用我们的服务。这对算法工程师来说比较关键&#xff0c;我们通常不擅长搞开发…