拓冰建站拓冰建站
首页 / 资讯中心 / 正文

FPGA开发必学:AXI总线协议从入门到实战

1. 为什么学了半天FPGA最后还是绕不开AXI先说个我自己的事。早几年我刚接触Zynq的时候在Vivado里搭好了一个简单的PS-PL工程PL侧放了几个自己封装好的寄存器模块PS端用GPIO模拟读写跑起来倒也顺利。那时候我天真地觉得总线协议这东西不过是“接口对得上就行”。直到后来项目里要挂DDR4、要搬图像数据、要做DMA批量传输我才发现自己完全低估了AXI的重要性——用GPIO一根一根线去搬数据带宽不够、时序乱成一团代码写到后面自己都不想看。AXIAdvanced eXtensible Interface是ARM AMBA总线家族里的一员在Xilinx的Zynq、MPSoC以及各种FPGA高速IP核里它几乎是默认的互联方式。搞FPGA的工程师不管是纯逻辑方向还是SoC方向都躲不开它。你去看Vivado里的IP CatalogDMA、FIFO、DDR控制器、视频处理IP接口清一色是AXI你想往Zynq的PS上挂自己的逻辑也得先把AXI搞明白。说它是FPGA开发的“通用语”一点不夸张。这篇是“从近似0基础开始FPGA开发”系列的第11篇我会把AXI总线协议从工作原理到工程落地按照我实际接触它的顺序拆开讲。重点不做纯理论堆砌而是围绕“你手头的板子、你写的Verilog、你在Vivado里点的那些按钮”把协议讲明白也把我在真实项目中踩过的坑一并交代。读完这篇你能搞清楚AXI4、AXI4-Lite、AXI4-Stream分别适合什么场景能自己在Vivado里创建并验证一个带AXI接口的IP也知道总线不上电、握手卡死、地址对不上的时候该怎么排查。这系列前面的内容如果你是从零开始一路看到的那这篇是在你熟悉了时钟、复位、状态机和简单外设驱动之后进入“系统级互联”的一步跨越。如果你直接跳到了这一篇也没关系AXI的理解不要求你会写多复杂的逻辑反而更看重对读写的时序敏感度。一句话能看懂波形、能分清楚谁在等谁你就已经具备入门AXI的素质了。2. AXI总线协议到底解决什么问题2.1 没有总线协议的世界点对点连线有多痛先别急着看协议细节。我们站在一个FPGA工程师的角度仔细想想如果不用AXI我们要在FPGA里把CPU、DDR控制器、图像采集模块、显示模块、DMA引擎连起来该怎么做最朴素的办法是点对点连线。CPU要配置采集模块就拉一根地址线、一根数据线再配一堆控制信号CPU要读DDR里的数据也得单独走一组线。采集模块要往DDR里写数据又得拉一组线。CPU、DMA、采集模块、显示模块每个外设之间都两两连线地址线数据线控制线一多布局布线就是灾难。更要命的是每个外设的读写时序都是自己定义的CPU每访问一个新的外设就得适配一套新的“方言”。什么地址有效、数据什么时候稳定、读操作要不要等待周期全靠各自约定项目一大就乱套。总线协议的本质就是把不同模块之间的通信方式“标准化”。大家都按同一套规则来地址怎么发、数据怎么传、什么时候完成、出错怎么办协议里全定义好了。这样外设和处理器之间、外设和外设之间不再需要专门定制的信号交互只要都挂到同一套总线上就能互相通信。AXI正是这套标准在FPGA和SoC领域最主流的存在。2.2 AMBA家族AHB、APB和AXI各自的分工讲AXI之前有必要把AMBA总线家族整体看一眼。AMBA是ARM制定的一套片上总线标准发展到现在家族里出现频率最高的是三个APB、AHB和AXI。APBAdvanced Peripheral Bus是里面最“佛系”的一类接口简单不支持突发传输一次只能传一笔数据速度也不快。它适合挂那些对性能不敏感的外设比如UART、I2C、GPIO、定时器这类配置型寄存器。Zynq里PS侧的APB主要是给低带宽外设用的PL侧如果你想做简简单单的寄存器读写也可以借鉴APB的思路但Xilinx原生的IP基本不用APB。AHBAdvanced High-performance Bus是高带宽总线支持突发传输效率比APB高不少很多MCU内部就是AHB加APB的结构。但它有一个特点同一时刻只能有一个主机占用总线所有传输是串行化的。在单一主机的场景下AHB够用但Zynq这种多主机并存的架构里AHB就不够看了。AXI就是为了解决AHB并发能力不足的问题出现的。它的核心设计思想是通道分离、支持乱序传输、支持多个主机并行访问性能天花板比AHB高一个档次。FPGA里跑高速数据传输、DDR读写、视频流搬运AXI基本是唯一的选择。2.3 为什么AXI能成为Xilinx SoC的默认选项Xilinx从Spartan-6系列就开始推自己的总线标准后来和ARM合作做Zynq的时候直接拥抱了AXI。原因很实在ARM的Cortex-A9核原生接口就是AXI的变种用AXI连接PS和PL不需要额外的协议转换效率最高。而且AXI是开放的协议标准第三方IP厂商按标准做出来的IP可以直接挂进Xilinx的生态不需要针对每个厂商改接口。生态滚起来了大家越是统一越没人愿意搞私有协议。从Zynq-7000到UltraScale再到VersalXilinx的平台一直在迭代AXI的地位不仅没动摇反而越来越深入。现在你只要打开Vivado的Block Design添加任何带数据搬移能力的IP拉出来的接口几乎都是AXI。这已经不是选择题而是必答题。FPGA工程师要么学要么等着项目原地卡死。3. AXI4、AXI4-Lite、AXI4-Stream三个版本三条不同的路3.1 一张表分清三个版本AXI协议家族里工程上最常用的就是AXI4、AXI4-Lite、AXI4-Stream这仨。很多新手糊涂的地方在于怎么一会儿叫AXI一会儿叫AXI4一会儿又是AXI Stream其实都是AXI体系只是面向的场景不同。我先把它们的差异摆出来特性AXI4AXI4-LiteAXI4-Stream地址通道有有无突发传输支持最多256拍不支持单次读写数据流无地址概念数据宽度8~1024位工程常见32/64/512位与AXI4一致但带宽受限8/16/32/64/128位等任意宽度适用场景高速读写DDR、DMA、大块数据传输寄存器配置、状态读取视频流、音频流、高速数据流复杂度高低中典型IPDDR控制器、AXI DMA、AXI BRAM ControllerAXI GPIO、AXI UART、自定义控制寄存器AXI Video DMA、AXIS FIFO、各种流式处理IP从表格能看出来AXI4-Lite是“轻量级”的版本牺牲了性能换来了简单适合跑控制类信号。AXI4是“全家桶”支持完整的突发传输适合大块数据读写的场景。AXI4-Stream干脆去掉了地址你不需要指定“我要读第几个数据”而是像水管一样一股脑把数据按顺序灌进来适合连续的数据流——视频、以太网包、模数转换采样值这类天然按顺序处理的数据。工程上一个最常见的组合套路是CPU通过AXI4-Lite配置和控制外设外设和内存之间用AXI4做大数据搬运两个IP之间高速传输实时数据流就走AXI4-Stream。三个版本各管一段互不冲突。3.2 AXI4-Lite控制面的最优解如果你只是想写几个寄存器、读一个状态位用AXI4-Lite就够了。它不支持突发一次读写固定一笔数据控制逻辑简单适合挂在CPU的低速配置总线上。我举个实际例子你做了一个温控风扇模块需要给PWM控制器写一个目标转速值再从温度传感器模块读当前温度。这个需求用AXI4-Lite非常合适。Zynq的PS侧有M_AXI_GP接口默认走的就是AXI这种通用协议你在Vivado里给PL的例子工程添加一个AXI4-Lite从机配置寄存器然后PS端写一段简单的C代码往固定地址写数据就能控制PWM读地址就能拿到温度。整个流程清晰干净几乎没有多余的等待周期。AXI4-Lite的读写通道规则是固定的写地址通道和写数据通道可以同时发出写响应通道会在从机接收完成后回复读地址通道发出后从机在若干个周期后返回读数据。因为没有突发每一笔事务独立开始、独立结束从机逻辑很好写。用状态机实现AXI4-Lite从机可以说是FPGA工程师的基本功之一后面我会细讲代码该怎么搭。3.3 AXI4带突发的性能主力AXI4和AXI4-Lite最核心的差别是突发传输也就是一次地址请求可以连续传输多笔数据。比如你要从DDR里读一块256字节的连续数据如果一次只读一个字光发地址就要几百次效率非常低。AXI4允许你一次指定起始地址然后连续读256拍数据地址开销被大大摊薄。突发相关的信号有四个AWLEN写突发长度、AWBURST写突发类型、AWSIZE写突发大小、AWADDR写起始地址。读通道对应的是ARLEN、ARBURST、ARSIZE、ARADDR。其中AWLEN表示的是“突发长度减一”也就是说AWLEN0表示传1笔AWLEN255表示传256笔。AWSIZE表示每一笔数据的字节数8位总线时AWSIZE0b00016位时AWSIZE0b00132位时AWSIZE0b010以此类推。AWBURST定义的是地址递增模式最常见的是INCR增量突发每次传输后地址递增一个AWSIZEFIXED突发是每个地址都一样适合读写FIFO这类固定地址外设WRAP突发是回卷模式适合缓存行操作。AXI4还支持乱序传输这是它性能强大的另一个原因。多个主机同时发起事务从机可以不按请求顺序返回数据只要带着正确的ID就行。ID信号是AXI里实现乱序的基础事务带着源ID发出去返回的数据带着相同的ID接收端就能把返回的数据对号入座。对FPGA初学者来说乱序传输的概念可以先不深究但要知道它存在——因为你在调试AXI DMA和DDR的时候返回数据顺序和请求顺序不一致是正常现象不要慌张。3.4 AXI4-Stream没有地址的数据洪流AXI4-Stream把“地址”概念从协议里拿掉了剩下的就是纯粹的流动数据。它有一条主数据线TDATA、一个字节有效位TKEEP、一个滤除信号TSTRB、一个帧起始信号TUSER、一个帧结束信号TLAST、一个有效信号TVALID和一个就绪信号TREADY。这几个信号里TLAST是最常用的。在视频流处理里TLAST代表一帧图像的最后一行数据的最后一拍在以太网包处理里TLAST代表一个包的最后一部分数据。TUSER则用来携带边界信息比如视频里的行同步、场同步信号。AXI4-Stream的数据传输靠TVALID和TREADY握手完成主机拉高TVALID表示数据有效从机拉高TREADY表示准备好接收两个信号同时为高这一拍数据才算真正传输成功。实际工程里AXI4-Stream多半出现在“搬运大数据”的链路上。图像Sensor采集的数据先转成AXI4-Stream经过ISP处理流水线后再用AXI DMA把Stream数据转成AXI4的地址读写请求写到DDR里。显示通路则相反DDR里的图像通过AXI4读出来转成Stream流送往HDMI或者LCD控制器。这套“地址-流-地址”的转换模式是Zynq视频处理最经典的架构理解了AXI4-Stream的握手就能看懂一整套视频通路是怎么搭起来的。4. AXI的核心机制从握手到突发把时序看懂4.1 VALID和READY一切传输的基础AXI的每一个通道都有一对握手信号VALID和READY。发送方拉高VALID表示“我这个信号线上的数据已经是有效的了你可以取了”接收方拉高READY表示“我已经准备好了你随时可以发”。数据真正完成传输的判定条件只有一条一个时钟上升沿VALID和READY同时为高这一拍的数据就被接收方锁存了。这句话很简单但实际写代码的时候新手最容易犯的错就是弄反握手关系。AXI协议里有一条严格规定VALID信号一旦拉高就要保持到握手完成为止中间不能撤销。READY则没有这个要求你可以在看到VALID之后再给READY也可以提前给READY。如果接收方还没准备好握手就一直卡着数据就一直悬在那里总线事务的完成时间是不确定的。从这个角度看AXI的握手是一种“反压机制”。上游可以随时把数据顶到下游但如果下游忙不过来拉低READY就能让上游等一下。这种流控能力在高速数据链路里非常关键——视频流IP处理不过来的时候TREADY一拉低上游DMA自动暂停发送不会丢数据。理解了这对信号你读任何AXI相关的代码都会轻松一大截。4.2 五个通道各自的任务AXI4完整形态下一共有五个通道读地址通道AR、读数据通道R、写地址通道AW、写数据通道W、写响应通道B。名字看起来多但它们的分工很清晰。写事务的过程是主机先在AW通道上发出写地址同时在W通道上发出要写的数据从机接收完成后在B通道上回一个写响应。读事务相对简单主机在AR通道上发出读地址从机在R通道上返回数据。之所以把地址和数据分开是为了支持流水线操作——主机在等第一批数据返回的同时就可以发出下一批的地址请求地址通道和数据通道不互相阻塞。工程里写AXI从机最常用的写法是状态机。比如AXI4-Lite从机状态机里一般有IDLE、写地址等待、写数据等待、写响应、读地址等待、读数据返回这几个状态。每个状态里都去判断对应的VALID和READY。最容易出错的是写事务的通道间依赖协议允许AW和W通道同时发起但有的AXI从机要求先收AW再收W有的要求反过来还有的必须最后收B。Vivado自动生成的IP模板里写通道的握手顺序是可以配置的默认情况下是“先AW后W再B”理解了这个顺序你自己写从机的时候就不容易乱。4.3 突发传输的地址计算突发传输的理解难点在于地址怎么算。举个例子如果AWADDR0x0000_1000AWSIZE0b010每笔4字节AWLEN3共4笔那么有效地址是0x1000、0x1004、0x1008、0x100C。每传一笔地址增加一个AWSIZE对应的字节数。这个逻辑简单但你做地址对齐的时候就要小心了——比如AWADDR0x1001AWSIZE4字节那第一笔数据就会横跨两个32位字边界总线的数据整理逻辑会变得非常复杂。工程上我的建议是所有AXI突发传输的起始地址都按数据总线宽度的边界对齐。如果你用的是64位总线、每笔8字节那起始地址至少是8的倍数。未对齐的突发虽然协议允许但从机实现时要处理字节选通很容易留坑。尤其是在定制自己的AXI从机时干脆直接在模块里抛掉未对齐请求或者用地址生成逻辑强制低几位清零简单省事。4.4 ID信号与乱序性能的另一个来源AXI通过ID信号实现多事务并发。主机给每个事务分配不同的ID从机在处理完事务后返回数据时带上相同的ID主机不要求返回顺序和发起顺序一致只要按ID把数据归位就行。这相当于给每个事务发了一张“取餐号”你可以一次下好几个单哪个先做好哪个先拿没必要干等第一单。乱序传输在单主机读多块数据的场景下特别有用。比如CPU同时要读DDR里两个不连续的区域如果串行读第二块区域只能等第一块区域全部读完有了乱序两个读事务可以并行进行哪个先准备好就先返回哪个。实际工程里乱序传输带来的性能提升在DDR控制器这种随机访问场景下非常可观。不过对FPGA逻辑工程师来说乱序是IP核内部处理的事情你做自定义从机时能保证“回的数据ID和请求一致”就不会出大问题。5. 工程实战在Vivado里从零搭一个AXI系统5.1 创建一个AXI4-Lite自定义IP的完整过程纸上谈兵结束了下面进入实际操作。我以Vivado 2021.2为例带你走一遍创建一个AXI4-Lite从机IP的完整流程。第一步打开Vivado先创建或打开一个工程然后在菜单里选择Tools - Create and Package New IP弹出向导后选择Create a new AXI4 peripheral点Next。接下来填IP的名字比如“my_axi_lite_reg”版本号默认1.0接口类型选AXI4-Lite接口模式选Slave从机数据宽度选32。Vivado会问你要不要生成一个模板例程务必勾上它会自动生成一个完整的AXI4-Lite从机Verilog代码这是你学习和二次开发最好的起点。点击Finish后Vivado会生成一个IP目录结构核心文件是my_axi_lite_reg_v1_0_S00_AXI.v。用编辑器打开这个文件你能看到一个非常经典的AXI4-Lite从机实现模块里有S_AXI_ACLK、S_AXI_ARESETN、S_AXI_AWADDR、S_AXI_WDATA等信号寄存器数组reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg0、slv_reg1、slv_reg2、slv_reg3默认4个32位寄存器。写逻辑在“Write transaction logic”注释下面读逻辑在“Read transaction logic”下面。理解这份模板比什么都重要。写事务的逻辑是状态机收到AWVALID后锁存AWADDR的低几位再收到WVALID后把WDATA写进对应的slv_reg最后拉高BVALID给出响应。读事务则是检测到ARVALID后根据ARADDR选通对应的slv_reg把数据放到RDATA上并拉高RVALID。模板里已经处理好了地址译码、读写通道握手和复位逻辑你要做的事是在slv_reg0里加一个自己的功能。比如你想让slv_reg0的第0位控制LED就在寄存器写逻辑里加一句LED_output slv_reg0[0]再引出一个输出端口就行。5.2 在Block Design里连接PS和PLIP创建好之后回到Vivado主界面创建一个Block Design。在里面添加Zynq Processing System以Zynq为例运行块自动连接后再把你的my_axi_lite_reg拖进BD里。这时你会看到IP的S_AXI接口需要指定连接到PS的哪个AXI接口上。Zynq的PS有M_AXI_GP0和M_AXI_GP1两个通用AXI主接口把S_AXI接到M_AXI_GP0再运行Connection AutomationVivado会自动加上AXI Interconnect帮你把PS的接口转接成IP能接收的AXI4-Lite。这一步看起来只是点几个按钮背后其实串联了一整套机制。AXI Interconnect本质是一个AXI交换矩阵负责地址路由、协议转换和时钟域转换。系统里可以挂多个AXI从机Interconnect会自动按地址段把不同访问路由到不同的从机上。默认情况下Vivado会为每个从机自动分配一段地址空间比如一个从机占0x4000_0000到0x4000_FFFF。你在BD里双击AXI Interconnect在地址编辑标签里能看到完整的地址映射表这就是CPU视角下访问PL外设的地址空间。生成Bitstream之前记得还要做地址的合法性检查。Zynq的M_AXI_GP0接口有固定地址范围如果Interconnect分配的从机地址超出范围综合会直接报错。一般Vivado会自动规避但偶尔手动修改地址后会把地址弄乱导致PS访问不了PL。真遇到这种情况在地址编辑窗口里先删掉映射关系再重新分配一次就好。5.3 AXI4-Stream数据通路的搭建与验证控制通路用AXI4-Lite解决后数据通路视频流走AXI4-Stream是最高效的选择。我拿一个最简单的例子来说用AXI Video DMA把DDR里的图像数据搬到HDMI输出端口。视频通路的基本框架是PS端配置好DMA和显示控制器DMA从DDR读取图像帧通过AXI4-Stream接口输出给显示IP显示IP再把数据转换成HDMI时序。在Block Design里视频显示IP的接口类型就是AXIS MasterDMA的M_AXIS接口会是AXIS Slave两者互连。Vivado会提示你连接TVALID、TREADY、TDATA、TUSER、TLAST这组信号全部连上后数据流动就靠那套握手控制了。验证AXI4-Stream通路我习惯用Vivado自带的ILAIntegrated Logic Analyzer去抓信号。把ILA的探针挂在AXIS的TVALID和TREADY上跑一次硬件你会看到握手波形的真实样子。如果TVALID一直为高但TREADY经常拉低说明下游处理不过来是在反压如果TREADY一直为高但TVALID不定时拉高说明上游数据不是持续不断的中间有间隙。这两种都是正常现象真正要警惕的是“既没有TVALID也没有TREADY的持续空闲”——那通常意味着上游DMA没有配好或者DDR读写卡住了。6. 常见问题与排查技巧实录6.1 握手死锁最典型的AXI总线卡死故障我在调试自定义AXI从机的时候遇到过最挫败的一种情况PS端运行程序卡在一个读操作上一直不返回CPU就死在那里。用ILA抓ARM接口的信号发现MVALID拉高后READY一直为低握手永远完成不了。这种问题的教科书级原因是从机的读状态机陷入了一个错误状态既没有正确拉高RVALID也没有对ARVALID作出响应。排查的方法是先检查从机模块的复位逻辑——AXI从机对复位时序有严格要求复位释放必须发生在时钟上升沿附近如果异步复位释放时序不干净状态机会跑飞。其次是检查地址译码逻辑如果ARADDR指向了一个没有定义的地址段模板里默认返回的是0但如果你的译码逻辑在未定义地址时没有拉高RVALID握手也会永远卡住。我的建议是从机的所有读操作分支不管地址有没有定义最终都要进入“返回数据并拉高RVALID”的状态哪怕返回的是全0也要让握手完成不能让主机无限等待。6.2 突发长度与DDR4为什么偶发读写失败AXI4突发长度上限是256拍但DDR4控制器对突发长度往往有自己的限制。比如某些DDR4 IP要求单次AXI读突发长度不能超过16超过的部分会被控制器内部自动拆分或者直接导致事务失败。你如果突发长度设置过大去读DDR4会发现偶尔读回来的数据是错的或者DDR校准直接报错。解决这个问题核心思路是不要在AXI层把突发长度拉满而是通过提高数据宽度来提升带宽。AXI4的数据总线宽度拉到256位或512位单笔传输的实际数据量已经是8字节总线的16倍或64倍即便突发长度只有16总吞吐也完全够用。调DMA或者自定义突发场景时先查一下对应DDR IP或DMA IP的规格说明看支持的最大突发长度和数据宽度按照它的上限去设置不要硬踩协议极限。6.3 地址空间错乱寄存器“幽灵写”还有一个很隐晦的问题用AXI4-Lite写寄存器明明写的是0x00这个寄存器的地址结果0x01寄存器的值也跟着变了。这种问题几乎都是字节选通和寄存器地址译码不匹配引起的。AXI4-Lite数据总线是32位时地址低两位通常用来区分寄存器内部字节偏移但如果你用AWADDR的低四位来做译码就会把一个32位寄存器当成4个8位寄存器来寻址。默认模板处理方式是把AWADDR右移两位再做比较也就是地址0、4、8、12对应4个32位寄存器这样译码就没问题。如果你自己写寄存器模块一定要先看总线是多宽把地址位处理清楚。遇到“写一个字节把整个寄存器改了”的情况搜索下自己的代码里有没有WSTRB信号漏处理——这个信号是字节选通WSTRB4‘b0001表示只写最低字节如果没有按WSTRB做掩码就会出现半字节覆盖、未选中字节也被改成0的问题。6.4 跨时钟域的AXI接口不能忽视的同步问题AXI接口在Zynq里经常跨时钟域。PS侧的M_AXI_GP通常跑在100MHz或125MHz而你自己的PL逻辑可能跑在150MHz甚至视频通路里跑在148.5MHzHDMI的像素时钟。如果直接把这些不同时钟域的AXI接口连在一起不做同步就会出现握手信号抖动、数据采错、状态机跑飞等一系列怪异现象。正确的做法是在Block Design里用AXI Interconnect的时钟转换功能或者给自定义IP的AXI接口接上独立的时钟域同步模块。Vivado里的AXI Interconnect本身带有跨时钟域处理能力你在BD里给两个不同时钟域的AXI接口建立连接时Interconnect会自动插入同步逻辑。如果你自己写模块挂在AXI总线上最简单的方案是让内部逻辑全跑在AXI接口时钟下避免在AXI接口内部二次分频。AXI接口的ACLK就是你的主时钟所有AXI信号逻辑都由它驱动模块内部的其他功能逻辑如果确实需要更快的时钟再用独立的时钟使能或者FIFO做跨时钟域处理不要在AXI状态机里混入另一个时钟域的异步信号这是铁律。6.5 AXI验证的快捷手段去学一下VIP的思路如果是纯PL项目没有Zynq PS怎么验证自定义AXI模块其实Vivado里自带AXI Verification IP也就是AXI VIP。在IP Catalog里搜“AXI Verification IP”添加后可以把它配置成Master或Slave模式挂在你设计的AXI接口上然后在仿真里通过它发起读写事务。AXI VIP最方便的地方是它自带了很多可配置的参数比如突发长度、数据宽度、地址、连续传输次数你不需要手写一堆task就能模拟总线行为。我自己的使用习惯是全仿真验证用AXI VIP做主设备往我的从机里写数据、读数据然后用$display打印出来对比结果。这一步能过滤掉90%的静态错误比如地址译码不对、握手表漏、写数据没落对寄存器。跑通仿真后再上板用ILA抓真实总线波形做系统级验证。AXI总线这种东西仿真阶段发现问题成本最低上板之后定位问题光抓波形就能耗一天别问我怎么知道的。7. 从AXI开始把视野放大到整个SoC系统学AXI不只是学一套信号握手规范它更像是在建立一种“系统视角”。以前你写FPGA逻辑关注的是单个模块能不能跑、波形对不对开始接触AXI之后你自然就会想这个模块挂在总线的哪个地址上它和DMA之间怎么协作总线的带宽会不会成为瓶颈这些问题一旦开始想了你就已经在从“写逻辑的工程师”变成“做系统的工程师”了。我自己的经验是学AXI最好的落地路径就是拿Zynq做一个小项目比如用PS控制PL的DMA搬运一块数据再通过AXI4-Lite配置寄存器切换数据源。整个过程中你会自然地用到AXI4、AXI4-Lite、AXI4-Stream三种接口也会自然地理解Interconnect、地址映射、读写出错的应对方法。理论看三遍不如动手调一遍。最后分享一个小的调试技巧上板调试AXI时不要只抓数据信号一定要把VALID和READY同时抓下来并且把两者之间的关系看明白。很多总线“偶发故障”其实都是某一次握手时VALID比READY早了几个周期或者反压时序不满足协议要求积累下来的。时序图上把握手对齐了稳定性的问题往往就迎刃而解。AXI这条路入门不难但想调得顺手一定要多看波形、多逼自己复现问题。这个系列下一篇我打算专门写AXI的仿真验证和VIP使用那部分内容配合今天这篇能把AXI从看懂到用熟完整串起来。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门