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

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

3天内不再提示

ARM+FPGA开发:基于AXI总线的GPIO IP创建

454398 来源:CSDN 博主 作者:ChuanjieZhu 2020-12-25 14:07 次阅读

FPGA+ARM是ZYNQ的特点,那么PL部分怎么和ARM通信呢,依靠的就是AXI总线。这个实验是创建一个基于AXI总线的GPIO IP,利用PL的资源来扩充GPIO资源。通过这个实验迅速入门开发基于总线的系统。

使用的板子是zc702。

AXI总线初识:

AXI (Advanced eXtensible Interface),由ARM公司提出的一种总线协议。总线是一组传输通道, 是各种逻辑器件构成的传输数据的通道, 一般由数据线、地址线、 控制线构成。Xilinx从6系列的 FPGA 开始对 AXI 总线提供支持, 此时 AXI 已经发展到了 AXI4 这个版本, Vivado里都是基于AIX4的 IP。

ZYNQ支持三种AXI总线,拥有三种AXI接口,用的都是AXI协议:
AXI4:(For high-performance memory-mapped requirements)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输。
AXI4-Lite:(For simple, low-throughput memory-mapped communication)是一个轻量级的地址映射单次传输接口, 占用很少的逻辑单元。
AXI4-Stream:(For high-speed streaming data)面向高速流数据传输,去掉了地址项,允许无限制的数据突发传输。

数据在总线上是遵守协议定的规则来传输的,AXI信号传输先是传地址,然后检测READY+VALID,都为高电平时开始传数据,当主机发送最后一个数据时LAST信号拉高,通知从机传输结束。

在介绍读写如何进行前先介绍握手协议:

READY,VALID握手通信机制,主机产生 VLAID 信号来指明何时数据或控制信息有效。从机产生 READY 信号来指明已经准备好接受数据或控制信息。传输发生在 VALID和 READY 信号同时为高的时候。(还有一个LAST信号表示什么时候传到最后一个数据了)

读时序:地址线上发来地址,地址准备和地址有效都高时,开始发送要读的数据,读准备和读有效都高时数据被读取到,发最后一个数据时读LAST信号拉高。

o4YBAF9uH8WAI1xaAACU82QQce4263.png

写时序:地址线上发来地址,地址准备和地址有效都高时,开始发送要写的数据,写准备和写有效都高时数据写入,发最后一个数据时写LAST信号拉高。写数据多了一个反馈信号,反馈给主机,主机接收到这个信号,就知道写成功了。

pIYBAF9uH8aAAs4gAACJSfEm2fE067.png

这个协议可以暂时不去理清,知道大致信号关系,后面会通过观察波形进一步加深印象,这次实验的重点是学习通过编程操作寄存器完成读写!

第一步,创建AXI总线IP

新建一个工程,Tools-->Create and Pacakge IP-->选择Create AXI4 Peripheral

o4YBAF9uH8iAUsGLAADnuwEpkoo789.png

创建完以后(起个易理解的名字,放到能找到的路径下),有三项需要设置:接口类型,数据类型和寄存器数量

pIYBAF9uH8qAG5bqAACxI6pURJo494.png

我们按默认这是就好,记住这里的设置:选择AXI_Lite总线,数据位宽是32位,也就是4字节,寄存器4个,实际我们用到的只有一个,但这里最低要求4个,没关系,多出的不用就是,待会我们就要通过操作寄存器完成对数据的读写。

然后选择Edit IP,

打开ip的工程后,先打开这个文件:

o4YBAF9uH8uAVHppAAAu9EZkD6g451.png

这个就是基于AXI_Lite总线协议的模块,可以看到我们设置的数据位宽和寄存器数量:

pIYBAF9uH8yAKfI2AABAxU5Dc7A428.png


o4YBAF9uH82Ab-v2AABskE7zank379.png

AXI总线向寄存器写数据:

pIYBAF9uH8-AYHHYAACcvF5rkeQ036.png

AXI总线下读寄存器的数据:

o4YBAF9uH9CAPZZYAABokX-L-5U914.png

接下来我们添加一个信号,将寄存器绑定到用户输出,用这个输出控制LED灯,这样可以通过观察LED的亮灭看有没有写入成功。

pIYBAF9uH9KAYrmWAABVKth315I408.png


pIYBAF9uH9OAGvfBAAAP5zqyelE589.png

然后打开顶层文件:

pIYBAF9uH9SAGfq5AAAxw0gZuIo667.png

将添加的信号加上去:

o4YBAF9uH9WAT65uAAAwQMaYLEU644.png


pIYBAF9uH9aADP9XAACLLFD8u9A634.png

保存,Tools-->Create and Package IP:

o4YBAF9uH9iACx97AADMtnuJgAo697.png

overwrite原来的文件。

在IP自己创建的工程文件夹里,打包好的IP就是这个文件夹,可以将其拷贝放到任意地方:

pIYBAF9uH9mAcuJGAABA_HOXRd4348.png

至此,基于AXI_Lite总线的IP就完成了。可以将这个文件夹拷到你之前建的工程目录下,我是放在myip文件夹下。

第二步,使用基于AXI总线的IP

将我们自定义的IP添加到库里:

o4YBAF9uH9uAMovxAADwxIIyvs8728.png

Create Block Design,命名为GPIO_AXI_LED,

添加zynq核,双击修改ddr信号,其他默认设置:

o4YBAF9uH96AGn2NAAFiOx2f3dY398.png

添加我们自己创建的IP,然后点击自动连接:

o4YBAF9uH9-AUV-1AACoeX_AwDs259.png

会自动出现互联模块和复位模块,互联模块主要是起管理主从设备的作用:

pIYBAF9uH-GAKCksAAEtjEgQGJs852.png

本来我们还应该添加逻辑分析仪观察AXI总线的各信号波形,但是为了先上手体验怎么开发基于AXI的系统,我们先略过,放在下一个实验中。

再点击Run Block Automatiom:

pIYBAF9uH-OAG3lpAAE20_CPgik910.png

将LED信号也输出出来,右击GPIO_LED,Make External。

右击空白处,选择Regenerate layout,美化一下排版:

o4YBAF9uH-WAdMCPAAFAWNjWEYw582.png

这样我们的系统就搭建成功了,下面就是一些例行操作:

检验一下我们的设计:

pIYBAF9uH-eAN2c_AACxuQ_PVzQ464.png

保存一下我们的设计:

pIYBAF9uH-mARURiAACF3K_7flY544.png

右键bd文件,复位一下系统,Reset Output Products:

pIYBAF9uH-qAL5F1AAAh0Tdzl3I817.png

右键bd文件,Geberate Output Products,

右键bd文件,Create HDL Wrapper。

然后就是添加管脚约束,把GPIO_LED信号连接到LED灯上:

zc702的管教约束如下:

#GPIO PMOD1
set_property PACKAGE_PIN E15 [get_ports {GPIO_LED[7]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[7]}]
set_property PACKAGE_PIN D15 [get_ports {GPIO_LED[6]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[6]}]
set_property PACKAGE_PIN W17 [get_ports {GPIO_LED[5]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[5]}]
set_property PACKAGE_PIN W5 [get_ports {GPIO_LED[4]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[4]}]
#GPIO PMOD2
set_property PACKAGE_PIN V7 [get_ports {GPIO_LED[3]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[3]}]
set_property PACKAGE_PIN W10 [get_ports {GPIO_LED[2]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[2]}]
set_property PACKAGE_PIN P18 [get_ports {GPIO_LED[1]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[1]}]
set_property PACKAGE_PIN P17 [get_ports {GPIO_LED[0]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[0]}]

添加完先综合一下,看看连线有没有错误。综合完成生成比特流文件。
至此,大功告成,下面就到了本实现的重点,进入SDK写代码来读写寄存器!

硬件系统信息和bit文件导入SDK:

o4YBAF9uH-uAIEpkAABIrdXdz4g497.png

然后Lanch SDK,新建一个空的工程:

o4YBAF9uH-2ASGTxAAC_s1bXKrQ584.png

在src文件下建一个c文件:

o4YBAF9uH-6AYonwAACW2pwVVlo534.png

c大家都知道,用到什么函数要将这个函数所在的文件添加到头文件,这类先把头文件添加进去:

#include
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#include "xil_types.h"

Xinlin提供的读函数是Xil_Out32((BaseAddr) + (u32)(RegOffset)),写函数是Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data)),读写都是相对于Master而言的,读当然是In,写当然是Out了。

前面我们提到了,读写是对我们定义的寄存器操作,我们这里8个led灯,只要用到寄存器0的低8位就可以了。既然要操作寄存器,肯定要知道寄存器的地址,所有设备的地址都放在bsp文件下的include文件里的xparameters.h文件里,并且以宏定义,方便调用:

o4YBAF9uH--ARMLvAAAWt2hh5Ns808.png

例如我们的自定义IP在这里,GPIO_Zhu,第一个是基地址,第二个是最高地址,:

pIYBAF9uH_GABZmoAABVlLGA_Hc177.png

寄存器0所在地址就是基地址,偏移量为0,因为我们定义的位宽是32位,4个字节,寄存器1所在地址就是基地址+4,依次类推。

这里我们让8个Led灯依次闪烁,1秒移动一次,并读取寄存器的数据打印到串口:
#include
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#include "xil_types.h"

int main(){
u8 i=0;
u8 ledValue=0;
Xil_Out32(XPAR_GPIO_ZHU_V1_0_0_BASEADDR+0*4,0X00);
while(1){
for(i=0;i Xil_Out32(XPAR_GPIO_ZHU_V1_0_0_BASEADDR+0*4,1 ledValue=Xil_In32(XPAR_GPIO_ZHU_V1_0_0_BASEADDR+0*4);
xil_printf("ledValue=%x/r/n",ledValue); //打印到串口
sleep(1); //1s移动一次
}
i=0;
}
}

板子上电,连接好,以Debug方式运行:

o4YBAF9uH_eAeJ28AAaGfUhX_sY455.png

下载好后,打开串口:

o4YBAF9uH_iAVZnFAAAj1vfG5Aw199.png


o4YBAF9uH_qADLLuAABbqvT4jow911.png

点击开始运行:

pIYBAF9uH_uAaZY5AAB3EupWqSQ056.png

Led开始依次闪烁了!,并且在串口看到打印出的数据:

pIYBAF9uH_yAK8lHAABT0z28o6o501.png

至此,实验成功,开启了我们ARM+FPGA开发之路!以后可以尝试开发更复杂的系统。

编辑:hfy


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

    关注

    70

    文章

    2121

    浏览量

    119373
  • AXI
    AXI
    +关注

    关注

    1

    文章

    126

    浏览量

    16286
收藏 人收藏

    评论

    相关推荐

    FPGA通过AXI总线读写DDR3实现方式

    AXI总线由一些核心组成,包括AXI主处理器接口(AXI4)、AXI处理器到协处理器接口(AXI
    发表于 04-18 11:41 105次阅读

    XILINX FPGA IPAXI Traffic Generator

    AXI Traffic Generator IP 用于在AXI4和AXI4-Stream互连以及其他AXI4系统外设上生成特定序列(流量)。
    的头像 发表于 11-23 16:03 827次阅读
    XILINX <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b>之<b class='flag-5'>AXI</b> Traffic Generator

    ZYNQ的ARMFPGA数据交互——AXI交互最重要的细节

    使用AXI4_Lite)总线把数据写入RAM中,PS端从RAM中读取数据。 3.PL端 (1)首先创建一个Block Design,加入以下IP核:
    发表于 11-03 10:51

    AXI传输数据的过程

    AXI4为例,有AXI full/lite/stream之分。 在Xilinx系列FPGA及其有关IP核中,经常见到AXI
    的头像 发表于 10-31 15:37 465次阅读
    <b class='flag-5'>AXI</b>传输数据的过程

    ARM处理器中有些总线APB AHB AXI 3 AXI 4有什么不同?

    ARM处理器中有些总线APB AHB AXI 3 AXI 4,他们的有什么不同,各自作用?
    发表于 10-24 07:16

    LogiCORE JTAG至AXI Master IP核简介

    LogiCORE JTAG至AXI Master IP核是一个可定制的核,可生成AXIAXI总线可用于处理和驱动系统中FPGA内部的AXI
    的头像 发表于 10-16 10:12 478次阅读
    LogiCORE JTAG至<b class='flag-5'>AXI</b> Master <b class='flag-5'>IP</b>核简介

    基于AXI总线的DDR3读写测试

    本文开源一个FPGA项目:基于AXI总线的DDR3读写。之前的一篇文章介绍了DDR3简单用户接口的读写方式:《DDR3读写测试》,如果在某些项目中,我们需要把DDR挂载到AXI
    的头像 发表于 09-01 16:20 2278次阅读
    基于<b class='flag-5'>AXI</b><b class='flag-5'>总线</b>的DDR3读写测试

    基于Xilinx FPGA AXI-EMC IP的EMIF通信测试

    外部存储器接口( EMIF )通信常用于FPGA和DSP之间的数据传输,即将FPGA作为DSP的外部SRAM、或者协同处理器等。Xilinx提供了AXI-EMC IP核,将其挂载到
    的头像 发表于 08-31 11:25 2746次阅读
    基于Xilinx <b class='flag-5'>FPGA</b> <b class='flag-5'>AXI</b>-EMC <b class='flag-5'>IP</b>的EMIF通信测试

    测评米尔ARM+FPGA异构开发

    米尔基于ARM+FPGA异构开发板,根据下图文件内容可以知道myir-image-full系统支持的功能,其支持OpenCV,也就不用在格外安装相关驱动包等,省了很多事情。
    的头像 发表于 07-10 09:59 543次阅读
    测评米尔<b class='flag-5'>ARM+FPGA</b>异构<b class='flag-5'>开发</b>板

    米尔ARM+FPGA架构开发板PCIE2SCREEN示例分析与测试

    本次测试内容为基于ARM+FPGA架构的米尔MYD-JX8MMA7开发板其ARM端的测试例程pcie2screen并介绍一下FPGA端程序的修改。
    的头像 发表于 07-08 14:38 435次阅读
    米尔<b class='flag-5'>ARM+FPGA</b>架构<b class='flag-5'>开发</b>板PCIE2SCREEN示例分析与测试

    米尔ARM+FPGA架构开发板PCIE2SCREEN示例分析与测试

    本次测试内容为基于ARM+FPGA架构的米尔MYD-JX8MMA7开发板其ARM端的测试例程
    的头像 发表于 07-07 14:15 443次阅读
    米尔<b class='flag-5'>ARM+FPGA</b>架构<b class='flag-5'>开发</b>板PCIE2SCREEN示例分析与测试

    Xilinx FPGA AXI4总线(一)介绍【AXI4】【AXI4-Lite】【AXI-Stream】

    FPGA 应用角度看看 AMBA 总线中的 AXI4 总线
    发表于 06-21 15:21 1875次阅读
    Xilinx <b class='flag-5'>FPGA</b> <b class='flag-5'>AXI</b>4<b class='flag-5'>总线</b>(一)介绍【<b class='flag-5'>AXI</b>4】【<b class='flag-5'>AXI</b>4-Lite】【<b class='flag-5'>AXI</b>-Stream】

    简单讲解AXI Interconnect IP核的使用方法

    最近需要用到AXI接口的模块,xilinx的IP核很多都用到了AXI总线进行数据和指令传输。如果有多个设备需要使用AXI协议对
    的头像 发表于 06-19 15:45 5331次阅读
    简单讲解<b class='flag-5'>AXI</b> Interconnect <b class='flag-5'>IP</b>核的使用方法

    AXI总线工作流程

    在zynq开发过程中,AXI总线经常遇到,每次看到AXI总线相关的信号时都一头雾水,仔细研究一下,将信号分分类,发现其实也不难。
    的头像 发表于 05-25 11:22 617次阅读
    <b class='flag-5'>AXI</b><b class='flag-5'>总线</b>工作流程

    FPGA AXI4协议学习笔记(二)

    上文FPGA IPAXI4协议1_协议构架对协议框架进行了说明,本文对AXI4接口的信号进行说明。
    的头像 发表于 05-24 15:05 902次阅读
    <b class='flag-5'>FPGA</b> <b class='flag-5'>AXI</b>4协议学习笔记(二)