FPGA - AXI4_Lite(实现用户端与axi4_lite之间的交互逻辑)

在之前的博客中对AXI4总线进行了介绍(FPGA-AXI4接口协议概述),在这篇博客中,实现用户端与axi4_lite之间的交互逻辑。

一, AXI4 

1.1 AXI4 介绍

对AXI4总线简单介绍(具体可见FPGA-AXI4接口协议概述)

①AXI4是ARM公司提出的是一种高性能、高带宽、低延迟的片内总线

②主要描述了主设备和从设备之间的数据传输方式

③分类:AXI4_FULL、AXI4_LITE、AXI4_STREAM

AXI4_LITE 不支持突发传输。常用与数据量较小的传输,可以理解为轻量级 的AXI4_FULL

AXI4_FULL 又被称为AXI4,支持突发传输,突发长度为1~256。

AXI4_STREAM 丢弃了地址项,常用于高速数据传输。

1.2 什么是片内、片外

AXI4 用途:

        ① FPGA内部两个模块的数据传输

        ② ZYNQ中PS与PL交互

二、AXI_LITE通道介绍

        AXI协议中,有5条读写通道:

        2条有关读的通道

                ·  read address   读地址

                ·  read data         读数据(与读响应合并)

        3 条有关写的通道

                ·  write address    写地址

                ·  write data         写数据

                ·  write response  写响应

总结: ① 读写分离。 ② 读没有读响应通道。

三,握手机制

        五个通道想要进行数据交互首先需要进行双向握手,握手时,传输源(发送方)会产生 VALID 信号来指明此时的数据或控制信号是否有效,目的源(接收方)会产生 READY 信号来告诉传输源,是否已经准备好接收数据或控制信号了。只有当这两个信号都为高时,才算握手成功,传输源会在握手成功时的时钟上升沿进行一次数据传输。

        这种双向流控机制使得发送与接收双方都有能力控制传输速率,通过控制 VALID 和 READY 的高低电平来控制传输的时机以及速度。

        既然是握手机制,自然也就跟我们平时握手时一样,会有个先后顺序, VALID 和 READY 在握手时共有三种关系

1. VALID 信号先拉高, READY 信号后拉高

此时握手信号与数据以及时钟的关系如下:

 此时握手信号与数据以及时钟的关系如下:

这里的 ACLK AXI4的全局时钟INFORMATION 为待传输的内容, VALID/READY 为握手信号。从图中可以看到,VALID 信号在 T1 信号之后到来 (拉高),与其一起来的还有数据、地址或者控制信号。而 READY 信号则是在 T2之后被拉高,因为错过了上升沿,直到T3时刻才被检测到,此时握手成功, 内容得以被传输。

AXI4 协议中规定,VALID 信号一旦拉高,在握手成功之前不能被拉低,因 此,VALID 信号会一直等待,直到在上升沿时刻检测到 READY 为高后 VALID 才能被拉低。

2. READY 信号先拉高,VALID 信号后拉高

此时握手信号与数据以及时钟的关系如下:

可以看到,T1 时刻之后 READY 信号拉高,而 VALID 信号则是在 T2 时刻 之后拉高,因为错过了时钟上升沿,所以在 T3 时刻才握手成功,此时, INFORMATION 中的信息被传输。

实际上,即使 READY 信号被拉高,只要 VALID 信号没有被拉高,接收方也可以拉低 READY 信号。例如,接收方置高 READY后,发现自己还有传输需 要完成,而此时发送方还没准备好数据(未置高VALID),这时候接收方便能够拉低 READY信号,转去处理其他传输,传输完成后再回来拉高 READY等待接 收数据。

3. VALID 信号和 READY 信号一起拉高

这种情况下就比较简单,READY 信号与 VALID 信号同时拉高,在下一个 时钟上升沿也就是 T2 被检测到,此时握手成功,INFORMATION 得以传输。

五个通道都有自己的握手信号对,对应的名称如下:

四、AXI_LITE端口信号及其功能

1. AXI_LITE 传输数据的位宽仅支持32位或64位的数据总线宽度,也就是WDATA和RDATA只能为32bit或者64bit。

2. WSTRB信号:

一般在使用中,wstrb信号全为1。

3. AWPORT、ARPORT信号

AWPORT信号,官方文档解释为:

        写通道保护类型。该信号指示事务的特权和安全级别,以及事务是数据访问还是指令访问。

默认为3’b000即可。

4. BRESP和RRESP信号

其中,axi_lite 不支持 EXOKAY。

五,axi4_lite 读写过程

5.1 写过程

1、主机发送写地址和写数据的顺序关系:

        主机可以先发送写地址,后发送写数据;

        主机可以先发送写数据,后发送写地址;

        主机可以同时发送写地址和写数据;

2、从机接收写地址和写数据的顺序关系:

        从机可以先接收写地址,后接收写数据;

        从机可以先接收写数据,后接收写地址;

        从机可以同时接收写地址和写数据;

常用的模式为:

5.2 读过程

5.3 axi4_lite 读写过程框架图

根据读写过程分析:

用户写时,将写地址存放到wr_cmd_fifo中,将写数据存放到wr_data_fifo中,FIFO的dout传输到axi4_lite_master中。

用户读时,将读地址存放到rd_cmd_fifo中,从wr_data_fifo中读数据。

代码编写(顶层模块):

// -----------------------------------------------------------------------------
// Author : RLG
// File   : axi4lite_master.v
// -----------------------------------------------------------------------------
`timescale 1ns / 1ps
module axi4lite_master#(
	parameter USER_WR_DATA_WIDTH  = 32,
	parameter AXI_DATA_WIDTH      = 32,   //注意AXI4的数据位宽只有32bit或者64bit
	parameter AXI_ADDR_WIDTH      = 32,
	parameter USER_RD_DATA_WIDTH  = 32
	)(
	input                                      user_wr_clk     ,
	input                                      user_rd_clk     ,
	input                                      axi_clk         ,
	input                                      reset           ,

	input     wire                             user_wr_we      ,
	input     wire  [USER_WR_DATA_WIDTH-1:0]   user_wr_data    ,
	input     wire  [AXI_ADDR_WIDTH-1    :0]   user_wr_addr    ,
	output    wire                             user_wr_ready   ,

	input     wire                             user_rd_en      ,
	input     wire  [AXI_ADDR_WIDTH-1    :0]   user_rd_addr    ,
	output    wire  [USER_RD_DATA_WIDTH-1:0]   user_rd_data    ,
	output    wire                             user_rd_ready   ,
	output    wire                             user_rd_vaild   ,

	output    wire  [AXI_ADDR_WIDTH-1:0]       m_axi_awaddr    ,
	output    wire  [2:0] 				 	   m_axi_awprot    , 
	output    wire   		 		           m_axi_awvalid   , 
	input     wire    		 	    	       m_axi_awready   ,
  
	output    wire  [AXI_DATA_WIDTH-1  :0]     m_axi_wdata     ,
	output    wire  [AXI_DATA_WIDTH/8-1:0] 	   m_axi_wstrb     , 
	output    wire   		 		           m_axi_wvalid    , 
	input     wire    		 	    	       m_axi_wready    ,
  
	input     wire  [1:0]	         	       m_axi_bresp     ,  //wirte response channel
	input     wire	   			    	       m_axi_bvalid    ,
	output    wire    			         	   m_axi_bready    , 

	output    wire  [AXI_ADDR_WIDTH-1:0]       m_axi_araddr    ,
	output    wire  [2:0] 				 	   m_axi_arprot    , 
	output    wire   		 		           m_axi_arvalid   , 
	input     wire    		 	    	       m_axi_arready   ,
  
	input     wire  [AXI_DATA_WIDTH-1  :0]     m_axi_rdata     ,
	input     wire   		 		           m_axi_rvalid    , 
	input     wire  [1:0]                      m_axi_rresp     ,
	output    wire    		 	    	       m_axi_rready    
    );

	wire                                       wr_data_fifo_err;
	wire                                       wr_cmd_fifo_err ;
	wire                                       rd_data_fifo_err;
	wire                                       rd_cmd_fifo_err ;

	
	axi4lite_wr_channel #(
			.USER_WR_DATA_WIDTH(USER_WR_DATA_WIDTH),
			.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
			.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH)
		) axi4lite_wr_channel (
			.clk              (user_wr_clk),
			.axi_clk          (axi_clk),
			.reset            (reset),

			.user_wr_we       (user_wr_we),
			.user_wr_data     (user_wr_data),
			.user_wr_addr     (user_wr_addr),
			.user_wr_ready    (user_wr_ready),

			.m_axi_awaddr     (m_axi_awaddr),
			.m_axi_awprot     (m_axi_awprot),
			.m_axi_awvalid    (m_axi_awvalid),
			.m_axi_awready    (m_axi_awready),

			.m_axi_wdata      (m_axi_wdata),
			.m_axi_wstrb      (m_axi_wstrb),
			.m_axi_wvalid     (m_axi_wvalid),
			.m_axi_wready     (m_axi_wready),

			.m_axi_bresp      (m_axi_bresp),
			.m_axi_bvalid     (m_axi_bvalid),
			.m_axi_bready     (m_axi_bready),

			.wr_data_fifo_err (wr_data_fifo_err),
			.wr_cmd_fifo_err  (wr_cmd_fifo_err)
		);


	axi4lite_rd_channel #(
			.USER_RD_DATA_WIDTH(USER_RD_DATA_WIDTH),
			.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
			.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH)
		) axi4lite_rd_channel (
			.clk              (user_rd_clk),
			.axi_clk          (axi_clk),
			.reset            (reset),

			.user_rd_en       (user_rd_en),
			.user_rd_addr     (user_rd_addr),
			.user_rd_data     (user_rd_data),
			.user_rd_ready    (user_rd_ready),
			.user_rd_vaild    (user_rd_vaild),

			.m_axi_araddr     (m_axi_araddr),
			.m_axi_arprot     (m_axi_arprot),
			.m_axi_arvalid    (m_axi_arvalid),
			.m_axi_arready    (m_axi_arready),

			.m_axi_rdata      (m_axi_rdata),
			.m_axi_rvalid     (m_axi_rvalid),
			.m_axi_rresp      (m_axi_rresp),
			.m_axi_rready     (m_axi_rready),

			.rd_data_fifo_err (rd_data_fifo_err),
			.rd_cmd_fifo_err  (rd_cmd_fifo_err)
		);
endmodule

仿真波形:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【3D reconstruction 学习笔记】

三维重建 3D reconstruction 1. 相机几何针孔相机摄像机几何 2. 相机标定线性方程组的解齐次线性方程组的解非线性方程组的最小二乘解透镜相机标定带畸变的相机标定 3. 单视图重建2D平面上的变换3D空间上的变换单视测量无穷远点 无穷远线 无穷远平面影消点 影消线单视重构 4. 三…

AJAX踩坑指南(知识点补充)

JWT JSON Web Token是目前最为流行的跨域认证解决方案 如何获取:在使用JWT身份验证中,当用户使用其凭据成功登录时,将返回JSON Web Token(令牌) Token本质就是一个包含了信息的字符串 如何获取Token:登录成功之后,服务…

K8s+Nacos实现应用的优雅上下线【生产实践】

文章目录 前言一、环境描述二、模拟请求报错三、配置优雅上下线1.修改nacos配置2.修改depolyment配置3.重新apply deployment后测试4.整体(下单)测试流程验证是否生效 四、期间遇到的问题 前言 我们在使用k8s部署应用的时候,虽然k8s是使用滚动升级的,先…

处理登录失效后提示多个错误

问题: 我的场景是后端规定,即使登录失效返回的code仍是200,然后data的code是999什么的; 原本代码: 修改版代码: 通过节 const NotLoginEvent () > {router.replace("/login");localStorage.clear();M…

队列——数据结构——day5

队列 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是q(a1,a2,……,an),那么a1就是队头元…

银行数字人民币系统应用架构设计

2019年10月,01区块链联合数字资产研究院发布了《人民币3.0:中国央行数字货币运行框架与技术解析》,从数字货币界定和人民币发展历程出发,区分了央行数字货币与比特币、移动支付等的区别,全面介绍了央行数字货币的发展历…

C#,图论与图算法,有向图(Direct Graph)广度优先遍历(BFS,Breadth First Search)算法与源程序

1 图的广度优先遍历 图的广度优先遍历(或搜索)类似于树的广度优先遍历(参见本文的方法2)。这里唯一需要注意的是,与树不同,图可能包含循环,因此我们可能再次来到同一个节点。为了避免多次处理节点,我们使用布尔访问数组。为简单起见,假设所有顶点都可以从起始顶点到达…

ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境:Linux系统CentOS7.6、宝塔、PHP7.4、MySQL5.6,根目录public,伪静态thinkPHP,开启ssl证书 具有文章改写、广告营销文案、编程助手、办公达人、知心好友、家庭助手、出行助手、社交平台内容、视频脚本创作、AI绘画、思维导图等功能 ai通道:文心一言、MiniMax、智…

GraalVM详细安装及打包springboot、java、javafx使用教程(打包springboot2篇)

前言 在当前多元化开发环境下,Java作为一种广泛应用的编程语言,其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱,而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而&#xff…

Linux设备驱动开发 - 三色LED呼吸灯分析

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 展锐UIS7885呼吸灯介绍呼吸灯调试方法亮蓝灯亮红灯亮绿灯展锐UIS7885呼吸灯DTS配置ump9620 PMIC驱动ump9620中的LED呼吸灯驱动LED的tr…

python--容器、列表

1.python官方内置的容器 list: set: tuple: dict: 弱数据类语言通通没有数组,因为数组指的是 类型固定、大小固定、连续的内存空间。 2.链表: 非连续内存空间 python用的是双向链表 单向链表:优点:不浪费内存&#xf…

代码随想录day28(1)二叉树:二叉搜索树中的插入操作(leetcode701)

题目要求:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。 思路:对于二叉搜索树来说&…

如何使用ospf (enps) 简单实践ospf协议

1. OSPF的基本概念 OSPF(Open Shortest Path First,开放式最短路径优先)是一种广泛应用于TCP/IP网络中的内部网关协议(Interior Gateway Protocol, IGP),主要用于在同一自治系统(Autonomous Sys…

SpringBoot项目集成XXL-job

文章目录 首先引入依赖配置信息配置类定义定时任务执行方法配置任务执行器配置任务执行计划 在集成 XXL-job 前,首先确保部署了 XXL-job 的 admin 服务, 如果还没有部署的话请参照 Docker安装部署XXL-Job 将 XXL-job 部署起来. 此时, XXL-job 已经部署好了, 下来一步一步的来集…

【Python 滑块不同的操作】对滑块进行处理,列如切割、还原、去除、无脑识别距离等等

文章日期:2024.03.23 使用工具:Python 类型:图片滑块验证的处理(不限于识别距离) 使用场景:? 文章全程已做去敏处理!!! 【需要做的可联系我】 AES解密处理&a…

BGP4+简介

定义 BGP是一种用于自治系统AS(Autonomous System)之间的动态路由协议,常用版本是BGP-4,BGP-4只能传递IPv4路由。针对IPv6的BGP4扩展,通常称为BGP4。 目的 BGP4用于在AS之间传递路由信息,并不是所有情况…

Python爬取歌曲宝音乐:轻松下载Jay的歌

歌曲宝是一个不用付费就能听jay的歌曲,但是每次都只能播放一首不方便,于是今天想把它下载下来,本地循环播放,它所用到的接口是某我的还不错哈 获取搜索接口 分析html请求接口,获取到的数据是直接渲染好的HTML内容&…

lvs+keepalived+nginx实现高可用

主机:192.168.199.132 备机:192.168.199.133 真实服务器1:192.168.199.134 真实服务器2:192.168.199.135 问题: 防火墙没关 132配置ipvsadm进行dr模式 132配置keepalived.conf 133配置ipvsadm进行dr模式 133配置ke…

【测试开发学习历程】计算机编程语言

前言: 学习完数据库,我们便要进入到编程语言的内容当中了。 这里先对编程语言写出大致的分类, 在这之后,我们会以Python为重点, 开始测试开发为重点的编程语言学习。 目录 1 计算机编程语言的发展 2 语言的分类…

高蛋白的猫粮品牌有哪些?

亲爱的猫友们,你们是否也在寻找一款高蛋白的猫粮,希望给自家的小猫咪提供最好的营养呢?🐱 在市面上,高蛋白的猫粮品牌确实不少,但要说到真正让人信赖的,福派斯鲜肉无谷猫粮无疑是一个不错的选择…