马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 huxiaokai2005 于 2013-2-1 14:56 编辑
Zynq芯片PS和PL部分通过AXI总线进行交互,并且PS部分的IP也可通过AXI总线挂载到ARM核上,本节介绍一下如何设计基于AXI的自定义IP。
AXI总线介绍
AXI(Advanced eXtensible Interface)总线协议是ARM公司提出的AMBA(Advanced Microcontroller BusArchitecture)协议中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。它的地址/控制和数据相位是分离的,支持不对齐的数据传输,同时在突发传输中,只需要首地址,同时分离的读写数据通道、并支持显著传输访问和乱序访问,并更加容易就行时序收敛。
AXI总线协议是在2003年AMBA3.0版本中首次提出的,包含AXI和AXI-Lite的第一版本。2010年提出的AMBA4.0版本中包含了AXI和AXI-Lite的第二版本,并且新加入了AXI-Stream。
ARM官方提供了对AXI总线规范的详细介绍,以下为相关资料:
AMBAAXI Protocol Specification v2.0 AMBAAXI4-Stream Protocol Specification V1.0 Xilinx支持AMBA4.0中的AXI,Spartan®-6、Virtex®-6及以后系列器件支持AXI总线协议,支持包含AXI-Lite、AXI、AXI-Stream这三种模式,其中AXI-Lite模式主要处理简单应用,通过简单协议可以实现基于地址映射的传输,因其一个地址只对应一个数据的读写,比较适用于控制寄存器和状态寄存器读写应用;AXI模式可以处理需要数据吞吐量比较高的场合,它也是基于地址映射的传输,因其支持突发数据传输,最高支持一个地址256个数据的突发传输;AXI-Stream模式是基于流数据的单向高速传输,不是基于地址映射的,因此并没有突发数据量大小限制。
Xilinx对AXI总线支持提供了许多文档资料:
AXI Specification AXI-LiteIPIF Specification for Control/Peripheral devices AXI-LiteIPIF Specification for burst capable memory mapped devices 基于AXI总线的自定义IP设计
在Xilinx中支持的AXI总线协议有三种模式:AXI_Lite、AXI和AXI_Stream。
AXI-Lite模式主要用于处理简单操作,如功能寄存器或者控制寄存器的读写,本文中以一简单设计为例,做一个读取DIP拨码开关状态值和控制LED灯的自定义IP。由于AXI_Lite模式的协议比较简单,在介绍协议的同时主要介绍一下在Microblaze系统中设计自定义IP的方法,而在AXI和AXI-Stream这部分就不再重复说明。
自定义外设设计流程:
第一步:在ISE Project Navigator中建立工程
图1 新建工程
图2 设置对应zynq的选项
第二步,建立基于zynq系统
图3
图4 新建zynq系统
图5 建立基于AXI总线的zynq系统
图6 加载基于Zed板的zynq芯片配置
图7 建立完成的zynq系统
第三步,加入自定义外设
图8
图9 设置自定义外设名称
图10 选择AXI4-Lite
图11 设置2个寄存器,因为需要控制DIP和LED
图12 选择需要的信号
图13 点击Finish完成设计
图14 在IP列表中出现设计的IP:USER_LED
图15 点击挂载到zynq的ARM核上
AXI-Lite IP功能设计
图17 自定义IP路径
自定义IP设计完后,需要为其编写功能代码,在如图17路径中,有一个vhdl文件夹,自定义IP设计生成的HDL代码默认是由VHDL编写的。其中有两个文件:user_led.vhd和user_logic.vhd,如图18所示为AXI-Lite IP接口信号图,其中文件user_led.vhd实现AXI-Lite IPIF模块的功能,文件user_logic.vhd实现User IP Design模块的功能,因此自定义IP的功能代码主要在user_logic.vhd文件中编写。此处的设计Xilinx就比Altera更人性化了,在Altera的NiosII自定义外设设计时,类似axi_lite_cusip.vhd和user_logic.vhd的接口文件都需要工程师自己编写,而Xilinx相当于为工程师提供了一个模板,只需要添加相应的功能代码就可完成设计,这样大大减少了工作量,工作效率得到提高。
图18 AXI-LiteIP接口信号图
下面来看一下user_logic.vhd里面有什么奥秘,如图19所示为模块参数,其中参数C_NUM_REG表示寄存器的数量,在本设计中设置了两个,一个用于读取DIP拨码开关状态值,另一个用于控制LED灯;如图20所示为模块接口信号,其中BUS2IP_**表示从AXI-Lite总线输入到IP的信号,包含时钟信号BUS2IP_CLK、复位信号BUS2IP_Resetn、数据信号Bus2IP_Data、字节使能信号Bus2IP_BE、读使能信号Bus2IP_RdCE、写使能信号Bus2IP_WrCE;而IP2BUS_**表示从IP输出给AXI-Lite总线的信号,包含数据信号IP2Bus_Data、读确认信号IP2Bus_RdAck、写确认信号IP2Bus_WrAck、错误确认信号IP2Bus_Error。
图19 模块参数
图20 模块接口信号
功能模块需要加入的功能为两部分,对应两个寄存器,如表1所示为两个寄存器的映射。
表1 两寄存器映射
寄存器
| 使能信号
| 对应地址映射
| 功能
| reg0 | BUS2IP_RdCE=“10”
| C_BASEADDR | 只读
| reg1 | BUS2IP_WrCE=“01”
| C_BASEADDR+0x4 | 只写
|
reg0是读取DIP拨码开关状态值功能,因此是一个读寄存器操作,首先需要加入DIP拨码开关的输入端口,如图21所示,相关功能代码如图22所示。
图21 加入端口
图22 读操作功能代码
reg1是控制LED灯输出功能,因此是一个写寄存器操作,加入的LED输出端口如图21所示,相关功能代码如图23所示。
图23 写操作功能代码
功能代码编写完成后,将AXI_LITE_CUSIP加入到系统中,如图24所示,自定义的IP是连接到AXI-Lite总线上的。
图24 USER_LED总线连接
系统建立完成后,在ISE中进行编译生成比特流文件,然后在SDK软件中编写相应软件代码,代码如图25所示,主要实现功能是读取DIP状态值,然后将读取得到的DIP状态值通过LED输出,其中读取DIP状态值通过读取reg0得到,reg0的地址为XPAR_AXI_LITE_CUSIP_0_BASEADDR;而控制LED输出通过写reg1得到,reg1的地址为XPAR_AXI_LITE_CUSIP_0_BASEADDR +0x4。
图25 SDK软件代码
一切就绪之后,通过ISIM仿真,查看自定义IP工作状态,如图26所示为读操作,当bus2ip_rnw=’1’,bus2ip_rdce=”10”时,表示AXI-Lite总线请求一次读操作,而自定义IP将ip2bus_rdack置’1’,将数据赋值给ip2bus_data应答这次读操作;如图27所示为写操作,当bus2ip_rnw=’0’,bus2ip_wrce=”01”时表示AXI-Lite总线请求一次写操作,而自定义IP将ip2bus_wrack置’1’,并读取数据应答这次写操作。
图26 读操作
图27 写操作 |