ZYNQ学习之路5.扩展PL端串口

时间:2024-05-21 16:19:25

在ZYNQ7000中,硬核只集成了两个串口外设,除去终端使用的串口,只剩一下一个串口可用,而在大多数应用中一个串口往往不能满足要求。使用FPGA模拟串口可以解决串口外设不足的问题,Xilinx提供了两种串口IP:AXI UART Lite和AXI UART 16550,使用这两个IP可以非常方便的使用扩展串口,并且Xilinx提供了Linux中的相应的串口驱动程序,符合tty标准设备。本文介绍这两种串口IP的使用。

一. UART Lite与UART 16550介绍

1.1 AXI UART Lite

AXI UART Lite IP是完全使用FPGA资源模拟出来的异步串口收发器,使用AXI总线与ARM硬核进行通信控制。它支持常用的5~8位数据位,奇偶校验,可配置的波特率,发送与接收分别使用了16字节FIFO。其原理框图如图1-1所示。

ZYNQ学习之路5.扩展PL端串口
图1-1: AXI UART Lite原理框图

在ZYNQ7010中,AXI UART LiteIP支持的最大波特率是921600,不到1MHz,基本满足大部分场景需求,如果系统要求波特率更高则使用另外一个IP,也就是本文提到的UART 16550。

1.2 AXI UART 16550

16550 uart最初是一个集成芯片,为了满足计算机串口的高速通信而设计,在最初的一版设计中其FIFO存在BUG,随后便推出了16550A版本。正如其是为了满足高速串口通信,它的波特率可以远远高于大部分单片机内部集成的串口。

UART16550除了拥有AXI UART Lite的全部功能外,还提供1.5bit和2bit停止位,在可配置波特率的基础上还可以使用外部时钟供给串口接收模块,经测试发现,其波特率可以达到linux中tty设备定义的最大波特率,也就是4.5Mbps。

功能如此齐全的UART IP在资源的利用上显然要比UART Lite要高,事实上同样的配置UART16550是UART Lite资源的3倍左右。

二. 使用串口AXI UART Lite IP

2.1 编译uboot源码

下载uboot源代码(https://github.com/Xilinx/u-boot-xlnx)

2.2 编译Linux内核

下载xilinx的linux源代码(https://github.com/Digilent/linux-digilent-Dev)

解压进入内核根目录

> make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig

> make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig

在内核中配置支持AXI UART:

-->Device Dirvers --> Character devices --> Serial drivers -->Xilinx uartlite serial port support

> make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-

UIMAGE_LOADADDR=0x8000 uImage

 

2.3 编译设备树

下载device-tree-generator工具:http://wiki.xilinx.com/device-tree-generator

解压到vivado安装目录下,在xilinx的SDK软件中选择Xilinx->Respositories工具,在Local Respositories中点击New,选择刚解压的Device tree generator工具的根目录,然后点击Apply,OK。