原创 Vivado嵌入式系统设计(2)——在PL添加外设

2017-9-26 10:49 6184 16 2 分类: FPGA/CPLD


新建一个zynq_2的文件夹,将上个实验的工程的文件全部拷贝到这个文件夹。

打开这个工程

(一) 添加两个GPIO实例

 下面将使能 AXI_M_GP0 接口、FCLK_RESET0_N,FCLK_CLK0端口,从IP Catalog 中选择并添加2个GPIO例化到PS中。在 Source 标签下,展开system_wrapper,在展开项中,选择并双击system.bd文件,调用IP集成器。(也可以在Flow Navigator 窗口下,在IP Integrator 下,单击 Open Block Design)。

 在Diagram窗口下,双击ZYNQ块符号,打开ZYNQ配置。单击32b GP AXI Master Ports。

 在Diagram窗口下,双击ZYNQ块符号,打开ZYNQ配置。单击32b GP AXI Master Ports。弹出PS-PL Configuration界面。在该界面中,选中AXI GP0 interface后的复选框。



  单击Diagram左侧一列工具栏内添加IP按钮,在搜索框输入g,找到AXI GPIO IP核。双击添加到设计中。



点击 axi_gpio_0块图标。在Block Properties 窗口内,将Name后面的名字改为 switches


双击axi_gpio_0块图标,打开配置对话框。(由于在建立工程时已经选择了Zedboard,提供了用于zedboard的板级支持包,所以vivado知道板子可以利用的资源)。

  按照如下参数配置。


 单击OK按钮。在Diagram窗口的最上面出现Designer Assistance is available 。单击右侧的 Run Connection Automation,弹出一个对话框,选中switches



可以看到连接完成的系统结构,图中新添加了2个模块。

  1. rst_processing_system7_0_100M (Processor System Reset IP 核例化的名字);
  2. processing_system7_0_axi_periph (AXI Interconnect IP核的例化名字)




单击 Diagram 左侧添加IP的按钮,在弹出的额搜索框内输入g,双击AXI GPIO将其添加到设计中。

单击新添加的模块,在 Block Properties 的窗口内,将Name 后面的名字改为 buttons

双击新加的模块,按如下配置。


双击 AXI Interconnect 块图标,弹出配置对话框,将 Number of Master Interfaces 后的值改为2


 单击新的AXI GPIO 块的 S_AXI 端口,出现一个指针箭头,拖拽并一直按着鼠标左键。出现 Found 1 interface 消息,在 AXI Interconnect的M01_AXI 端口右边出现一个勾,表示这是一个有效的连接端口,拖拽鼠标到这个端口。这样新的GPIO模块和AXI端口相连接。

类似,连接下面的端口

  1. buttons s_axi_aclk——Zynq7 Processing System FCLK_CLK0
  2. buttons s_axi_aresetn——Processor System reset Peripheral_aresetn[0:0]
  3. AXI Interconnect M01_ACLK——Zynq7 Processing System FCLK_CLK0[0:0]
  4. AXI Interconnect M01_ARESETN[0:0]——Processor System Reset Peripheral_aresetn[0:0]




(二)连接外部GPIO外设

  前面添加的按键和开关控制器buttons和switches,将连接到zedboard的相应的引脚,用于控制外部设备。该连接过程可以手工完成,也可以使用设计助手。相应的引脚约束信息由zedboard板给出。

连接外部GPIO外设的步骤如下:

  1. 在Diagram视图中,忽略
  2. 该提示,将手工创建一个端口,并且连接到buttons实例;
  3. 鼠标右键单击 buttons 实例的GPIO端口,出现浮动的端口。执行 make external。该命令用于创建外部名字为gpio的端口,并且连接到外设;
  4. 选择switches 模块的sws_8bits 端口,在其属性窗口内将其名字改为switches;
  5. 选择buttons模块的GPIO端口,在其属性窗口内将其名字改为buttons;(由上游的宽度自动确定gpio接口宽度)
  6. 在vivado 主界面菜单中,Tools ,Validate Design ;或者在 Diagram 左侧的一列工具栏内单击按钮,完成对设计的验证。

设计完成的系统结构


(三)设计约束

  在Source 窗口内,右键单击system.bd 文件,在浮动菜单内,执行Create HDL Wrapper,更新HDL文件。弹出Create HDL Wrapper 对话框,在该对话框内,选中 Let Vivado manage wrapper and auto-update 前面的复选框。然后进行综合,然后打开综合后的设计。

  在快捷栏下拉框下,选择I/O Planning 选项。展开button_tri_i,可以看到已经为该控制器分配了引脚,引脚信息也包含在板级支持包内。当IP自动连接到端口时,自动分配引脚,Switches_tri_i也自动分配了引脚。


(四)生成比特流和导出硬件到SDK

  在vivado 的Flow Navigator 窗口下找到并展开 Program and Debug 选项。在展开项中,找到并双击Generate Bitstream .

       在Vivado 当前工程主界面菜单下,执行菜单命令,File,Export,Export Hardware。弹出 Export Hardware 对话框,在该对话框中吗,必须选中 Include bitstream 前面的复选框(因为设计中使用了ZYNQ的PL部分)。然后执行 File, Launch SDK。


(五)生成测试程序

  在SDK主界面左侧的Project Explorer 窗口下,分别选中mem_test和mem_test_bsp,单击鼠标右键,出现浮动菜单。执行 Delete。这样就删除了前一个工程所生成的应用工程和板级支持包。

  同样的,在Project Explorer 窗口下,选中 system_wrapper_hw_platform_0 ,单击鼠标右键,出现浮动菜单,执行Delete,这样就删除了前一个工程生成的硬件平台信息。

  在SDK主界面菜单下,执行 File,New, Board Support Package。弹出一个对话框,单击Finish按钮,弹出Board Support Package Settings对话框,单击OK,自动编译BSP工程。


在SDK主界面的菜单下,执行命令 File,New,Application Project.弹出的对话框按如下配置 


点击 Next 按钮, 弹出New Project-Template 对话框,在Available Templates 下面选择 Empty Application。单击 Finish 按钮,在后台运行库生成器并且生成xparameter.h文件

  在SDK主界面的 Project Explorer 窗口下,展开 TestApp,src。选中src,单击鼠标右键,出现浮动菜单。执行Import,展开General 选项,选择File System。单击Next,按下图


其中TestAPP.c的代码如下:

#include "xparameters.h"
#include "xgpio.h"

int main(void)
{
XGpio dip,push;
int psb_check,dip_check;

xil_printf("--Start of the Programm--\r\n");

XGpio_Initialize(&dip,XPAR_SWITCHES_DEVICE_ID);
XGpio_SetDataDirection(&dip,1,0xffffffff);

XGpio_Initialize(&push,XPAR_BUTTONS_DEVICE_ID);
XGpio_SetDataDirection(&push,1,0xffffffff);

while(1)
{
psb_check = XGpio_DiscreteRead(&push,1);
xil_printf("Push Buttons Status %x\r\n",psb_check);
dip_check = XGpio_DiscreteRead(&dip,1);
xil_printf("DIP Switch Status %x\r\n",dip_check);

sleep(1);
}

}


(六)验证设计

  按照前面的方法,连接PC和Zedboard直接的JTAG和UART,并且给板子上电。选择Terminal 标签,按以前的参数配置 UART。

 在SDK 主界面的菜单下,执行,Xilinx Tools,Program FPGA,在弹出的对话框中,单击Program按钮,将比特流文件下载到FPGA。当编程完成后,zedboard 板上的DONE LED(蓝色)变亮。在SDK主界面左侧的Project Explorer窗口下,选择TestApp,单击鼠标右键,出现浮动菜单。执行Run As,Launch on Hardware(GDB).将应用程序下载到FPGA,执行ps7_init和TestApp.elf

文章评论1条评论)

登录后参与讨论

curton 2019-5-9 21:28

好文章
相关推荐阅读
LoneSurvivor 2018-02-25 08:26
C++输入/输出流(2)
1. get()函数#include<iostream>using namespace std;int main(){    char s1[80], s2[...
LoneSurvivor 2018-02-23 12:19
C++输入/输出流(1)
1. 输入/输出流类层次 C++的输入/输出流类库是用派生方法建立起的,它有2个平行的基类,streambuf和ios。其他的流类都是从这两个基类直接或间接派生的。1.1   s...
LoneSurvivor 2018-02-19 11:36
C++多态(4)——特殊运算符重载和类类型转换
1.“++”和“--”的重载     运算符“++”和“--”的重载要区分前置和后置两种形式。如果不区分前置和后置,则使用operator++()或operator—()即可,否...
LoneSurvivor 2018-02-12 11:15
C++多态(3)——运算符重载
1.     运算符重载的定义     运算符重载也是实现多态的一个重要手段。运算符重载实现的是编译时的多态,即静态多态性。C++预定义的...
LoneSurvivor 2018-02-12 10:31
C++多态(2)——纯虚函数与抽象类
   抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。 1.     ...
LoneSurvivor 2018-02-11 16:24
C++多态(1)
1.     多态      多态是人类思维方式的一种直接模拟,多态性是指不同对象接收到相同的消息时,根据对象类的不同而产生不同...
我要评论
1
16
关闭 站长推荐上一条 /2 下一条