基于Xilinx FPGA平台的异步串口通信设计

2022-02-22 01:07陈明正韦昌辉
电脑知识与技术 2022年36期

陈明正 韦昌辉

关键词:Verilog HDL;UART ; FPGA

中图分类号:TP391 文献标识码:A

文章编号:1009-3044(2022)36-0065-03

21世纪是智慧生活的时代,物联网发展日趋完善又将普适计算和边缘计算应用越来越广,而智慧城市的建设使得各种设备、模块之间的通信过程将增长到前所未有的规模,各种应用场景下的传感器件同主控制器以及设备之间的通信和控制都要依靠各种接口实现,随着电子工业的不断发展,传感器件的复杂程度以及传输数据量的不断增长对通信方式有着比以往更高的要求,因此总线型通信方式成为控制信息和数据的主要传输手段。而受制于功耗、成本、体积、性能等一系列因素,尽可能少的功率消耗、简单的接口逻辑以及合适的电气特性都是必不可少的,因此占用大量I/O 资源的并行通信方式以及对时序要求严格且结构复杂的同步通信方式不可能在物联网的各个节点设备中完全使用。相比较之下,只需两个I/O 资源和一个信号地的异步串行通信总线无异于最优选择[1]。自1970 年EIA(美国电子工业协会)牵头贝尔和其他计算机终端厂商制定出RS-232 标准以后,RS-232 标准在异步传输应用中占据几十年主导地位[2],直到RS-484、RS-422 等新型标准问世并发展成熟。

在未来的工业级市场将主要由传输距离远并且较为稳定的RS-484/422 系列成为主流,未来异步串行通信的主要市场集中在板级通信。为此,本设计将基于FPGA 实现一个UART 接口并完成收发数据测试以及进行数据环回通信测试以验证UART 接口功能和指标达成。主要包含通信协议分析、接口逻辑分析和设计、通信验证三个方面的工作,实现了全双工通信。

1异步串行通信设计方案

本设计的基本目标是在ZYNQ 平台上通过逻辑门电路实现一个异步串行通信接口并成功通信,基于此目标再尝试改变波特率参数将通信速率提升,并对提升效果进行分析。其中包含数据收发测试,稳定性分析等。

本设计的系统结构示意图如图1和图2所示,图1 为UART数据收发示意图,RX 为接收端,TX 为发送端,RX_BUF 和TX_BUF 分别为接收端缓存队列和发送端缓存队列[5]。图2 为UART 数据环回通信示意图,环回通信的主要目的是检测通信链路是否正常,具体操作为将数据发送到接收方再由接收方将数据原样发回,若数据一致,则表示数据链路正常。环回通信示意图中。RX接收上位机发送的串行数据并保存到缓冲队列BUF 中,再由发送端TX 将BUF中的并行数据逐位转为串行数据并传输;上位机通过串口调试工具将发出和收回的数据进行比对,判断通信成败和质量。

2 Xilinx 硬件方案

Xilinx 在行业中主要提供各类可编程逻辑器件,目前最先进的为28nm 工艺的7 系列且新增了包含SoC 的ZYNQ 家族。ZYNQ 是包含ARM Cortex-A9 处理器的基于Artix-7 系列的FPGA 器件。

本设计采用了Xilinx 近年推出的ZYNQ 家族成员之一的XC7Z020-2CLG400I 作为解决方案。

ZYNQ 从构成上看属于嵌入式SoC 类型的平台,Xilinx 推出这个家族的产品主要针对于视频流处理、驾乘辅助以及工业级自动化等对计算性能和效率要求较高的高端嵌入式应用场景。在高端应用领域尤其是像导弹控制、航空航天等任务中的一些实时控制系统中,甚至会采用ARM 核心+FPGA+DSP 的协同实现作为解决方案。

本方案采用的XC7Z020-2CLG400I 是Xilinx 公司的Zynq7000 系列的芯片,该平台的PS 系统端嵌入了两个ARM Cortex™-A9 处理器核心,主频最高可达767MHz;ARM核心通过AMBA 总线实现内部存储器与外部存储器接口和外设的互连。PL 端基于AR⁃TIX-7 架构,包含85K 逻辑单元Logic Cells、53.2K 触发器、220个乘法器单元以及4.9Mb BLOCK RAM。下图为ZYNQ-7000 系列的SoC 架构概况。本设计采用了Xilinx 近年推出的ZYNQ 家族成员之一的XC7Z020-2CLG400I 作为解决方案,如图3 和图4 所示。

本设计选用了微相科技推出的基于XC7Z020-2CLG400I 核心的开发板MicroZus,搭载1GB ddr3、128Mbit QSPI Flash、Wi-Fi 蓝牙芯片以及各类接口,具有较多的功能和较强的性能。

3异步串行通信模块设计

为了验证本设计的实现情况,需要采用环回通信方式进行收发数据验证,因此系统应该有一个串口接收模块,用来接收发送端发送的数据;还要有一个串口发送模块,用于将数据发回发送端,发送端利用上位机的串口调试工具实现;此外还需要有一个对数据帧进行环回控制的模块,它负责把从串口接收模块接收到的数据进行缓存以待合适时机再转发给串口发送模块,串口发送模块再发送到接收端以实现串口数据的环回。由此可以画出本设计的系统结构图如图5所示。

3.1 接收模塊

本设计所用平台为50MHz,RX_data 是RX 信号线从接收到信号跳变开始记录到的各个比特位,帧起始标志start 是RX 接到起始位下降沿电平跳变时拉高一个时钟周期的信号,用于指示接收过程的开始,同事接收标志RX_flag 拉高,时钟计数器置零并开始计数,bit_cnt 也被置零。当位计数器bit_cnt 的计数值达到8 时,标志着已经开始接收终止位,帧结束标志finish 位拉高一个位宽周期,同时将串行数据存入缓冲队列BUF 之中,等到位计数器bit_cnt 为9 时fin⁃ish 位和RX_flag 置低,标志着一个数据帧接收完成,等到RX 信号线再一次出现下降沿的电平跳变时再开始接收新一帧数据。在接收过程中,位计数器bit_cnt 的计数依据是时钟计数器clk_cnt 提供的,时钟计数器的最大值通过系统时钟频率和波特率计算得来,表示传输一个bit 数据所需的系统时钟周期数,clk_cnt 每达到一次最大值,bit_cnt 便自增1,之后clk_cnt 清零继续计数,直到bit_cnt 达到9 之后,clk_bnt 不再计数。对数据帧每一位的采样一般不会定在每一位的起始或者末尾位置,这主要是为了能够准确无误地接收上位机传来的数据,因为器件本身建立状态需要一定的时间,电平的跳变也不是在一个时刻内完成的,因而采样时一般将采样点定在数据位的正中央,此时是数据电平建立最稳定的时刻,可以在一定程度上降低误码率。

通过对接收模块的接口和信号分析和建模,利用Verilog 进行硬件描述之后生成如下的门级网表图。左端输入接口分别为系统时钟sys_clk,系统复位sys_rst_n 以及数据输入端uart_rxd;右端输出分别为并行数据接口uart_data[7: 0] 以及传输完成标志uart_done。

3.2 发送模块

在发送模块的系统结构中,用于标志串口发送过程的TX_flag 信号赋值给uart_tx_busy,并通过模块端口输出。这样其他模块就可以通过检测uart_tx_busy 信号是否为低电平,从而判断串口发送模块是否处于空闲状态。若uart_tx_busy 为高电平,那么uart_send 模块正处于发送过程,外部模块需要等待当前发送过程结束之后,环回模块才能将发送使能信号通过uart_en 接口进入发送模块,uart_en 信号用一个上升沿来启动新的发送过程。而发送模块内部也需要一个同样的使能en_flag 信号作为发送开始的激励。接到uart_en 后模块首先将en_flag 拉高一个时钟,在上升沿的同时,发送过程开始,时钟计数器clk_cnt 置零并开始计数,直到计数值达到发送一个bit 所需的时钟周期数完全达到,再将下一位数据接入发送信号线,实现数据的并串转换。以此类推直到数据发送完成,当一帧数据发送结束时,TX_flag 拉低,此时uart_tx_busy 也会变为低电平传输到环回模块。有一些信号出现重复的波形是因为其中有一个是内部信号,而另一个是外部接入或者要输出的信号。

3.3 环回模块

环回模块是进行环回通信时用到的一个带有判断功能的缓冲队列,在逻辑上也比较简单:接收模块在接收到一帧数据之后,由于发送模块需要进行并串行转换,所以发送时延较长,因此需要将来不及发送的数据再试存放在缓冲队列中并设置相应的新数据标志recv_done;等到发送模块发送完一帧数据后进入空闲状态,此时环回模块会接收到uart_tx_busy 的低电平信号,此時环回模块会向发送模块的uart_en 接口发送一个时钟周期的脉冲,促使发送模块继续将缓冲队列的数据发送出去。UART 接口环回通信结构图如图5所示。

环回模块还解决的一个问题是全双工环回通信时的数帧丢失问题,由于发送模块需要将数据终止位完整发送,所以接收端接收进来的数据后发送端还有半个位宽的时钟没有完成,而此时接收端的数据已经放入了BUF 并行数据接口中了,而此时发送过程正在进行,uart_en 信号无法发挥作用,因此这一帧数据将会丢失。

4 UART 通信验证及分析

4.1 基于IAL 的数据收发验证

ILA 全称集成逻辑分析仪,是vivado 开发平台提供的一个强有力的分析工具,在工程中实例后就能对指定端口进行调试分析。本设计中数据单独的收、发功能测试无法仅凭上位机串口调试工具完成对比和时序分析,所以采用ILA 完成。

使用上位机通过串口向开发板发送16 进制数55,在串口接收过程中ILA 抓取的波形图6所示。图中绿色的触发线标识出了串口接收端uart_rxd 的起始位,在整个接收过程中rx_flag 保持为高电平,同时rx_cnt 对串口数据进行计数。当rx_cnt 计数到9 时,串口数据接收完成,uart_done 拉高,同时uart_data 给出接收到的数据。从图6中可以看到,接收模块能够正确接收串口数据并完成串并转换。

串口发送过程中ILA 抓取的波形图如图7所示为,使用开发板通过串口向上位机向发送16 进制数55。图中的触发线标识出了串口发送使能信号uart_en 的上升沿。在检测到uart_en 的上升沿后,en_flag 会拉高一个时钟周期,此时将uart_din 端口上的待发送数据寄存到tx_data 中,并进入串口发送过程。在整个发送过程中tx_flag 保持为高电平,tx_cnt 对串口数据进行计数,同时tx_data的各个数据位依次通过串口发送端uart_txd 发送出去。当tx_cnt 计数到9时,串口数据发送完成,开始发送停止位。在一个波特率周期的停止位发送完成后,串口发送过程结束,uart_tx_busy 信号拉低,表明串口发送模块进入空闲状态。

4.2 上位机与开发板环回通信测试

将开发板通过串口线连接到上位机,如图8所示,通过串口调试工具XCOM向开发板发送“010203040506070809”共18位字符并设置以16进制发送,接收端设置为以16进制显示,点击发送按钮之后,在接收窗口立即会显示开发板传回的数据,实现了双工通信。

5 结束语

异步串行通信在未来的物联网产业中会有比以往更广阔的应用前景。本文采用基于Xilinx FPGA平台的方案。设计了一种具有完全功能的异步串行通信收发器,通过实验,验证实现了收发双方的全双工通信。