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

news2024/9/20 14:41:07

在之前的博客中对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

仿真波形:

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

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

相关文章

[linux][调度] 内核抢占入门 —— 线程调度次数与 CONFIG_PREEMPTION

在工作中,如果你正在做开发的工作,正在在写代码,这个时候测试同事在测试过程中测出了问题,需要你来定位解决,那么你就应该先暂停写代码的工作,转而来定位解决测试的问题;如果你正在定位测试的问…

C++位运算符(<<,>>,|,^,)

简介 位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。位运算符提供检查和设置二进制位的功能,一种名为bitset的标准库类型也可以表示任意大小的二进制集合,所以位运算符同样可以用于bitset类型。 如果运算对象是“小…

ShardingSphere啦啦啦

N年前写的ShardingSphere部分(上)_sharding 分库不能sum-CSDN博客 https://shardingsphere.apache.org/document/current/en/quick-start/ 高性能架构模式: 读写分离:读写操作分散到不同的节点上 (这句话 我悟了) 据SQL语义分…

磁盘在哪里清理?电脑磁盘清理的5个方法

当我们使用电脑时,随着时间的推移,磁盘空间可能会逐渐减少,这通常是因为各种临时文件、系统更新、浏览器缓存等原因造成的。磁盘空间不足可能会导致电脑性能下降,因此定期清理磁盘是非常必要的。那么,磁盘在哪里清理呢…

2核4G服务器优惠价格和性能测试,2024年

阿里云2核4G服务器租用优惠价格,轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图: 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

软件质量属性总结

软件系统的质量就是“软件系统与明确地和隐含地定义的需求相一致的程度”。更具体地说,软件系统质量是软件与明确地叙述的功能和性能需求文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度。 根据GB/T 16260.1定义,从…

Java学习day1

打开命令提示符(cmd)窗口: 按下winR键,输入cmd 按回车或点击确定,打开cmd窗口 常用cmd命令 盘符名称冒号(D:):盘符切换,示例表示由C盘切换到D盘 dir:查看当前路径下的内…

元宇宙VR数字化艺术展降低办展成本

元宇宙AI时代已经来临,越来越多人期待在元宇宙数字空间搭建一个属于自己的虚拟展厅,元宇宙虚拟展厅搭建平台是VR公司深圳华锐视点为企业研发的可编辑工具,那么元宇宙虚拟展厅搭建平台有哪些新突破? 元宇宙虚拟展厅搭建平台采用了先进的web3D…

扫描二维码如何展现不同内容?内容组合排版展示的二维码怎么做?

扫描二维码来查看内容的方式已经被广泛使用,比如视频、文件、图片、音频、文本等类型的内容都可以应用二维码来提供展示。那么有些时候需要展示的内容类型较多,需要将不同的内容组合到一起展示,该如何来操作呢? 下面的内容学会之…

【QT入门】 Qt自定义信号后跨线程发送信号

往期回顾: 【QT入门】 lambda表达式(函数)详解-CSDN博客 【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客 【QT入门】 Qt实现自定义信号-CSDN博客 【QT入门】 Qt自定义信号后跨线程发送信号 由于Qt的子线程是无法直接修改ui,需要发送信号到ui线程进行修改…

Windows Insiders WSLg Linux GUI App 支持尝鲜

2021 年 4 月 21 日,微软在 Developer Blogs 发布了 Windows 预览版 WSL(Windows Linux 子系统) 对 Linux GUI App 的支持的公告🔗,碰巧😀我最近重装了波电脑,系统换成了 Windows Insiders&…

HCIP的学习(3)

网络类型及数据链路层协议 网络类型分类 P2P网络----点到点网络类型MA网络-----多点接入网络 BMA----广播型多点接入网络NBMA—非广播型多点接入网络(快淘汰了) 数据链路层协议 MA网络 以太网协议 特点:需要使用MAC地址对设备进行区分…

安装IK分词器 + 扩展词典配置 + 停用词典配置

安装IK分词器 1.在线安装ik插件(较慢) # 进入容器内部 docker exec -it elasticsearch /bin/bash ​ # 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elastics…

专业140+总分410+南京大学851信号与系统考研经验南大电子信息与通信集成,电通,真题,大纲,参考书。

今年分数出来还是有点小激动,专业851信号与系统140(感谢Jenny老师辅导和全程悉心指导,答疑),总分410,梦想的南大离自己越来越近,马上即将复试,心中慌的一p,闲暇之余&…

[综述笔记]A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis

论文网址:Frontiers | A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis (frontiersin.org) 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论…

Java 8 内存管理原理解析及内存故障排查实践

作者:vivo 互联网服务器团队- Zeng Zhibin 介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,介绍各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时有一个明确的思路和方向。 …

NBlog Java定时任务-备份MySQL数据

NBlog部署维护流程记录(持续更新):https://blog.csdn.net/qq_43349112/article/details/136129806 为了避免服务器被攻击,给博客添加了一个MySQL数据备份功能。 此功能是配合博客写的,有些方法直接用的已有的&#xf…

地理坐标系与UTM坐标系转换并进行gazebo测试

地理坐标系与UTM坐标系转换并进行gazebo测试 经纬度到UTM坐标的转换gazebo测试环境 全球卫星导航系统(Global Navigation Satelite System,GNSS),简称卫星导航,是室外机器人定位的一个主要信息来源。 卫星导航能给机器人提供什么信息? 正常工…

解决Matplotlib 画图中文无法正常显示的问题(显示方框)

解决Matplotlib 画图中文无法正常显示的问题(显示方框) 错误描述解决方案一(暂时解决)解决方法二(永久解决)测试代码 错误描述 这个错误消息来自于使用 Python 的 IPython 环境,特别是在尝试输出…

基于 Google MediaPipe 进行人体姿势估计演示

用于人体姿势估计的 MediaPipe 演示 MediaPipe简介 MediaPipe是一个开源框架,用于构建跨平台、多模式应用机器学习管道。它由 Google 开发,旨在促进基于机器学习的功能的快速开发和部署,特别关注音频、视频和时间序列数据。 我可以将 MediaPi…