【FPGA开发】AXI-Lite总线协议解读、Verilog逻辑开发与仿真、Alex Forencich代码解读

目录

  • AXI是什么
  • AXI是如何工作的
  • AXI-Lite定义
    • AXI-Lite的关键特性
    • AXI-Lite信号列表
    • AXI-Lite信号时序
    • 时钟和复位
    • 握手机制
    • 写请求通道(AW)
    • 写数据通道(W)
    • 写响应通道(B)
    • 读请求通道(AR)
    • 读数据通道(R)
    • * 握手的依赖关系(重要)
      • 写事务依赖
      • 读事务依赖
  • AXI-Lite的FPGA实现
    • Xilinx自定义IP核
      • 从机
      • 主机
      • 仿真
    • 手搓
      • Alex Forencich代码解读
        • axil_adapter顶层参数 & 端口
        • axil_adapter_wr

AXI是什么

AXI为ARM AMBA的一部分,是一种微控制总线。
2003年,AMBA3.0发布,其中包含第一版AXI;
2010年,AMBA4.0发布,其中包含第二版AXI,称为AXI4;
时至今日,AXI已经有了AXI5版本,可以在ARM官方网站下载到源文件,可自行下载:
ARM官网中各版本AMBA文件

AXI包括三种接口形式:

名称特点
AXI4高性能的内存映射需求
AXI4-Lite简单的、低吞吐量的内存映射通信(例如,控制寄存器和状态寄存器)
AXI4-Stream用于高速流数据

AXI是如何工作的

AXI是内存映射接口,在一个地址周期内,允许至多256个数据的传输,无论是AXI4还是AXI4-Lite接口,都有五个不同的通道。
在这里插入图片描述
数据可以同时在主机和从机之间的两个方向上移动,并且数据传输的大小可以变化。AXI4中的限制是最多256个数据传输的突发事务。AXI4-Lite只允许每个事务传输1个数据。主从机之间数据读取、写入的通道架构如下所示。
读通道的架构
写通道的架构
需要注意的事,上面虽是两张图,只是为了方便区分读、写操作对应的通道,实际上主、从机应该同时具有5个通道,主机发起读写请求,从机响应主机的读写请求。

AXI-Lite定义

AXI-Lite的关键特性

  • 所有的传输突发长度均为1
  • 所有的数据访问都使用数据总线的全宽度(只能是32-bitsZ或64-bits)
  • 所有的访问都是不可修改的,不可缓冲的
  • 不支持独占访问

AXI-Lite信号列表

在这里插入图片描述
前缀解析
AW:Address Write,写请求通道,对应图中写地址通道
W : Write,写数据通道
B: 写响应通道
AR: Address Read,读地址通道
R: Read,读数据通道
在这里插入图片描述

AXI-Lite信号时序

时钟和复位

在这里插入图片描述

握手机制

同前缀的 VALID/READY信号为一组握手信号,握手协议用来传输地址、控制信息、数据等内容。
这种双向的协议,能够保证主、从机都能够控制传输速率。源端产生VALID信号,指示现在的地址、控制信息、数据都是有效的;目的端产生READY信号,指示现在可以接收信息了,传输发生在二者均为HIGH的时候。

主、从机之间的接口,输出->输入接口之间,一定不能有组合逻辑路径

READY和VALID信号,谁先“伸出手”都无所谓,READY可以在先,VALID可以在先,也可以同时。

下图是同时伸手的时序样例:
在这里插入图片描述

写请求通道(AW)

控制信号如下两个。
在这里插入图片描述
主机只有在要产生有效请求时才能拉高AWVALID信号,一旦拉高,就得保持到从机拉高AWREADY后的时钟上升沿。

AWREADY的默认值是高是低都可以,推荐默认值为高。
AWREADY为高是,从机必须能够接收提供给他的所有有效请求。
不建议AWREADY 默认为LOW是因为,它强制传输至少需要两个周期,一个用于拉高AWVALID,另一个用于拉高AWREADY

AWPROT:可用于保护内存免受意外事务的影响,默认给0

地址和信息都在这个通道传输了。

写数据通道(W)

控制信号有两个:WREADYWVALID
WSTRB:就像一个开关,指定所传输的WDATA中,哪个字节是有效信息,所以其位宽为DATA_WIDTH / 8,为1时,对应的字节有效,为0时,对应的字节无效。

写响应通道(B)

控制信号有两个:BREADYBVALID

BRESP:指示当前的写操作是否成功,为0表示成功
在这里插入图片描述
在这里插入图片描述

读请求通道(AR)

控制信号如下两个。
在这里插入图片描述
信号和写请求介绍类似。

ARPROT:可用于保护内存免受意外事务的影响,默认给0

读数据通道(R)

控制信号有两个:RREADYRVALID

RRESP:读响应信息合并在了读数据通道内,所以,相比于写操作,读操作少了一个响应通道。
其值为0时,表示读取成功。

* 握手的依赖关系(重要)

---------->
键尾 箭头
单箭头:箭头处的信号,可以在键尾处信号之前或之后拉高。
双箭头:箭头处的信号,必须在键尾处信号之后拉高。
伸手 == 拉高

写事务依赖

在这里插入图片描述

  • 主机在拉高AWVALIDWVALID之前,不能等待从机拉高AWREADYWREADY,这适用于事务中的每次写数据传输。想写,必须主机先伸手,从机可以等,也可以先伸手(对应后面两条)
  • 从机在拉高AWREADYWREADY之前,可以等待AWVALIDWVALID
  • 从机可以在AWVALIDWVALID之前或之后,拉高AWREADYWREADY
  • 从机必须等待四个双箭头键尾信号拉高后,再拉高BVALID
  • 从机在拉高BVALID之前,一定不能等待主机拉高BREADY,也就是写响应时,从机必须先伸手
  • 主机可以等BVALID信号,不必先伸手,当然,也可以先伸手

总的来说,对于AWVALIDAWREADYWVALIDWREADY这两个握手,从主机的角度看,他不能等从机,主观上要先伸手;从机的角度看,他等不等主机都行,主观上不必先伸手。客观上,主机先伸手,从机先伸手的情况都是存在的。
对于BVALIDBREADY这个握手,就和上面的描述颠倒过来,从机主观上必须先伸手,主机不必先伸手,但是谁先伸手的情况客观上都是存在的。

图A3.5,把和BVALID有关的箭头都拿掉,可以看到一个简单的握手关系,这能说明AXI总线地址数据独立、分离的特性,支持不对齐数据传输的特性(即顺序上,不必先地址再数据)
在这里插入图片描述

读事务依赖

在这里插入图片描述

  • 在拉高ARVALID之前,主机一定不能等从机拉高ARREADY。想读,主机主观上必须先伸手,从机主观上不必等主机伸手,但是客观上,谁先伸手的情况都存在。
  • 从机拉高表示数据有效的RVALID信号,一定要在两个双箭头键尾的信号拉高之后。
  • 从机一定在拉高RVALID之前,主观上一定不能等主机拉高RREADY,即从机必须先伸手,主机主观上不必先伸手,客观上,谁先伸手的情况都存在。

总的来说,读事务中的两个握手,对于ARVALIDRREADY,从主机的角度看,他不能等从机,主观上要先伸手;从机的角度看,他等不等主机都行,主观上不必先伸手。客观上,主机先伸手,从机先伸手的情况都是存在的。RVALIDARREADY反过来理解即可。额外的,RVALIDARVALIDARREADY影响。

图A3.6可以从图A3.5中简化出来,一起理解就好了。
在这里插入图片描述
理解依赖关系,是理解FPGA AXI-Lite逻辑时序的基础,上面解释依赖关系时,反复提到的“主观上”一词,主要体现在代码逻辑上

AXI-Lite的FPGA实现

Xilinx自定义IP核

从机

从机代码可以使用Xlinx官方提供的自定义IP自动化产生

芯片型号XC7Z020CLG400-1,Vivado2018.3

创建 Block Design —> Tools —>Create and Package New IP

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

按照所需配置选好,在Block Design中找到IP
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这就是Xilinx官方自动生成的AXI-Lite Slave代码,用户可以修改这个文件,增加自己的逻辑,修改完保存后,更新这个自定义IP,就能在Block Design用了。

主机

同样的方式可以生成主机代码,只需要在自定义IP核配置界面写Master即可。

在这里插入图片描述
主机和从机生成的模块如上图所示,修改Block Design,如下图,验证无误后,生成顶层。
在这里插入图片描述
在这里插入图片描述

仿真

编写顶层的tb文件,给时钟和复位。

`timescale 1ns / 1ps
module tb_axi_lite();
reg clk ,rst_n ,tx;
always #5 clk = !clk;
design_1_wrapper design_1_wrapper_u0
(
    .m00_axi_aclk_0             (clk    ),
    .m00_axi_aresetn_0          (rst_n  ),   
    .m00_axi_init_axi_txn_0     (tx     )
);
initial begin
    clk = 0;
    rst_n = 0;
    tx = 0;
    #500
    @(posedge clk);
    rst_n = 1;
end

initial begin
    pause();
end

task pause();
    begin
        wait(rst_n);
        repeat(5)@(posedge clk);
        tx <= 1;
        @(posedge clk)
        tx <= 0;
    end
endtask
endmodule

下图可以看到,一个txn的脉冲,可以触发4次写和4次读,这种仿真方法可以最快速便捷的观察AXI-Lite波形,无需自己写代码。
在这里插入图片描述
写请求、写数据、写响应三个通道的波形一起看
在这里插入图片描述

读图信息:

  1. 地址跳变为0 4 8 12,这是因为数据为4 Byte,地址跳变间隔需要以数据字节数为准
  2. 图中展示的是地址和数据相位对齐,其实可以不对齐,AXI是支持的
  3. 写地址和写数据通道波形,能体现出主机的“主动性”,即先伸手
  4. 写响应通道能体现出从机的“主动性”,即先伸手
  5. BVALID是在四个信号拉高后,才拉高的,对应了前面介绍的依赖关系

读请求、读数据、两个通道的波形一起看
在这里插入图片描述
RVALID时序,也能够对应上面的依赖关系。

一些信息接口,如STRB PORT ESP等,可以自行添加看
在这里插入图片描述
ESP为0,对应写成功,读成功
STRB为F,表示所有字节均为有效数据
PORT 写是0,读是1,写是非特权访问,读是特权访问,不太重要,关系内存访问权限
在这里插入图片描述

手搓

这里推荐学习Alex Forencich大神的源码,事半功倍

Github AXI代码链接

本文中涉及的官方PDF下载

var code = "ad2dfd79-083f-4117-a87f-7126cf0201d1"

Alex Forencich代码解读

READM.md中,可以看到AXI-Lite的文件架构,顶层即为axil_adapter,内部例化两个模块,分别是axil_adapter_wr和axil_adapter_rd。
在这里插入图片描述

axil_adapter顶层参数 & 端口

在这里插入图片描述
27-29行,是基本的一些配置,29行代码规范了良好的编程习惯,先定义,再使用,否则会报错。

顶层parameter参数,结合前面对AXI-Lite的学习,理解不难,地址位宽和数据位宽都是32,STRB用来指定哪些字节是有效数据,故按照字节计算,是除8。顶层参数中的数据位宽和STRB,主机从机独立的,地址位宽是统一的,这里独立设置的用意?

在这里插入图片描述
从机的接口,和前面的手册截图一致。

主机的接口,和前面的手册截图一致。
在这里插入图片描述

axil_adapter_wr

主体框架:

  1. if else框架里边嵌套两个1段式状态机,用组合逻辑实现,里面写了10筐逻辑
  2. 一段时序逻辑always块,里面写了一筐逻辑

状态机分为 STATE_IDLE , STATE_DATA , STATE_RESP共3段

当前状态为state_reg,下一个状态为state_next

在这里插入图片描述

EXPAND:如果主机来的STRB,大于从机所需的STRB,需要拉高EXPAND信号

SEGMENT_COUNT:EXPAND拉高后,需要算出STRB大了多少,这个是倍数值

这里按照主机、从机都是32-bits先看,可知 EXPAND=0 , SEGMENT_COUNT=1,则进入 if (SEGMENT_COUNT == 1 || EXPAND) 条件中嵌入的状态机,对应源码189~237行

状态机 case(state_reg)

如果写请求的ready和valid尚未握手,就保持IDLE
如果握手成功,状态跳转至 STATE_DATA,同时设置了很多尾缀next的信号,带有该尾缀的信号表示,该信号下一个状态应该是什么样的

写请求握手后:

  • awready信号拉低
  • s_axil_awaddr存下来,传给Master的 m_axil_awaddr_next,以备给下游设备
  • s_axil_awprot存下来,传给Master的 m_axil_awprot_next,以备给下游设备
  • m_axil_awvalid_next拉高,以备和下游设备握手
  • 从机写准备 赋值 主机写有效的取反

该模块叫 adapter,转接器,在系统中其呈上启下的纽带作用,并没有自己的处理,也就是说,该模块会把上游发给他的指令,转发给下游;在上游模块面前,他是从机,在下游模块面前,他是主机。本质上就是个听旨宣旨的。理解了该模块的功能,对理解程序是有帮助的。

在这里插入图片描述

数据阶段:
如果和上游之间写数据的valid和ready尚未握手,就保持数据状态,否则进行一系列处理。
如果和上游握手成功

  • 拉低wready信号,取消握手
  • 上游传过来的wdata和wstrb信号,转存给从机,以备往下游发
  • 拉高给下游的wvalid信号
  • 给下游的beady信号 赋值 上游bvalid信号取反
  • 跳转至写响应阶段
    在这里插入图片描述

响应阶段:
在这里插入图片描述
如果和下游之间写响应的valid和ready尚未握手,就保持响应状态,否则进行一系列处理。

握手后:

  • 给下游的响应valid信号拉低,取消握手
  • 下游来的bresp信号,传给上游
  • 给上游的bvalid信号拉高
  • 给上游的写请求ready信号 赋值 下游来的写请求valid信号取反
  • 跳转回IDLE状态

上游、下游位宽相等的情况下的状态机中,组合逻辑就是这些

下面是时序逻辑部分,同步复位结构,把所有next后缀的变量,赋值给不带后缀的变量,表示当前状态被新状态更替。

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

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

相关文章

zabbix 7.0 安装(服务器、前端、代理等)

https://www.zabbix.com/download 使用上面的地址&#xff0c;按教程执行命令安装

uniapp—android原生插件开发(2原生插件开发)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; ***环境问题移步至&#xff1a;uniapp—an…

【DCCMCI】多模态情感分析的层次去噪、表征解纠缠和双通道跨模态-上下文交互

abstract 多模态情感分析旨在从文本、声音和视觉数据等各种模态中提取情感线索&#xff0c;并对其进行操作&#xff0c;以确定数据中固有的情感极性。尽管在多模态情感分析方面取得了重大成就&#xff0c;但在处理模态表征中的噪声特征、消除模态表征之间情感信息的实质性差距…

【网络安全】线程安全分析及List遍历

未经许可,不得转载。 文章目录 线程线程安全问题遍历List的方式方式一方式二方式三方式四(Java 8)方式五(Java 8 Lambda)遍历List的同时操作ListVector是线程安全的?使用线程安全的CopyOnWriteArrayList使用线程安全的List.forEach线程 线程是程序执行的最小单位。一个程…

基于MFC实现的赛车游戏

一、问题描述 游戏背景为一环形车道图&#xff0c;选择菜单选项“开始游戏”则可开始游戏。游戏的任务是使用键盘上的方向键操纵赛道上的蓝色赛车追赶红色赛车&#xff0c;红色赛车沿车道顺时针行驶&#xff0c;出发点和终点均位于车道左上方。任一赛车先达到终点则比赛结束。…

SpringBoot赋能的共享汽车业务管理系统

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

「QT」几何数据类 之 QLineF 浮点型直线类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

Elasticsearch专栏-4.es基本用法-查询api

es基本用法-查询api 说明查询所有某一字段匹配查询多字段查询bool查询范围查询精确查询正则匹配模糊查询结果处理 说明 es对数据的检索&#xff0c;总结下来就是两部分&#xff0c;即查询和处理。查询指的是查找符合条件的数据&#xff0c;包括查询所有、匹配查询、布尔查询、…

讨论一个mysql事务问题

最近在阅读一篇关于隔离级别的文章&#xff0c;文章中提到了一种场景&#xff0c;我们下面来分析一下。 文章目录 1、实验环境2、两个实验的语句执行顺序3、关于start transaction和start transaction with consistent snapshot4、实验结果解释4.1、实验14.2、实验24.3、调整实…

【AIGC】腾讯云语音识别(ASR)服务在Spring Boot项目中的集成与实践

腾讯云语音识别&#xff08;ASR&#xff09;服务在Spring Boot项目中的集成与实践 引言 在现代软件开发中&#xff0c;语音识别技术的应用越来越广泛&#xff0c;从智能助手到自动客服系统&#xff0c;语音识别技术都在发挥着重要作用。腾讯云提供了强大的语音识别服务&#…

基于Spring Boot的工程认证计算机课程管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于工程教育认证的计算机课程管理平台的相…

2024年度国际荐酒师(香港)协会花式马刀开香槟表演赛在穗举行

2024年度国际荐酒师&#xff08;香港&#xff09;协会花式马刀开香槟表演赛在穗举行 近日&#xff0c;一场别开生面的花式马刀开香槟表演赛在广州四季酒店盛大举行&#xff0c;此次活动由国际荐酒师&#xff08;香港&#xff09;协会精心指导&#xff0c;广东海上丝绸之路文化促…

mysql全量与增量备份

binlog日志&#xff1a; 从上一次全量备份到下一次全量备份直接产生的数据。 一、全备和增量备份介绍 1、全量备份&#xff1a; 备份所有数据库或只备份一个数据库&#xff0c;全量备份之后&#xff0c;全量备份之前的binlog日志就没用了&#xff0c;一般生产环境会保留3-7天…

Web前端开发--HTML语言

文章目录 前言1.介绍2.组成3.基本框架4.常见标签4.1双标签4.1.1.标题标签4.2.2段落标签4.1.3文本格式化标签4.1.4超链接标签4.1.5视频标签4.1.6 音频标签 4.2单标签4.2.1换行标签和水平线标签4.2.2 图像标签 5.表单控件结语 前言 生活中处处都有网站&#xff0c;无论你是学习爬…

存算一体化与边缘计算:重新定义智能计算的未来

随着数据量爆炸式增长和智能化应用的普及&#xff0c;计算与存储的高效整合逐渐成为科技行业关注的重点。数据存储和处理需求的快速增长推动了对计算架构的重新设计&#xff0c;“存算一体化”技术应运而生。同时&#xff0c;随着物联网、5G网络、人工智能&#xff08;AI&#…

Kubernetes-ArgoCD篇-03-部署

1、从 Git 存储库创建应用程序 包含留言簿应用程序的示例存储库可在 https://github.com/argoproj/argocd-example-apps.git 上找到&#xff0c;以演示 Argo CD 的工作原理。 1.1 argocd server port-forward 我们这里通过port-forward 访问 Argo CD&#xff1a; kubectl p…

6层板设计常用知识笔记

1. 6层板设计叠层方案 &#xff08;1&#xff09;叠层方案优选以下方式 &#xff08;2&#xff09;过孔做固定孔时 plated作为固定孔时需要去掉勾选&#xff0c;焊盘去金属化。 &#xff08;3&#xff09;屏蔽罩&#xff1a;电源、主控存储、wifi需要加屏蔽罩&#xff0c;屏蔽…

【mongodb】数据库的安装及连接初始化简明手册

NoSQL(NoSQL Not Only SQL )&#xff0c;意即"不仅仅是SQL"。 在现代的计算系统上每天网络上都会产生庞大的数据量。这些数据有很大一部分是由关系数据库管理系统&#xff08;RDBMS&#xff09;来处理。 通过应用实践证明&#xff0c;关系模型是非常适合于客户服务器…

Unity跨平台基本原理

目录 前言 ​编辑 Mono Unity和Mono的关系 Unity跨平台必备概念 Mono利用 Mono主要构成部分 基于Mono跨平台的优缺点 IL2CPP Mono和IL2CPP的区别 Mono IL2CPP Mono和IL2CPP的使用建议 安装IL2CPP IL2CPP打包存在的问题 类型裁剪 泛型问题 前言 Unity跨平台的基…

【go从零单排】接口(interface)和多态(Polymorphism)

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在Go语言中&#xff0c;interface 是一种重要的类型&#xff0c;用于定义一组方法…