ZYNQ防火墙开发6-PS-PL通信-EMIO-LED

PS和PL通信机制

image-20240323150812473

​ 从PS 出来有几种连接可以经由 PL 到外部接口上,这被称作扩展的 MIO (Extended MIO),即 EMIO。 EMIO 涉及到两个域之间的信号传输,是由一组简单的导线连接实现的,因此, EMIO 并不支持所有的 MIO 接口,而支持的那些中,也有些的能力受到了限制 [33]。 这些连接被安排成两个 32 位的组。 很多情况下,经由 EMIO 的接口是直接连接到所需的 PL 的外部引脚上的,这个连接是由一个约束(描述)文件中的条目所指定的。在这个模式下,EMIO 可以实现额外的 64 个输入线和 64 个带有输出始能的输出线。另一个选择是用 EMIO 来连接 PS 和 PL 里的外设模块,就是用于连接PL内实现的功能模块(IP核),此时PL端的IP作为PS端的一个外部设备。图 2.10 描绘了这两种使用模式。

Screenshot_20240405_114738

引脚参考:

  1. ug865-Zynq-7000-Pkg-Pinout.pdf
  2. Zynq 7000 SoC Package Files
  3. EBAZ4205引脚列表

EMIO uart 通过原理图可以确定为PL的H16 H17

MIO uart 通过原理图可以确定PS的串口为MIO24-25。

Screenshot_20240408_101417

再通过引脚列表可以看到MIO24-25,对应为F15、A16。当然在通过vivado约束时软件帮我们自动转换好了。

1
2
3
4
Device/Package xc7z010clg400 9/18/2012 09:50:56                                           
Pin Pin Name Memory Byte Group Bank VCCAUX Group Super Logic Region I/O Type No-Connect
F15 PS_MIO25_501 NA 501 NA NA MIO NA
A16 PS_MIO24_501 NA 501 NA NA MIO NA

1创建Vivado工程

\1) 具体步骤 新建一个VIVADO 工程,打开软件 选中Create Project, 如下图所示

img

2)点击NEXT ,在出现的第二个对话框“Project name”中输入工程名;在“Project location”中选择保存路径;勾选“Create project subdirectory”,最后点击“Next” 备注,所有的路径均不能出现中文名称

Screenshot_20240405_205003

3)点击 RTL PROJECT 选项,点击NEXT

img

4) 第四步Add Sources 选项直接留空,NEXT

5)第五步Add Constraints 选项直接留空,NEXT

6)选择芯片型号 我们板子上用的芯片是XC7Z010 ,并在列表栏中选择对应的封装型号,完整型号是XC7Z010CLG400-1 如下所示,选中后点NEXT

img

7)确认所选信息 点击“Finish”,完成vivado的工程创建

2 创建一个BLOCK设计

1)IP INTEGRATOR→Create Block Design,在弹出的对话框中输入设计名,最后点击“OK”,如下图所示

img

2)在右侧的窗口里 ,点击加号,在选择框里搜索ZYNQ,并找到ZYNQ7 PROCESSING SYSTEM ,双击并打开

img

3)软件自动生成了一个 zynq的block 如下图所示,接下来要做一些相应的设置,双击下图中的ZYNQ核

img

\4) 依次在弹窗里找到DDR Configuration→DDR Controller Configuration→DDR3,在Memory Part下拉菜单中根据自己板子上的DDR来选择相应的DDR3,本实验所用到型号:MT41K128M16JT 125,数据位宽选择16bit 最后点击“OK”,如下图所示。

img

5)关键的一步 有别于第六章节的地方,在PS的MIO配置选项的GPIO栏里,增加两路EMIO(因为本次测试的是两个,如果需要增加按键或者其它IO 这里可以对应的调整)

AXI总线在本例子中没有用到,可以去掉M AXI GP0 interface

Screenshot_20240406_153107

6)最后 点击“Run Block Automation”如下图所示。在弹出的选项中保持默认,点击“OK”,即可完成对ZYNQ7 Processing System的配置

7)将刚才添加EMIO GPIO 引出 右键GPIO_0—->Make External

可以看到Diagram中的橘色GPIO_0的属性为 processing_system7_0_GPIO_0。

或者通过跟下代码可以看到从PL约束的gpio_0_tri_io 外部引脚最终到PS的GPIO_0。

Screenshot_20240423_141900

8)用线将M_AXI_GP0_ACLK与 FCLK_CLK0连接起来

  • DDR:内存控制器输入/输出总线端口

  • FIXED_IO:PS连接外部IO的端口,点开“FIXED_IO”上的“+”,可以看到MIO,UART就是在MIO(共54个引脚)中

  • M_AXI_GP0:PS与PL进行片上通信的AXI总线端口

  • FCLK_CLK0:PS部分的FCLK时钟端口

  • FCLK_RESET0_N:PS提供给PL的FPGA硬件复位端口

9)source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper如下图所示。

img

在弹出的对话框里保持默认

img

软件自动为我们生成HDL文件

img

3.创建约束文件,并且定义管脚

1)Add Source → Add or create constraints 点Next

img

因为这个项目没有创建过约束文件 所以这里创建一个约束文件,并在File name 里设置约束文件的名称,并且点击FINISH 完成约束文件的创建

img

2)Sources → Constraints 里找到刚才创建的约束文件 双击并打开该XDC约束文件

img

在约束文件里面复制下面代码来对输出的GPIO进行管脚(所有的管脚转接板上丝印都有实际标注对应的IO)

1
2
3
4
5
6
7
8
9
10
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[1]}]

set_property PACKAGE_PIN K17 [get_ports {gpio_0_tri_io[0]}]
set_property PACKAGE_PIN H18 [get_ports {gpio_0_tri_io[1]}]

set_property PACKAGE_PIN H17 [get_ports UART_0_txd]
set_property PACKAGE_PIN H16 [get_ports UART_0_rxd]
set_property IOSTANDARD LVCMOS33 [get_ports UART_0_rxd]
set_property IOSTANDARD LVCMOS33 [get_ports UART_0_txd]

4.生成bit文件

按下绿色箭头对工程进行编译

img

按下Generate Bitstream 完成综合以及生成bit文件

img

5.SDK程序编写

1)File→Export→Export hardware…,在弹出的对话框中勾选“include bitstream”,点击“OK”确认,如下图所示。

img

img

2)File→Lauch SDK,在弹出的对话框中,保存默认,点击“OK”,如下图所示。

img

系统将自动打开SDK开发环境

img

3)新建一个工程 file→new→Application Project,来新建一个“Application Project”,如下图所示。

img

4)在新建工程名中输入自己的工程名称,点击NEXT

5)选择空工程,点击完成FINISH

img

\6) 在工程中添加main.c文件 src—>New—>Source File 如下图所示

7)在弹出的窗口中填入main.c 并且保存

8).打开刚才创建的main.c

然后 写入以下代码(代码是在 例程的基础上进行精简的) 有一个地方值得注意 EMIO的 IO口编号 是从54开始的,也就是我VIVADO 下创建的 EMIO端口,在PS端都是从54-55-56 依次排序的(小贴士 小于54的是MIO 也就是芯片PS的硬件IO口)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//gpio驱动可参考官方文档和示例
//https://github.com/Xilinx/embeddedsw/tree/master/XilinxProcessorIPLib/drivers/gpiops/examples
//https://xilinx.github.io/embeddedsw.github.io/gpiops/doc/html/api/example.html


#include "xparameters.h"
#include "xgpiops.h"
#include "xstatus.h"
#include "xplatform_info.h"

#define LED1 54
#define LED2 55

#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs Gpio;


void Gpio_Init(void){
XGpioPs_Config *ConfigPtr;

ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);

XGpioPs_SetDirectionPin(&Gpio, LED1, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED1, 1);

XGpioPs_SetDirectionPin(&Gpio, LED2, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED2, 1);

XGpioPs_WritePin(&Gpio, LED1, 0);
XGpioPs_WritePin(&Gpio, LED2, 0);
}


#define LED_DELAY 10000000
volatile int Delay;

int main(void)
{
Gpio_Init();

while(1){

XGpioPs_WritePin(&Gpio, LED1, 0);
XGpioPs_WritePin(&Gpio, LED2, 1);

for (Delay = 0; Delay < LED_DELAY; Delay++);

XGpioPs_WritePin(&Gpio, LED1, 1);
XGpioPs_WritePin(&Gpio, LED2, 0);

for (Delay = 0; Delay < LED_DELAY; Delay++);

};

return 0;
}

6.下载到板子上进行验证

选中工程中的硬件平台,并点击右键→Program FPGA,在弹出的对话框中选择默认,点击“program”,完成FPGA PL部分的Program工作

img

2)选中我们生成的GPIO工程 展开绿色箭头(RUN)右边的图标,选择Run As→1 Launch on Hardware(System Debugger)

可以看到板子(主板)上的LED(红绿灯)在闪烁,如果想改成转接板上的LED灯 只需要修改上文的管脚约束号即可

备注 :如果 RUN 的时候弹出错误 可以按照下面的操作 进行设置 再进行DEBUG

之后点 APPLY 然后 再选择Run As→1 Launch on Hardware(System Debugger)看是否下载成功(如果仍然不行,请对板子进行断电后重试,一般发生这种问题的原因是因为debug的时候跟之前运行的程序产生冲突导致的)

![](ZYNQ防火墙开发6-PS-PL通信-EMIO-LED/Peek 2024-04-06 16-46.gif)

参考:

EBAZ4205转接板资源汇总 (黑色现款)

FPGA设计中,zynq三种实现GPIO的方式


ZYNQ防火墙开发6-PS-PL通信-EMIO-LED
http://witbit.cn/视频课程/FIREWALL_GATEWAY/ZYNQ防火墙开发6-PS-PL通信-EMIO-LED.html
作者
朝彻
发布于
2025年2月13日
许可协议