<XILINX> AXI4-Lite(二) Slave接口时序分析

news2024/11/26 23:31:08

目录

01 axi4_lite_slave写事务代码分析

AWREADY时序控制代码分析

WREADY时序控制代码分析

AWADDR寄存时序代码分析

WDATA寄存时序代码分析

BVALID、BRESP时序控制代码分析

axi4_lite_slave 写事务时序总结

02 axi4_lite_slave读事务代码分析

 ARREADY时序、ARADDR寄存控制代码分析

RDATA时序控制代码分析

RVALID、RRESP时序控制代码分析

03 文章总结


大家好,这里是程序员杰克。一名平平无奇的嵌入式软件工程师。

上篇主要是对AXI4-Lite总线协议的特性以及master、slave接口进行了总结分享。本篇内容主要是对AXI4-Lite_slave接口信号的时序代码进行分析。


下面正式进入本章推送的内容。

01 axi4_lite_slave写事务代码分析

对于AXI4-Lite总线写事务而言,Xilinx提供的slave模板中写地址通道、写数据通道同时握手成功才执行写事务传输。而axi4-lite_slave接口主要是实现如下时序:

  • 写地址通道握手信号AWREADY的时序控制
  • 写数据通道握手信号WREADY的时序控制
  • AWADDR以及WDATA的寄存(latch)时序控制
  • 写响应通道BVALID、BRESP信号的时序控制

AXI4-Lite 写事务仿真逻辑时序如下图所示:

图片


AWREADY时序控制代码分析

always @( posedge S_AXI_ACLK )      begin    if ( S_AXI_ARESETN == 1'b0 )      begin        axi_awready <= 1'b0;        aw_en <= 1'b1;      end     else      begin            if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)          begin            axi_awready <= 1'b1;            aw_en <= 1'b0;          end          else if (S_AXI_BREADY && axi_bvalid)              begin                aw_en <= 1'b1;                axi_awready <= 1'b0;              end        else                     begin            axi_awready <= 1'b0;          end      end   end

在该段代码中,需要关注的信号为aw_en以及axi_awready.

信号条件描述

aw_en

(默认为1)

置高辅助信号,用于控制单次写事务的传输;S_AXI_BREADY与axi_bvalid同时为高时(写响应通道握手成功),aw_en置高(写事务传输完成)
置低当写地址通道、写数据通道握手成功,aw_en置低(写事务开始),直到本次写事务传输结束

axi_awready

(默认为0)

置高

axi_awready == 1‘b0 && aw_en == 1‘b1, 即写事务传输未开始,

并且S_AXI_AWVALID跟S_AXI_WVALID 同时为高,说明控制逻辑为写地址通道、写数据通道同时满足握手条件,写事务传输才开始.

置低axi_awready 置高的任一条件不满足都置低,即说明axi_awready是一个脉冲信号

WREADY时序控制代码分析

always @( posedge S_AXI_ACLK )  begin    if ( S_AXI_ARESETN == 1'b0 )      begin        axi_wready <= 1'b0;      end     else      begin            if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en )          begin            axi_wready <= 1'b1;          end        else          begin            axi_wready <= 1'b0;          end      end   end 
信号条件描述

axi_wready

(默认为0)

置高置高条件与axi_awready条件一致,写地址通道、写数据通道同时满足握手条件,写事务传输才开始.
置低axi_wready置高的任一条件不满足都置低,即说明axi_wready也是一个脉冲信号

AWADDR寄存时序代码分析

always @( posedge S_AXI_ACLK )  begin    if ( S_AXI_ARESETN == 1'b0 )      begin        axi_awaddr <= 0;      end     else      begin            if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)          begin            axi_awaddr <= S_AXI_AWADDR; // Write Address latching           end      end   end 
信号描述

axi_awaddr

(默认为0)

地址锁存条件与axi_awready/axi_wready一致写地址通道、写数据通道VALID同时为高,地址才被锁存.

WDATA寄存时序代码分析

assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;
  always @( posedge S_AXI_ACLK )
  begin
    if ( S_AXI_ARESETN == 1'b0 )
      begin
        slv_reg0 <= 0;
        slv_reg1 <= 0;
        slv_reg2 <= 0;
        slv_reg3 <= 0;
      end 
    else begin
      if (slv_reg_wren)
        begin
          case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
            2'h0:
              for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
                if ( S_AXI_WSTRB[byte_index] == 1 ) begin
                  slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
                end  
            2'h1:
              for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
                if ( S_AXI_WSTRB[byte_index] == 1 ) begin
                  slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
                end  
            2'h2:
              for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
                if ( S_AXI_WSTRB[byte_index] == 1 ) begin
                  slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
                end  
            2'h3:
              for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
                if ( S_AXI_WSTRB[byte_index] == 1 ) begin
                  slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
                end  
            default : begin
                        slv_reg0 <= slv_reg0;
                        slv_reg1 <= slv_reg1;
                        slv_reg2 <= slv_reg2;
                        slv_reg3 <= slv_reg3;
                      end
          endcase
        end
    end
  end
信号描述
slv_reg_wren辅助信号,用于表征写事务传输时数据寄存控制。当axi_wready、S_AXI_WVALID、axi_awready、S_AXI_AWVALID同时为高,即写地址通道和写数据通道握手成功,在上升沿结束后,根据WADDR对对应寄存器进行赋值

slv_regx

地址数据寄存器,用于锁存写数据通道的WDATA数据.

BVALID、BRESP时序控制代码分析

always @( posedge S_AXI_ACLK )
  begin
    if ( S_AXI_ARESETN == 1'b0 )
      begin
        axi_bvalid  <= 0;
        axi_bresp   <= 2'b0;
      end 
    else
      begin    
        if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID)
          begin          
            axi_bvalid <= 1'b1;
            axi_bresp  <= 2'b0; // 'OKAY' response 
          end
        else
          begin
            if (S_AXI_BREADY && axi_bvalid) 
              begin
                axi_bvalid <= 1'b0; 
              end  
          end
      end
  end
信号条件描述

axi_bvalid

(默认值为0)

置高当axi_wready、S_AXI_WVALID、axi_awready、S_AXI_AWVALID同时为高, 即写地址通道和写数据通道握手成功,在上升沿结束后,axi_bvalid置高
置低S_AXI_BREADY、axi_bvalid同时为高时,axi_bvalid置低. 即axi_bvalid也是脉冲信号

axi_bresp

(默认值为0)

对于AXI-Lite总线,该信号不支持EXOKAY枚举值,因此该信号值为‘OKAY’(2'b00')

axi4_lite_slave 写事务时序总结

对于xilinx提供的axi4_lite_slave模板代码,写事务时序以及总结如下:

  • 写地址通道的AWVALID、写数据通道的WVALID同时为高时,锁存AWADDR的值(此时作为第一个时钟上升沿)
  • 下一个时钟上升沿AWREADY、WREADY同时置高,即写地址通道、写数据通道握手成功的同时,WDATA被锁存到地址对应的寄存器中,数据传输完成.
  • 第三个时钟上升沿,写响应通道BVALID信号置高,持续一个时钟周期,返回写事务响应结果.

02 axi4_lite_slave读事务代码分析

对于AXI4-Lite总线读事务而言,axi4-lite_slave接口主要是实现如下时序:

  • 读地址通道握手信号ARREADY、ARADDR寄存(latch)的时序控制
  • 读数据通道RDATA时序控制
  • 读数据通道RVALID、RRESP信号的时序控制

AXI4-Lite读事务仿真逻辑时序如下图所示:

图片


 ARREADY时序ARADDR寄存控制代码分析

always @( posedge S_AXI_ACLK )  begin    if ( S_AXI_ARESETN == 1'b0 )      begin        axi_arready <= 1'b0;        axi_araddr  <= 32'b0;      end     else      begin            if (~axi_arready && S_AXI_ARVALID)          begin            axi_arready <= 1'b1;            axi_araddr  <= S_AXI_ARADDR;          end        else          begin            axi_arready <= 1'b0;          end      end   end
信号条件描述

axi_arready

(默认值为0)

置高S_AXI_ARVALID为高并且自身为低,axi_arready置高
置低置高条件任一不满足,便置低;axi_arready为脉冲信号

axi_araddr

(默认值为0)

寄存S_AXI_ARVALID为高并且自身为低,寄存读地址

RDATA时序控制代码分析

assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;  always @(*)  begin        // Address decoding for reading registers        case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )          2'h0  : reg_data_out <= slv_reg0;          2'h1  : reg_data_out <= slv_reg1;          2'h2  : reg_data_out <= slv_reg2;          2'h3  : reg_data_out <= slv_reg3;          default : reg_data_out <= 0;        endcase  end    always @( posedge S_AXI_ACLK )  begin    if ( S_AXI_ARESETN == 1'b0 )      begin        axi_rdata  <= 0;      end     else      begin        if (slv_reg_rden)          begin            axi_rdata <= reg_data_out;     // register read data          end         end  end
信号描述
slv_reg_rden辅助信号,用于表征读事务传输时数据寄存控制。当axi_arready为高、S_AXI_ARVALID 为高、axi_rvalid为低时,即读地址通道握手成功,该信号置高
reg_data_out辅助信号,通过组合逻辑将寄存的ARADDR对应的寄存器数据赋值给该信号.
axi_rdata读数据信号,当slv_reg_rden为高,在上升沿结束后,返回对应寄存器的数据

RVALID、RRESP时序控制代码分析

always @( posedge S_AXI_ACLK )  begin    if ( S_AXI_ARESETN == 1'b0 )      begin        axi_rvalid <= 0;        axi_rresp  <= 0;      end     else      begin            if (axi_arready && S_AXI_ARVALID && ~axi_rvalid)          begin            axi_rvalid <= 1'b1;            axi_rresp  <= 2'b0; // 'OKAY' response          end           else if (axi_rvalid && S_AXI_RREADY)          begin            axi_rvalid <= 1'b0;          end                      end  end
信号条件描述

axi_rvalid

(默认值为0)

置高当axi_arready为高、S_AXI_ARVALID为高、axi_rvalid为低时,读地址通道握手成功在上升沿结束后,axi_rvalid置高.
置低S_AXI_RREADY、axi_rvalid同时为高时,axi_rvalid置低. 即axi_bvalid也是脉冲信号

axi_rresp

(默认值为0)

对于AXI-Lite总线,该信号不支持EXOKAY枚举值,因此该信号值为‘OKAY’(2'b00')
 

03 文章总结

对于使用AXI4-Lite_slave接口,Xilinx的Vivado编译工具可以直接生成模板,使用时直接在该模板上定制自己的接口内容。但杰克认为:对FPGA的学习而言,不能仅仅停留在“会用”阶段,还得深入了解其时序的设计与实现过程,才能在日后快速将其部署到自己的项目中。

言归正传,ARM提供的AMBA的相关资料里面,对握手机制的描述所占篇幅较大,因此对于AXI总线协议而言,握手机制是重中之重,Xilinx提供的axi4-lite_slave模板中,写地址通道、写数据通道是同时握手成功,传输才开始。除握手机制外,还要了解地址、数据寄存的时机。

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

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

相关文章

虫情监测仪的功能优势有哪些?

虫情监测仪是实时监测虫情的仪器&#xff0c;主要由诱虫装置、害虫灭活装置、落虫分散装置、收集装置、图像采集装置以及农业四情测报平台/智慧农业大数据平台组成&#xff0c;能够实时拍摄虫情照片&#xff0c;并将其上传至平台进行识别统计&#xff0c;以便对虫害的发生进行预…

问题杂谈(三十七)远程调试linux中的Tomcat

前言 之前调试过Docker里面的java程序&#xff0c;但还没试过直接调试tomcat里面的java程序&#xff0c;今儿个来试试 步骤 Tomcat 修改catlina脚本&#xff1a;vi catlina.sh&#xff08;bin目录下&#xff09;找到下面这句&#xff0c;将"localhost:8000"改为”…

FC-TDIO51 HONEYWELL 关于霍尼韦尔过程解决方案

FC-TDIO51 HONEYWELL 关于霍尼韦尔过程解决方案 霍尼韦尔过程解决方案(HPS)宣布推出一款文档和变更管理软件&#xff0c;该软件将帮助其客户的工业控制系统的完整性。Honeywell Trace用自动化解决方案取代了纸质记录和电子表格。通过提供复杂系统交互的单一集成视图&#xff0…

YOLO目标检测——人脸性别识别数据集下载分享

人脸性别识别数据集共同2300图片。在社交媒体分析、广告定向投放、零售业、安防系统以及健康和医疗领域等多个领域都具有广泛的应用潜力。通过准确识别人脸的性别&#xff0c;可以为这些领域提供更精准的数据分析和个性化的服务。 数据集点击下载&#xff1a;YOLO人脸性别识别数…

linux查看某一进程占用内存

1.top -p [pid]&#xff0c;Mem对应的是占用百分比&#xff0c;按q退出 2.cat /proc/[pid]/status,VmRSS对应的就是

openEuler自定制生成ISO

目录 1. 下载镜像2. 挂载镜像3. 安装制作发行版的工具4. 同步光盘文件到制作ISO的目录5. 拷贝已安装rpm6. 查找不存在的rpm&#xff0c;写入no_exist_rpms7. 下载no_exist_rpms.txt中的所有依赖包8. 修改 isolinux.cfg 文件9. 修改自动化安装配置文件10. 制作修改noraml文件11.…

SpringCloud(九)——RabbitMQ简单了解

文章目录 1. 同步通讯与异步通讯2. MQ 介绍3. RabbitMQ运行4. RabbitMQ 模型4.1 五种模型简介4.2 实现基本消息队列4.2.1 消息发布者4.2.2 消息订阅者 5. SpringAMQP5.1 基本队列5.2 工作队列5.3 广播5.4 路由5.5 主题 6. 消息转换器 1. 同步通讯与异步通讯 同步通讯 同步通讯就…

24.排序,插入排序,交换排序

目录 一. 插入排序 &#xff08;1&#xff09;直接插入排序 &#xff08;2&#xff09;折半插入排序 &#xff08;3&#xff09;希尔排序 二. 交换排序 &#xff08;1&#xff09;冒泡排序 &#xff08;2&#xff09;快速排序 排序&#xff1a;将一组杂乱无章的数据按一…

【iOS】Masonry的基本使用

文章目录 前言一、使用Masonry的原因二、约束的常识三、Masonry的简单使用四、Masonry的用例总结 前言 暑假安装了cocoapods&#xff0c;简单使用其调用了SVGKit&#xff0c;但是没有学习Masonry&#xff0c;特此总结博客记录Masonry的学习 一、使用Masonry的原因 Masonry是一…

Scrum敏捷开发工具:提高团队协作与交付效率

随着软件开发行业的不断发展和进步&#xff0c;Scrum敏捷开发工具逐渐成为了备受关注的话题。 Scrum是一种灵活且高效的项目管理方法&#xff0c;旨在提高团队协作和交付效率&#xff0c;使团队能够更快地响应变化和需求。 本文将深入探讨Scrum敏捷开发工具的基本概念、使用方…

YOLOv5、YOLOv7 注意力机制改进SEAM、MultiSEAM、TripletAttention

用于学习记录 文章目录 前言一、SEAM、MultiSEAM1.1 models/common.py1.2 models/yolo.py1.3 models/SEAM.yaml1.4 models/MultiSEAM.yaml1.5 SEAM 训练结果图1.6 MultiSEAM 训练结果图二、TripletAttention2.1 models/common.py2.2 models/yolo.py2.3 yolov7/cfg/training/Tri…

知识图谱(1)知识存储与检索

目录 Neo4j在win系统安装Neo4j基础语法知识图谱创建知识图谱查询知识图谱属性增减 python与neo4j Neo4j在win系统安装 图数据库&#xff08;graph database&#xff09;是一种特殊的数据库&#xff0c;用于存储丰富的关系数据&#xff0c;neo4j是目前最流行的图数据库&#xf…

RedHat7 配置国内清华大学yum源

1.前置准备工作 #导入gpg key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org #在/etc/yum.repos.d/下安装elrepo.repo 文件 yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm2.vim未安装可以先安装一下 sudo yum install vim3.编辑…

微信小程序scroll-view隐藏滚动条参数不生效问题

如题&#xff0c;先来看看问题是怎么出现的。 先看文档如何隐藏滚动条&#xff1a; 再根据文档实现wxml文件&#xff1a; <scroll-view show-scrollbar"{{false}}" enhanced><view wx:for"{{1000}}">11111</view> </scroll-view>…

Nacos使用(下):SpringBoot和SpringCloud项目中使用Nacos

Nacos使用(上)&#xff1a;Nacos安装 Nacos使用(中)&#xff1a;Java项目和Spring项目使用Nacos Nacos使用(下):SpringBoot和SpringCloud项目中使用Nacos 3.3 SpringBoot SDK 父工程指定springboot版本&#xff1a; <dependencyManagement><dependencies><depe…

AI:05 - 基于深度学习的道路交通信号灯的检测与识别

随着人工智能的快速发展,基于深度学习的视觉算法在道路交通领域中起到了重要作用。本文将探讨如何利用深度学习技术实现道路交通信号灯的检测与识别,通过多处代码实例展示技术深度。 道路交通信号灯是指示交通参与者行驶和停止的重要信号。准确地检测和识别交通信号灯对于智…

【MySQL】JDBC

目录 1.JDBC 2.Java代码操作MySQL 2.1前置条件 2.2常用操作 2.2.1插入 2.2.2删除 2.2.3查询 1.JDBC 概念&#xff1a;JDBC&#xff0c;即Java Database Connectivity( java数据库连接 )。是一种用于执行SQL语句的Java API&#xff0c;它是Java中的数据库连接规范。这个A…

2611B数字源表

Keithley 2611B源表使精密DC、脉冲和低频交流源测量测试比以前更快、更容易、更经济。吉时利2611B的I-V功能测试速度是竞争产品的2到4倍&#xff0c;它结合了: 吉时利的高速第三代源测量单元(SMU)设计嵌入式测试脚本处理器(TSP)TSP-Link&#xff0c;一种快速触发和单元间通信总…

1775_树莓派3B键盘映射错误解决

全部学习汇总&#xff1a; GitHub - GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. 入手树莓派3B之后用了没有多长时间&#xff0c;最初的这段时间感觉想让它代替我的PC机是不肯能的。性能先不说&#xff0c;我完全没有找到当初在我的笔记本上使…

java基础-----第三篇

系列文章目录 文章目录 系列文章目录前言一、final二、String、StringBuffer、StringBuilder前言 一、final 最终的 修饰类:表示类不可被继承 修饰方法:表示方法不可被子类覆盖,但是可以重载 修饰变量:表示变量一旦被赋值就不可以更改它的值。 (1)修饰成员变量 如果fina…