查看: 5259|回复: 2

使用ZYNQ 的PS与PL进行交互(转)

[复制链接]
  • TA的每日心情
    开心
    2015-4-6 11:34
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2012-11-19 23:30:03 | 显示全部楼层 |阅读模式
    分享到:
    ZYNQ中包含了两个部分,双核的arm和FPGA。根据XILINX提供的手册,arm模块被称为PS,而FPGA模块被称为PL。这有点像xilinx以前推出的powerPC+FPGA平台。下图为官方文档中介绍的ZYNQ内部结构。




    从图中可以看到,ZYNQ的绝大多数外设都是PL逻辑部分相连,比如说GPIO,IIS,XADC等等,所以如果我们要使用这些外设的话必须在PL逻辑部分对其进行配置。OK,下面我们就以一个简单的例子来看看如何使用PL和PS进行交互。在下面的例子中,我们通过设置8个开关来对应点亮8个LED灯。
    首先打开XPS,由于XILINX内部已经帮我们做好了GPIO部分的IP核,所以我们只需要直接使用即可(如果要用自己的ip核,则可以使用ISE先把IP核写好再导入进来)。新建立一个工程,选择“Create New Project Using Base System Builder”,


    填好项目工程文件的路径,其它不需要更改,直接点OK,出现如下界面:


    由于我们用的就是ZEDBOARD,所以在这里我们选择的是ZYNQ开发板,直接点击NEXT,

    该界面表示当前工程里已经默认把GPIO和4位的led包含进去了,由于我们这里和光放的ZYNQ开发板还有点差别,所以就不需要这些默认设置了,直接选中点击REMOVE,最后点击FINISH完成工程的建立。

    双击图中所示的AXI General Purpose IO,添加该IP核到ZYNQ中,注意在Width中选择8,表示当前的GPIO的宽度为8,当然如果你需要更宽也可以进行其它设置,但最多不能超过32位。我们这里的SW开关和LED都为8个,所以我们把宽度设置为8.一路点击OK按钮,把该IP核加入到工程中。

    由于我们有SW开关和LED两个外设并且一个为输入一个为输出,所以还需要按照同样的方法再添加一个GPIO核。完成添加后看右边的BUS INTERFACES,可以看到GPIO 0和GPIO1均添加到了系统中。


    点击PORT栏,进入到端口设置部分,在这里我们把一个GPIO设置为输出,它与8个LED灯相连,另外一个设置为输入,它与8个SW开关相连。完成设置后的结果如下图所示

    面就是编辑约束文件,给定义的端口分配管脚了,

    双击project栏中的UCF,打开约束编辑(在这里有个问题,难道ISE14.2中没有专门的约束编辑器吗?),输入以下内容
    上面表示8个LED等,下面表示8个SW按键,注意,在DS中,8个SW按键是连接到VCC_ADJ上的,所以我们这里使用LVCMOS18电平标准。完成这些设置后,依次点击Generate BitStream和Export Design按钮,完成流配置文件的生成和导出到SDK中。

    上面就是PL部分的配置了,下面我们就根据PL的配置来进行PS部分的编程。打开SDK工具,新建工程(具体如何新建可以参考ZedBoard_CTT_v14.1文档,该文档在ZEDBOARD.org网站上有下载)后更改其中的main函数为以下形式
    #include<stdio.h>
    #include"xparameters.h"
    #include"xil_types.h"
    #include"xstatus.h"
    #include"xil_testmem.h"
    #include"xgpio.h"
    #include"platform.h"

    voidprint(char*ptr);

    intmain()
    {
    staticXGpioLED_Ptr0,LED_Ptr1;//定义GPIO指针
    intXStatus;//函数返回状态
    intread;
    init_platform();

    print("ZedBoard LAB3: PS_AXI_LDs\n\r");
    print("超群天晴2012年10月7日22:12:31\n\r");

    XStatus = XGpio_Initialize(&LED_Ptr0,XPAR_AXI_GPIO_0_DEVICE_ID);
    if(XST_SUCCESS != XStatus)
    print("GPIO INIT FAILED\n\r");
    XGpio_SetDataDirection(&LED_Ptr0, 1,0x00);//GPIO0,通道1;设置方向0 输出1输入
    XGpio_DiscreteWrite(&LED_Ptr0, 1,0xFF);//设置输入1,即把所有LED灯点亮



    XStatus = XGpio_Initialize(&LED_Ptr1,XPAR_AXI_GPIO_1_DEVICE_ID);
    if(XST_SUCCESS != XStatus)
    print("GPIO INIT FAILED\n\r");
    XGpio_SetDataDirection(&LED_Ptr1, 1,0xFF);//GPIO1,通道1;设置方向0 输出1输入

    print("INIT OK!!! \n\r");

    while(1)
    {
    read=XGpio_DiscreteRead(&LED_Ptr1,1); //读取sw按键的输入
    if(read&0x80) //如果SW7按下,则LED7点亮,否则熄灭
    XGpio_DiscreteWrite(&LED_Ptr0, 1, XGpio_DiscreteRead(&LED_Ptr0,1)|0x80);
    else
    XGpio_DiscreteWrite(&LED_Ptr0, 1,XGpio_DiscreteRead(&LED_Ptr0,1)&0x7F);


    if(read&0x40) //如果SW6按下,则LED6点亮,否则熄灭
    XGpio_DiscreteWrite(&LED_Ptr0, 1, XGpio_DiscreteRead(&LED_Ptr0,1)|0x40);
    else
    XGpio_DiscreteWrite(&LED_Ptr0, 1,XGpio_DiscreteRead(&LED_Ptr0,1)&0xBF);

    ......... //此处需要自己按上面格式完成
    }


    cleanup_platform();

    }

    点击编译,成功生成ELF文件后即可进行下载,当然在下载ELF文件前还要先把FPGA的配置下载进去。


    总结一下,zynq虽然是一个新的东西,但它的基本开发流程和开发原理和xilinx以往的产品基本一样,ISE,XPS,SDK等等的使用方法也基本相同,所不同的是,ZYNQ系列中包含了两个ARM核,极大的提高了系统的性能。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-20 09:01
  • 签到天数: 35 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2012-11-30 23:32:06 | 显示全部楼层
    这玩意儿刚刚的贵啊。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-4-6 11:34
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2012-12-1 09:26:01 | 显示全部楼层
    3000多吧,有机会玩玩看
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-25 21:45 , Processed in 0.139516 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.