版主: 51FPGA |
xilinx论坛
最后登陆时间:2015-03-19 10:58:07 |
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中建立工程
自定义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相当于为工程师提供了一个模板,只需要添加相应的功能代码就可完成设计,这样大大减少了工作量,工作效率得到提高
下面来看一下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。
功能模块需要加入的功能为两部分,对应两个寄存器,如表1所示为两个寄存器的映射。
表1 两寄存器映射
寄存器
使能信号
对应地址映射
功能
reg0
BUS2IP_RdCE=“10”
C_BASEADDR
只读
reg1
BUS2IP_WrCE=“01”
C_BASEADDR+0x4
只写
reg0是读取DIP拨码开关状态值功能,因此是一个读寄存器操作,首先需要加入DIP拨码开关的输入端口,如图21所示,相关功能代码如图22所示
reg1是控制LED灯输出功能,因此是一个写寄存器操作 功能代码编写完成后,将AXI_LITE_CUSIP加入到系统中,如图24所示,自定义的IP是连接到AXI-Lite总线上的
系统建立完成后,在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 一切就绪之后,通过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’,并读取数据应答这次写操作
|
||||||||||||
共1条 1/1 1 |