AXI4-Stream Data FIFO(2.0)

news/2025/2/22 21:03:51/文章来源:https://www.cnblogs.com/daydaygood/p/18731254

IP核具体设置如下,数据宽度64bit,深度32,启用了包传输。


打开Example Design

三个IP核和两个AXI读写模块。
clk_wiz_0是mmcm IP核,提供工作时钟,proc_sys_reset_0是系统复位 IP核,提供复位信号,axis_data_fifo是本次的仿真IP 核。
axis_data_fifo_example_master是写模块,向fifo中写入数据,axis_data_fifo_example_slave是读模块,从fifo中读出数据。
开始仿真,打开modelsim。
输入200M时钟,经clk_wiz_0输出10M时钟和locked信号(图中目前未置1)

clk_wiz_0输出的10M时钟信号作为全局时钟,连接slowest_sync_clock,dcm_locked来自clk_wiz_0的locked信号,ext_reset_in是来自外部的复位信号。
检测到dcm_locked为1,且ext_reset_in为1时,一段时间后peripheral_aresetn置1,作为全局的复位信号。

至此,时钟和复位介绍已结束,后续不展示这部分的波形。
如下为,写fifo和读fifo的波形,先来看写的过程,这里axis_data_fifo作为从,外部的axis_data_fifo_example_master作为主,涉及信号为s_axi_tvalid,s_axi_tready,s_axi_tlast,s_axi_tdata,axis_wr_data_count。
当s_axi_tvalid(来自axis_data_fifo_example_master),s_axi_tready(来自axis_data_fifo)均有效时,当前s_axi_tdata的数据会被写入fifo,如果该数据写入的同时s_axi_tlast为1,则该数据被读出的时候,tlast信号也为1,及与写入时的tlast信号保持一致。注意到axis_wr_data_count的数值更新要慢一个时钟周期,可能原因在于axis_wr_data_count指示的是当前fifo中的数据个数,在写第一个数据的时候,内部实际数据个数为0,在写第二个数据的时候,内部实际数据个数才为1。
再看读的过程,这里axis_data_fifo作为主,外部的axis_data_fifo_example_slave作为从,涉及信号为m_axi_tvalid,m_axi_tready,m_axi_tlast,m_axi_tdata,axis_rd_data_count。
m_axi_tdata上的数据实际要早于m_axi_tvalid,m_axi_tready被安置在m_axi_tdata上,当m_axi_tvalid,m_axi_tready同时有效的时候,m_axi_tdata上的数据会在下一个时钟周期更新,这样就保证了对于从来讲,m_axi_tvalid,m_axi_tready,m_axi_tdata是在同一个时钟周期里的。
由此我推论出,只有当一个可以读的数据出现在m_axi_tdata上时,m_axi_tvalid才会被置1,等到m_axi_tready为1时,判断目前axis_rd_data_count是否大于1,及fifo中可被读取的数据个数,如果axis_rd_data_count大于1,m_axi_tdata上的数据变为下一个,m_axi_tvalid继续为1,如果axis_rd_data_count不大于1,m_axi_tvalid置为0,表示不可读取。至于axis_rd_data_count为啥继续增加,因为这个周期已经写入了一个新数,而准备被读走的数要在下一个周期才能被送走,所以下个上升沿的时候axis_wr_data_count,axis_rd_data_count都没有变化,原因就在于下一个周期既写入了一个新数据,又被送走了一个旧数据,fifo总体的数据个数是不变的,可以注意到,axis_wr_data_count,axis_rd_data_count在大部分时间都是相等的,我们可以认为都代表fifo中存有的数据个数,但还有一点不同在于axis_rd_data_count是从0直接变为2的,这需要注意。

继续往后看,因为写的过程是一直不停的,而读的过程是间断一个时钟的,所以fifo里的数据一直都在增加,因为我的数据深度是32,很快就会满,所以后面写的过程也会断断续续。
这个时候s_axi_tready,m_axi_tready是反相的。先看s_axi_tready置0时候的过程。
第一部分,在axis_wr_data_count为32的时候,下个周期可能是31、32、33,我们取最差的情况,即下个周期为33的时候,当判断条件为s_axi_tready为1,m_axi_tready=0,即下个周期即将写入一个新数据,axis_wr_data_count将=34,如果继续s_axi_tready置1,那么就会在fifo里已有34个数据的情况下,数据继续被写入,这个过程可能会带来问题,所以置0,但此时判断条件为s_axi_tready为1,m_axi_tready=1,即下个周期即将写入一个新数据,也要读出一个旧数据,axis_wr_data_count将保持一个周期的33,所以s_axi_tready可以继续为1。
第二部分,在axis_wr_data_count为33的时候,下个周期可能是32、33、34,我们取最差的情况,即下个周期为34的时候,参考第一部分,当判断条件为s_axi_tready为0,m_axi_tready=1,即下个周期即将读出一个旧数据的时候,s_axi_tready可以为1,其他判断条件下,s_axi_tready都必须为0,即停止写入。
第三部分,在axis_wr_data_count为34的时候,下个周期可能是33、34,我们取最差的情况,即下个周期为34的时候(这种情况是这个周期既读了一个旧数据,又写了一个新数据的情况,如果这个周期,又写了一个新数据但没有读出一个旧数据,说明上个部分axis_wr_data_count为33的时候的逻辑判断不对)参考第一部分,axis_wr_data_count将继续=34,此时s_axi_tready必须为0
后面即重复上述的三个部分。

注意s_axi_tlast为1的最后一个数为64'hffffffffffffffff

读出64'hffffffffffffffff这个数据的时候m_axi_tlast也为1,这里64'h1f1f1f1f1f1f1f1f被写入时为1

64'h1f1f1f1f1f1f1f1f被读出时m_axi_tlast也为1

最后再看,m_axi_valid置0的过程
在axis_rd_data_count为1的时候,m_axi_tdata的数据是最后一个数据,所以当判断条件m_axi_tready=1的时候,m_axi_valid就可以置0了。

最后,本Example Design分析仅为个人分析推论,并作为记录,并非一定正确,还请自己判断思考。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek宣布下周开源5大项目,这才是真OpenAI!

近日,DeepSeek 团队宣布将在下周连续开源 5 个项目。这一举措不仅吸引了众多开发者的目光,还在技术社区引发了热烈讨论,不少网友甚至将 DeepSeek 誉为 “真正的 OpenAI”。一、DeepSeek开源计划详情(一)开源时间与方式DeepSeek团队决定开展“OpenSourceWeek”(开源周)活…

NOIP 2024 游记 | Loser.

Loser. p.s. 本文章比较废话()Day 1 早上 6:30 被拽起来了。吃饭。出门。坐地铁。到! 华科大门,比,华师气派多了诶诶。扯了个横幅,拍照。拍照。拍照。 诶诶,怎么 7:45 就拽着我们进去了。 进考场。我怎么是第一排第一个 /jk 看见了 @Hakureireimu_cjrljpx,但是他不认识…

利用 vscode 进行远程开发

打开远程项目路径在远程服务器上安装 vscode 插件 Go、GitLens、Git History、Git Graph、MarsCode AI对于本地已经安装的插件,点击Install In SSH:xxx就能把插件安装到远程服务器对于本地没有安装的插件,直接查找插件,选中安装,即是安装到远程服务器git 不高亮显示修改行从…

查看Oracle的数据库表命令

在 Oracle 里 “数据库” 的概念和其他数据库系统有所不同,Oracle 一个实例通常对应一个数据库,但可以包含多个不同的模式(类似于其他数据库系统中的用户数据库)1. 查看数据库名称你可以在 SQL*Plus 或者 SQL Developer 等工具中执行如下 SQL 语句:SELECT name FROM v$dat…

Linux 中declare命令详解

Linux 中declare命令001、普通测试[root@PC1 dir1]# ls [root@PC1 dir1]# echo $var1[root@PC1 dir1]# var1="hello world" [root@PC1 dir1]# echo $var1 hello world [root@PC1 dir1]# var1=100.55 [root@PC1 dir1]# echo $var1 100.55 [root@PC1 dir1]# var1=100 […

《软件开发与创新课程设计》第一次课后作业——对学生选课系统的改进

(1)博客介绍 本文的学生选课系统的源码来自于csdn的一篇博客当中。该系统的实现语言以C++为主,本文的主要内容围绕该系统进行分析,并针对系统的主要问题进行一些修改或重构。 本篇如有问题存在,请各位读者多多指正! (2)学生选课系统分析 源代码如下: 点击查看代码 #de…

pikachu unsafe Fileupload

在上传点上传非法文件,提示上传文件不符合要求,且BP没有新的数据包产生,判断为客户端检查禁用浏览器JavaScript后刷新网页,再次上传文件,提示上传成功,文件路径为uploads/test.phpedge: 设置->Cookie和网站权限->所有权限->Javascript->禁用 Chorme:设置-&g…

rust学习十九.1、模式匹配(match patterns)

本章节大概是书本上比较特殊一个,因为它没有什么复杂的内容,通篇主要讨论模式匹配的语法。 一、两个名词a.可反驳 - refutable 对某些可能的值进行匹配会失败的模式被称为是 可反驳的(refutable) let Some(x) = some_option_value;如果 some_option_value 的值是…

大对数电缆打线顺序

5种线缆主色:白色、红色、黑色、黄色、紫色 5种线缆配色:蓝色、橙色、绿色、棕色、灰色 25对电话电缆色谱线序表30对电话电缆色谱线序 这里要特别说明下:30对的电话电缆要注意了,30对通信电缆里有2种白色的主色,大于25对了就一定要看标识线了!!有一小把是用“白蓝"…

01-springsecurity数据库登录

01 - SpringSecurity实现数据库登录 环境: springboot 3.4.2, springsecurity 6.4.2, mybatis 3.0.4springsecurity中的UserDetails接口用于表示用户信息, 包含用户名、密码等信息。UserDetailsService接口用于加载用户信息, 里边就这一个方法 public interface UserDetailsSer…

【喜与悲】- 2025.2.22 晚

下图为《Balatro》中的一张小丑牌:【喜与悲】喜与悲可以重新触发所有打出的人头牌,是重新触发家族中的一员。但其特性也决定了其强度方差极大,有配合则强度很高,没有配合则纯浪费小丑位。但很少有小丑能与其配合,而能与其配合的小丑大多单独拎出来又不强。更多时候其几乎只…

莫队算法学习笔记

莫队算法的发明者是一个叫做 莫涛 的人,所以被称为莫队算法,简称莫队。 英语 Mos algorithm。 使用场景 莫队算法常常被用来处理多次区间询问的问题,离线处理询问(必须满足!!!)。 插叙:离线是一种得到所有询问再进行计算的方法,是很重要的思想。 对于这种“区间询问”…