Hoki

【再说FPGA】LX9评测之基于AXI总线的自定义IP设计

0
阅读(4309)

有幸参加上季博客大赛能得到LX9开发板,那就开始评测。。。

1. LX9 Microboard开发板研究

刚收到LX9时给我的第一感觉是袖珍,比一个USB Cable还要小,这要佩服Avnet的工程师了,在如此小的面积下设计出功能强大、性能稳定的开发板来。下面就要对LX9进行开发了,第一步就是要彻底看透这块板子,LX9是以Xilinx公司的Spartan-6 XC6SLX9-2CSG324C FPGA为核心的开发板,总所周知,Spartan FPGA是以低成本、高性价比为主打方向,因此LX9也是以低成本为主要特点,它为工程师提供了适用于MicroBlaze嵌入式应用和关于Spartan-6 FPGA开发的一个很好的解决方案。如图1所示为LX9的正反面视图。

图1-1 LX9实物图

1.1LX9相关资料

在Avnet官网上提供了关于LX9开发板的相关资料及开发教程,并且提供了参考设计,这为开发者提供了很大的便利,链接为:Spartan-6 LX9 Microboard

文档资料:

Avnet_S6_LX9_Microboard_Getting_Start.pdf:进行LX9开发前的准备工作

Avnet_S6_LX9_Microboard_Product_Brief.pdf:LX9开发板简介

Avnet_S6_LX9_Microboard_User_Guide.pdf:LX9开发板使用说明

J50_EDK05-Chipscope_Debugging_13_1_1.pdf:利用Chipscope调试开发文档

Avnet_S6_LX9_Microboard_Configuration_Guide_v1_3.pdf:对LX9开发板进行FPGA配置和编程的说明

1.2 LX9研究

图1-2 LX9开发板结构图

如图2所示为LX9开发板结构图,其中以Spartan-6 LX9 FPGA为核心,包含扩展I/O、时钟源、miscellaneous I/O、通信端口、存储器和电源这六大模块。

扩展I/O包含两个2*6的PMOD I/O接口,可以扩展ADC和DAC等外设;

时钟源是由两部分组成,第一部分由CDCE913为核心的时钟生成电路组成,一路时钟输入三路输出,其中LX9开发板上提供27MHz的时钟源输入,通过CDCE913分频倍频后输出40MHz、66.7MHz和100MHz的三路时钟输出,并且CDCE913还可由I2C接口可编程时钟输出频率;第二部分由DS1088LU-66+组成,输出一个66.7MHz的固定频率时钟。

miscellaneous I/O由4个LED灯、2个按钮和1个拨码开关组成。

通信端口有三部分:USB-JTAG接口、以太网接口和UART-USB接口。其中USB-JTAG接口可以代替USB Cable,通过USB接口配置FPGA并且烧写FLASH;以太网接口为LX9开发板提供各种网络协议应用;UART-USB接口可以通过USB接口实现UART串行接口协议,使用mini-usb代替了的DB9接口,大大缩小了接口体积。

存储器由32M*16的LPDDR SDRAM和128Mb SPI FLASH组成。在做Microblaze系统开发时,SDRAM可用于作为处理器内存,而FLASH则用于保存硬件系统配置。

2. AXI总线研究

LX9开发板的一大特点就是便利的MicroBlaze系统开发,几个预制MicroBlaze 系统所附带的套件使得用户能够在像任何现存标准微处理器中一样开始软件研发。本人以前没接触过Microblaze,不过倒是对Altera的NiosII做过很多相关开发,这两大软核开发流程应该是互通了,掌握了一种,对另外一种应该可以很快上手。果然,按照教程走了一遍MicroBlaze系统的开发就感觉已经轻车熟路了。在基于MicroBlaze系统的开发时,首先可以通过ISE Project Navigator进行整个系统设计的流程导向,在Xilinx Platform Studio中建立基于MicroBlaze系统,在Software Development Kit中进行软件开发,基本与Altera的QuartusII、SOPC Builder、NiosII Software Build Tools这个套路相同。然而,在Xilinx Platform Studio中建系统时,让我眼前一亮,那就是Microblaze加入了对AXI总线的支持,在早期版本的Microblaze中主要支持PLB、LMB和FSL总线的支持。加入AXI总线应用对Microblaze的性能和灵活性都有了提高,因此,我决定对AXI总线的做一下探究。

AXI(Advanced eXtensible Interface)总线协议是ARM公司提出的AMBA(Advanced Microcontroller Bus Architecture)协议中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。它的地址/控制和数据相位是分离的,支持不对齐的数据传输,同时在突发传输中,只需要首地址,同时分离的读写数据通道、并支持显著传输访问和乱序访问,并更加容易就行时序收敛。

AXI总线协议是在2003年AMBA3.0版本中首次提出的,包含AXI和AXI-Lite的第一版本。2010年提出的AMBA4.0版本中包含了AXI和AXI-Lite的第二版本,并且新加入了AXI-Stream。

ARM官方提供了对AXI总线规范的详细介绍,以下为相关资料:

AMBA AXI Protocol Specification v2.0

AMBA AXI4-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-Lite IPIF Specification for Control/Peripheral devices

AXI-Lite IPIF Specification for burst capable memory mapped devices

AXI-Lite IPIF Specification for burst capable stream devices

3. 基于AXI总线的自定义IP设计

在Xilinx中支持的AXI总线协议有三种模式:AXI_Lite、AXI和AXI_Stream,在Xilinx FPGA中的AXI总线应用都是基于Microblaze系统,而自定义IP设计可以最直接接触总线操作,因此下面以在Microblaze系统中设计基于AXI-Lite自定义IP为例分别对这三种模式进行详细说明。

AXI-Lite模式主要用于处理简单操作,如功能寄存器或者控制寄存器的读写,因此根据AXI_Lite模式的特点再基于LX9开发板的资源,可以做一个读取DIP拨码开关状态值和控制LED灯的自定义IP。由于AXI_Lite模式的协议比较简单,在介绍协议的同时主要介绍一下在Microblaze系统中设计自定义IP的方法,而在AXI和AXI-Stream这部分就不再重复说明。

3.1自定义外设设计流程

第一步:在ISE Project Navigator中建立工程

图3-1 新建工程

图3-2 设置对应LX9开发板的选项

图3-3 点击Finish完成工程建立

第二步,建立基于Microblaze系统

图3-4

图3-5 新建Microblaze系统

图3-6 建立基于AXI总线的Microblaze系统

图3-7 将DIP和LED去除

图3-8 建立完成的Microblaze系统

第三步,加入自定义外设

图3-9

图3-10 设置自定义外设名称

图3-11 选择AXI4-Lite

图3-12 设置2个寄存器,因为需要控制DIP和LED

图3-13 选择需要的信号

图3-14 点击Finish完成设计

图3-15 在IP列表中出现设计的IP:AXI_LITE_CUSIP

3.2AXI-Lite IP功能设计

图3-16 自定义IP路径

自定义IP设计完后,需要为其编写功能代码,在如图3-16路径中,有一个vhdl文件夹,自定义IP设计生成的HDL代码默认是由VHDL编写的。其中有两个文件:axi_lite_cusip.vhd和user_logic.vhd,如图3-17所示为AXI-Lite IP接口信号图,其中文件axi_lite_cusip.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相当于为工程师提供了一个模板,只需要添加相应的功能代码就可完成设计,这样大大减少了工作量,工作效率得到提高。

图3-17 AXI-Lite IP接口信号图

下面来看一下user_logic.vhd里面有什么奥秘,如图3-18所示为模块参数,其中参数C_NUM_REG表示寄存器的数量,在本设计中设置了两个,一个用于读取DIP拨码开关状态值,另一个用于控制LED灯;如图3-19所示为模块接口信号,其中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。

图3-18 模块参数

图3-19 模块接口信号

功能模块需要加入的功能为两部分,对应两个寄存器,如表1所示为两个寄存器的映射。

表1 两寄存器映射

寄存器

使能信号

对应地址映射

功能

reg0

BUS2IP_RdCE=“10”

C_BASEADDR

只读

reg1

BUS2IP_WrCE=“01”

C_BASEADDR+0x4

只写

reg0是读取DIP拨码开关状态值功能,因此是一个读寄存器操作,首先需要加入DIP拨码开关的输入端口,如图3-20所示,相关功能代码如图3-21所示。

图3-20 加入端口

图3-21 读操作功能代码

reg1是控制LED灯输出功能,因此是一个写寄存器操作,加入的LED输出端口如图3-20所示,相关功能代码如图3-22所示。

图3-22 写操作功能代码

功能代码编写完成后,将AXI_LITE_CUSIP加入到系统中,如图3-23所示,自定义的IP是连接到AXI-Lite总线上的。

图3-23 AXI_LITE_CUSIP总线连接

系统建立完成后,在ISE中进行编译生成比特流文件,然后在SDK软件中编写相应软件代码,代码如图3-24所示,主要实现功能是读取DIP状态值,然后将读取得到的DIP状态值通过LED输出,其中读取DIP状态值通过读取reg0得到,reg0的地址为XPAR_AXI_LITE_CUSIP_0_BASEADDR;而控制LED输出通过写reg1得到,reg1的地址为XPAR_AXI_LITE_CUSIP_0_BASEADDR + 0x4。

图3-24 SDK软件代码

一切就绪之后,通过ISIM仿真,查看自定义IP工作状态,如图3-25所示为读操作,当bus2ip_rnw=’1’,bus2ip_rdce=”10”时,表示AXI-Lite总线请求一次读操作,而自定义IP将ip2bus_rdack置’1’,将数据赋值给ip2bus_data应答这次读操作;如图3-26所示为写操作,当bus2ip_rnw=’0’,bus2ip_wrce=”01”时表示AXI-Lite总线请求一次写操作,而自定义IP将ip2bus_wrack置’1’,并读取数据应答这次写操作。

图3-25 读操作

图3-26 写操作

3.3小结

本节主要介绍了基于AXI-Lite总线的自定义IP的设计,其中详细介绍了自定义IP的设计流程。从最后仿真图可以验证自定义IP,基本完成了读和写操作。

Baidu
map