找回密码
 立即注册
搜索
0赞
赞赏
手机版
扫码打开手机版
把文字装进口袋

【ZYNQ Ultrascale+ MPSOC FPGA教程】第二十八章PS端EMIO的使用

123458224 2022-8-7 02:27:15
        原创声明:

        本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处。
        适用于板卡型号:

        AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG
       
        实验Vivado工程目录为“ps_emio/vivado”。
        实验vitis工程目录为“ps_emio/vitis”。
        如果想用PS点亮PL的LED灯,该如何做呢?一是可以通过EMIO控制PL端LED灯,二是通过AXI GPIO的IP实现控制。本章介绍如何使用EMIO控制PL端LED灯的亮灭。同时也介绍了,利用EMIO连接PL端按键控制PL端LED灯。
        1. 原理介绍

        先来了解GPIO的BANK分布,从图中可知BANK0~BANK2的MIO有78个。BANK3~BANK5的EMIO有96个,本章就是采用EMIO控制PL端LED。
       
       
        FPGA工程师工作内容
        以下为FPGA工程师负责内容。
        2. Vivado工程建立

        1)以ps_hello工程为基础,另存为一个名为ps_emio的工程,打开ZYNQ配置,把GPIO EMIO勾选上。利用PL端的1个LED,1个按键,在MIO配置中选择EMIO的位宽为2位,配置结束,点击OK。
       
       
        2)点击多出的GPIO_0端口右键选择Make External,将端口信号导出
       
       
        3)点击引脚并修改引脚名称为emio,也可以根据自己需求修改名称。保存设计。
       
       
        4)点击xx.bd右键选择Generate Output Products,重新生成输出文件
       
       
        5)结束后,顶层文件会更新出新的管脚,下面需要对其进行引脚绑定
       
       
        3. XDC文件约束PL管脚

        1)新建XDC文件,绑定PL端引脚
       
       
        设置文件名称为emio
       
       
        2)emio.xdc添加一下内容,端口名称一定要和顶层文件端口一致
                                ##################Compress Bitstream############################set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]set_property IOSTANDARD LVCMOS33 [get_ports {emio_tri_io
  • }]#pl ledset_property PACKAGE_PIN W13 [get_ports {emio_tri_io[0]}]#pl keyset_property PACKAGE_PIN AA13 [get_ports {emio_tri_io[1]}]
  •         3)生成bit文件
           
           
            4)虽然说没有用到PL端的逻辑,但是用到了PL端的引脚,因此导出硬件要选择“Include bitstream”
           
           
            软件工程师工作内容
            以下为软件工程师负责内容。
            4. Vitis程序编写

            4.1 EMIO点亮PL端LED灯
            下图为GPIO的控制框图,实验中会用到输出部分的寄存器,数据寄存器DATA,数据掩码寄存器MASK_DATA_LSW,MASK_DATA_MSW,方向控制寄存器DIRM,输出使能控制器OEN。
           
           
            一开始编写代码可能会无从下手,我们可以导入Xilinx提供的example工程,在BSP里找到psu_gpio_0,点击Import Examples
           
           
           
            在弹出窗口选择“xgpiops_polled_example”,点击OK
           
           
            会出现一个新的APP工程
           
           
            1)这个example工程是测试PS端MIO的输入输出的,由于LED是EMIO引出来的,EMIO的MIO号是从78开始的,需要在文件中修改Output_pin为78,测试LED灯。
           
           
            由于只测试LED灯,也就是输出,我们把输入功能注释掉。保存文件。
           
           
            2)编译工程
           
           
            3)Run AsLaunch on Hardware(Single Application Debug),下载结束后,即可看到PS_LED快速闪烁16次
           
           
            4)虽然用官方的例子比较方便,但是它的代码看起来比较臃肿,我们可以通过学习它的方法,自己简化写一遍。我们新建一个APP工程。可以在空白处右键NewApplication Project。在ps_led_test的helloworld.c中修改。其实程序步骤很简单,初始化GPIO设置方向输出使能控制GPIO输出值。
           
           
            第一页跳过
           
           
            选择硬件描述工程
           
           
            填入工程名称,并选择相应的CPU
           
           
            下一步
           
           
            模板选择Hellow World即可
           
           
            5)可以看到多了一个APP工程,仍然是基于名为standalone on psu_cortexa53_0的BSP,也就是一个Domain,与前面的example工程共用一个BSP
           
           
            6)可以将例程的代码复制到helloworld.c中,保存并Build Project
           
           
            7)编译并下载
           
           
            即可看到LED1闪烁。
            4.2 EMIO实现PL端按键中断
            前面介绍了EMIO作为输出控制LED灯,这里讲一下利用EMIO作为按键输入控制LED灯。
            1)通过ug1085文档看下GPIO的结构图,中断的寄存器:
            INT_MASK:中断掩码
            INT_DIS: 中断关闭
            INT_EN: 中断使能
            INT_TYPE: 中断类型,设置电平敏感还是边沿敏感
            INT_POLARITY: 中断极性,设置低电平或下降沿还是高电平或上升沿
            INT_ANY: 边沿触发方式,需要INT_TYPE设置为边沿敏感才能使用
            设置中断产生方式时需要INT_TYPE、INT_POLARITY、INT_ANY配合使用。具体寄存器含义请参考ug1085部分。
           
           
            2)本实验设计为按下按键LED灯亮,再按下LED灭。
            主程序设计流程如下:
            GPIO初始化设置按键和LED方向设置产生中断方式设置中断打开中断控制器打开中断异常打开GPIO中断判断KEY_FLAG值,是1,写LED
            中断处理流程:
            查询中断状态寄存器判断状态清除中断设置KEY_FLAG值
            3)新建名为emio_key的工程,模板为hello world,拷贝例程的程序
           
           
            4)定义PS按键编号为79,PS LED为78
           
           
            5)在main函数中,设置LED和按键,将按键中断类型设置为上升沿产生中断。在本实验中,即按键信号的上升沿产生中断。
           
           
            6)中断控制器设置函数IntrInitFuntions是参考PS定时器中断实验所做,而下面的语句是设置中断优先级和触发方式。即操作ICDIPR和ICDICFR寄存器。
           
           
            7)在中断服务程序GpioHandler中,判断中断状态寄存器,清除中断,并将按键标志置1。
           
           
            8)在main函数中,判断按键标志key_flag,向LED写入数据。
           
           
            9)编译工程并下载程序,观察实验现象,按下KEY1,就可以控制LED1灯亮灭。
            5. 固化程序

            前面介绍过没有FPGA加载文件情况下如何生成固化程序(详情参考“体验ARM,裸机输出”Hello World”一章)。本章内容生成了FPGA的加载文件,在这里演示一下如何生成固化程序。
            与前面一样,也是点击system,右键Build Project即可
           
           
            软件会自动添加三个文件,第一个引导程序fsbl.elf,第二个为FPGA的bitstream,第三个为应用程序xx.elf,下载方法与前面一样,不再赘述。
            6. 引脚绑定常见错误

            1)在block design设计中,比如下图,GPIO模块的引脚名设置为了leds和keys,很多人想当然的在XDC里按照这样的名称绑定引脚。
           
           
            如果打开顶层文件就会发现引脚名称是不一样的,一定要仔细检查,以顶层文件里的引脚名称为准。
           
           
            否则就会出现以下引脚未绑定的错误
           
           
            2)如果是手写XDC文件,切记注意空格,这也是非常常见的错误
           
           
            7. 本章小节

            本章进一步学习了PS端的EMIO的使用,虽然将EMIO连接到了PL端的引脚上,但Vitis中的用法还是一样的,从这个例子我们也可以看出,一旦与PL端发生了联系,就需要生成bitstream,虽然几乎没有产生逻辑。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    使用道具 举报

    您需要登录后才可以回帖 立即登录
    不错
    2022-8-7 21:37:40
    太赞了
    2022-8-8 13:54:37
    谢谢楼主,,,收藏ing
    2022-8-9 04:07:04
    学习了,这就去试试
    2022-8-9 18:19:30
    很给力。。。。很喜欢
    2022-8-11 22:11:06
    很不错的哦,支持,加油
    2022-8-14 02:02:41
    2022-8-17 06:55:06
    支持,赞
    2022-8-20 11:41:11
    不错!顶LZ
    2022-8-23 16:27:15
    12345下一页
    返回顶部