0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于AXI总线的加法器模块解决方案

454398 来源:csdn 作者:ChuanjieZhu 2020-12-23 15:32 次阅读

前面一节我们学会了创建基于AXI总线的IP,但是对于AXI协议各信号的时序还不太了解。这个实验就是通过SDK和Vivado联合调试观察AXI总线的信号。由于我们创建的接口是基于AXI_Lite协议的,所以我们实际观察到是AXI_Lite协议的信号时序。

具体做法是创建一个基于AXI总线的加法器模块,在Vivado里将AXI总线添加到debug信号里,实际上是用逻辑分析仪探测信号,在SDK端通过debug方式依次写入两个加数,由PL计算出和,我们读出这个和打印到串口,这样AXI总线的读和写就都能观察到了。

板子使用的是zc702。

在观察信号之前我们有必要简单了解AXI是个什么:

AXI总线是一种高性能、高带宽、低延迟的片内总线,AXI协议描述了主从设备数据传输的方式。主设备和从设备通过握手信号建立连接,握手信号包括主机发送的VALID信号,表示数据有效,从机发送的READY信号,表示从机准备好了接收数据。当VALID和READY都有效的时候传输开始。

Zynq使用的是AXI协议的4.0版本,由AMBA3.0协议发展而来:

AXI的三种总线各有各的用途:
AXI4支持突发数据传输,主要用于CPU访问存储等需要高速数据交互的场合,相当于原来的AHB协议;

AXI_Lite一次传输单个数据,主要用于访问一些低速外设,相当于原来的APB;

AXI_Stream数据传输不需要地址,主设备直接连续读写数据,主要用于高速流数据的传输,使用起来类似FIFO。

AXI4总线和AXI4-Lite总线具有相同的组成部分:
(1) 读地址通道, 包含ARVALID, ARADDR, ARREADY信号;
(2) 读数据通道, 包含RVALID, RDATA, RREADY, RRESP信号;
(3) 写地址通道, 包含AWVALID, AWADDR, AWREADY信号;
(4) 写数据通道, 包含WVALID, WDATA, WSTRB, WREADY信号;
(5) 写应答通道, 包含BVALID, BRESP, BREADY信号;
(6) 系统通道, 包含: ACLK, ARESETN信号。

帮助记忆:
读地址信号都是以AR开头(A: address; R: read)
写地址信号都是以AW开头(A: address; W: write
读数据信号都是以R开头(R: read)
写数据信号都是以W开头(W: write)
应答信号都是以B开头(B: back(answer back))

读时序:

写时序:

5个通道都有自己独立的握手机制,同时又相互协作,地址线分离后,读/写可以并行交互数据。而且AXI支持地址pipeline、错位传输等模式,大大提高了数据通路的利用率。

关于AXI Interconnect模块:

AXI协议可以描述为主/从设备之间的点对点传输,可以有多个主机,也可以有多个从机,这是进行数据交互时,需要一个管理中心确保信号发到对应的设备,AXI Interconnect模块就是这样一个管理中心,也叫做AXI互联矩阵。它类似于一个交换机,保证每个外设独享带宽,完成数据传输。Xilinx公司为我们提供了AXI Interconnect的IP核。

介绍到此,理论部分已经掌握i一二了,下面就开始实际观察AXI的信号。

创建一个基于AXI_Lite总线的加法器IP

新建Vivado工程,依然,选择这个:

修改名字和地址,我命名为AXI_Add,地址最好选择工程路径下新建一个文件夹,这样就会自动把你创建的IP更新到IP库里,其他默认,最后选择Edit IP,在Vivado给出的代码里添加上我们的加法器功能:

注意这些代码就是定义AXI协议的工作方式的,里面有注释,可以去研究一下!

添加用户端口

这里我们没有要输出的信号

添加用户逻辑:

待会我们将两个加数写到寄存器0和1中,从寄存器2中读出和

封装好后回到我们之前建的工程,

然后在工程里添加zynq核,添加刚才创建的IP,点击自动连接,然后选中AXI总线,右击选择Make Debug,出现两个绿色的小瓢虫,将总线加入Debug模式下。

如果你没有把刚才新建的IP放在该工程目录下,先要把IP添加进库里,选择 Project Settings-->IP。点击绿色的加号,选择到你的用户IP地址 :

o4YBAF9uHVuAKzGUAAERMik5j6o056.png

整个系统搭建完成是这样的:

o4YBAF9uHV2AYd7qAAE-BadJ_Jo854.png

下面就是例行操作,自动排版,检查,保存,复位,generate,产生顶层文件。然后先综合(Synthesis)一下,综合好后,打开Synthesis Design下的Set Up Debug,将显示为红色的无用信号删除(选中,点击红色的减号),

pIYBAF9uHV-AcXdgAAE7sED2oA0079.png

设置采样深度为1024,

pIYBAF9uHWGAeR9UAACy9TN9Ses728.png

其他默认,然后生成比特流文件。

软件端的设计

Lanch到SDK,新建一个空的applicaton工程,添加一个c源文件,我们在xparameters.h文件中找到我们添加的加法器AXI_ADD的寄存器首地址,待会我们就是要通过地址对寄存器进行读、写:

o4YBAF9uHWKAKgUsAAA5SEoCAqE167.png

这个案例里我们计算16进制下的24+12=36,为了方便SDK端的断点调试,加了while循环,注释我写在后面了:
#include
#include "xparameters.h"
#include "xil_io.h"
#include "xil_types.h"

#define AXI_ADD_REG0 0 //寄存器0的偏移地址为0
#define AXI_ADD_REG1 4 //寄存器1的偏移地址为4
#define AXI_ADD_REG2 8 //寄存器2的偏移地址为8

int main(){
while(1){
u8 value = 0;
Xil_Out32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG0,0x24); //向寄存器0写入第一个加数
Xil_Out32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG1,0x12); //向寄存器1写入第二个加数
value = Xil_In32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG2); //从寄存器3中读出和
xil_printf("value = %x",value);
}
return 0;
}

硬件联合调试

右键工程 Debug as-->Debug Configrations:

o4YBAF9uHWSAfTZBAAGCKJa-qMc835.png

进入Debug界面后,在AXI总线读、写的地方添加断点:

pIYBAF9uHWWAIGKeAABjsTwjDOo466.png

打开串口:

o4YBAF9uHWaALYTqAAAqc7VvEWA553.png

然后回到Vivado界面,连接到Device,就会自动打开调试界面:

pIYBAF9uHWiAfPy4AAAh6f1uUoo531.png

接下来是设置触发位置,添加触发条件:

pIYBAF9uHWyAAhkSAAPUyQ7qy9M583.png

我们的采样深度是默认的1024,在500的位置触发,

o4YBAF9uHW2AB6T8AAA2OzZygUQ657.png

触发条件设置成WVALID信号为高时,AWVALID信号为高时:

o4YBAF9uHW6AW4yzAAAglAGFcak232.png

右键逻辑分析仪,选中Enable Auto Re-trigger,设置成自动进入下一次触发:

pIYBAF9uHXCAJuKNAAA4G07uVOk626.png

点击运行触发,点击完之后ila进入等待触发状态:

o4YBAF9uHXGAMdK8AAAjE1P5AGU250.png

在SDK点击运行:

o4YBAF9uHXKAZvWtAAASvJazISE412.png

首先写入24:

o4YBAF9uHXOALypYAAB4b4le6c0775.png

有一点要注意,这里的写地址VALID和READY信号是下一个地址的,这里就是对应WDATA的4,而对应地址0,也就是我们观察的数据24地址的VALID和READY信号在前面已经有效过了,我们设置写数据有效时触发,而地址有效在前面就没有捕捉到了。

然后写入12:

o4YBAF9uHXWAV9zvAABvgy2gevk355.png

然后串口打印出36:

o4YBAF9uHXaAJetQAAAsPQEvdL0814.png

等到第二轮写入的时候,我们看到读数据通道上出现36:

o4YBAF9uHXiASy5VAACvGhEih8A502.png

我们可以换一下触发信号,换成读VALID,读READY拉高时触发:

o4YBAF9uHXmAdFrqAAAd3B854Qs447.png

就可以看到,读VALID和READY信号都高时,读出36,读地址线上是8:

o4YBAF9uHXqAPaKWAABsbdOmD-Q617.png

这里可以看到读READY信号一直为高,读VALID信号拉高时36读入。但是由于ILA捕捉的是触发时刻信号,所以它将读有效之前的读数据都显示为36了。

大家要注意,触发设置里,添加的信号默认是AND的,如果你一开始就把读有效为高,写有效为高都添加到触发列表里,会观察不到信号,因为这两个信号在本例子;里不会同时出现:

pIYBAF9uHXuAd47UAAA5hgdI940792.png

我们可以添加读VALID为1,写VALID为1,然后选择OR

pIYBAF9uHXyAZvdJAAAfE9IatCc783.png

SDK那边一步步Debug,先是写入24:

o4YBAF9uHX6AQ-lCAABpBPw3INo271.png

然后写入12:

o4YBAF9uHX-AA59IAABouem-CtE971.png

然后读到36:

pIYBAF9uHYCADlyoAABxDYm_1M8711.png

这里也是由于RREADY先于RVALID信号拉高,ILA捕捉不到READY是什么高的,就把之前都显示为高。

如果没有按你设置的运行,可以在SDK重新Debug as或者在Vivado重新连接一下Target,或者多点几次Run Trigger,这软件有时候不灵敏,比如说你虽然设置了自动进入下一次触发,但是它不一定就进入,这是手动点一下触发,进入等待模式,再点击下一次Debug。

小结

到这里,AXI信号读写时序就全部观察完了,这时候可以再去看一看AXI协议的理论部分,把封装基于AX总线的IP时生成的例化代码捋一遍,就能更好的理解AXI总线的工作原理了。提一句,我们目前观察的都是简化版的AXI_Lite协议的时序。
编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 加法器
    +关注

    关注

    6

    文章

    173

    浏览量

    29696
  • AXI
    AXI
    +关注

    关注

    1

    文章

    125

    浏览量

    16224
  • Vivado
    +关注

    关注

    18

    文章

    781

    浏览量

    65013
收藏 人收藏

    评论

    相关推荐

    运算放大器的同相加法器和反相加法器

      运算放大器构成加法器 可以分为同相加法器和反相加法器
    发表于 08-05 17:17 2.3w次阅读
    运算放大器的同相<b class='flag-5'>加法器</b>和反相<b class='flag-5'>加法器</b>

    加法器

    请问下大家,,进位选择加法器和进位跳跃加法器的区别是啥啊?我用Verilog实现16位他们的加法器有什么样的不同啊?还请知道的大神告诉我一下。。
    发表于 10-20 20:23

    什么类型的加法器将被合成到?

    嗨,对于下面的代码片段,合成后会得到哪种类型的加法器?例如:半加法器,全加器,CLA,Ripple加法器模块ee(输入a,e,输出reg c);总是@(*)c = a + e;end
    发表于 03-19 09:49

    什么是加法器加法器的原理是什么 ?

    什么是加法器加法器的原理是什么 反相加法器等效原理图解析
    发表于 03-11 06:30

    多位快速加法器的设计

    摘要:加法运算在计算机中是最基本的,也是最重要的运算。传统的快速加法器是使用超前进位加法器,但其存在着电路不规整,需要长线驱动等缺点。文章提出了采用二叉树法设
    发表于 05-19 09:57 62次下载

    4位并行的BCD加法器电路图

       图二所示为4位并行的BCD加法器电路。其中上面加法器的输入来自低一级的BCD数字。下
    发表于 03-28 16:35 1.2w次阅读
    4位并行的BCD<b class='flag-5'>加法器</b>电路图

    加法器,加法器是什么意思

    加法器,加法器是什么意思 加法器 :  加法器是为了实现加法的。  即是产生数的和的装置。加数和被加数为输入,和数与
    发表于 03-08 16:48 5117次阅读

    十进制加法器,十进制加法器工作原理是什么?

    十进制加法器,十进制加法器工作原理是什么?   十进制加法器可由BCD码(二-十进制码)来设计,它可以在二进制加法器的基础上加上适当的“校正”逻辑来实现,该校正逻
    发表于 04-13 10:58 1.3w次阅读

    同相加法器电路原理与同相加法器计算

    同相加法器输入阻抗高,输出阻抗低 反相加法器输入阻抗低,输出阻抗高.加法器是一种数位电路,其可进行数字的加法计算。当选用同相加法器时,如A输
    发表于 09-13 17:23 5.5w次阅读
    同相<b class='flag-5'>加法器</b>电路原理与同相<b class='flag-5'>加法器</b>计算

    怎么设计一个32位超前进位加法器

    最近在做基于MIPS指令集的单周期CPU设计,其中的ALU模块需要用到加法器,但我们知道普通的加法器是串行执行的,也就是高位的运算要依赖低位的进位,所以当输入数据的位数较多时,会造成很大的延迟
    发表于 07-09 10:42 1.9w次阅读
    怎么设计一个32位超前进位<b class='flag-5'>加法器</b>?

    加法器原理

    加法器是产生数的和的装置。加数和被加数为输入,和数与进位为输出的装置为半加器。若加数、被加数与低位的进位数为输入,而和数与进位为输出则为全加器。常用作计算机算术逻辑部件,执行逻辑操作、移位与指令调用
    的头像 发表于 06-19 14:20 2.5w次阅读
    <b class='flag-5'>加法器</b>原理

    加法器设计代码参考

    介绍各种加法器的Verilog代码和testbench。
    发表于 05-31 09:23 19次下载

    加法器的原理及采用加法器的原因

    有关加法器的知识,加法器是用来做什么的,故名思义,加法器是为了实现加法的,它是一种产生数的和的装置,那么加法器的工作原理是什么,为什么要采用
    的头像 发表于 06-09 18:04 3558次阅读

    4位加法器的构建

    电子发烧友网站提供《4位加法器的构建.zip》资料免费下载
    发表于 07-04 11:20 0次下载
    4位<b class='flag-5'>加法器</b>的构建

    镜像加法器的电路结构及仿真设计

    镜像加法器是一个经过改进的加法器电路,首先,它取消了进位反相门;
    的头像 发表于 07-07 14:20 1216次阅读
    镜像<b class='flag-5'>加法器</b>的电路结构及仿真设计