赞
踩
上一个小节主要是介绍了UART通讯的协议格式等进行的原理性的介绍,这一个小节主要对UART的代码进行讲解、仿真和板上验证进行介绍说明。在代码设计过程当中,充分的考虑了UART通讯的稳定性和功能接口参数灵活可配置的特点。本节通过实例实现上位机串口助手发送数据,FPGA板卡接收数据并环回发送给上位机显示。
UART模块分为两个部分,一个部分是实现发送功能,另一个部分实现接收功能。UART通过顶层包含发送和接收功能做出一个FIFO接口,有利于项目内的模块的拆分,较少耦合性。具体框架如下所示。
通过上一个小节可以知道UART的通信格式,发送一帧数据有起始位、数据位、校验位、停止位共同组成,如下图示。
在编写代码之前, 我们首先要确定串口通信的数据格式及波特率。在这里我们选择串口比较常用的一种模式, 数据位为 8 位, 停止位为 1 位,无校验位,波特率为 115200bps。则传输一帧数据的时序图如下图所示:
UART数据线空闲状态常态是高电平,通过发送1bit的起始位0,开始进入数据发送状态,低位数据先发送,如果有校验位发送校验位,如果没有校验位发送停止位,停止位一般可以发送1bit,1.5bit和2bit的高电平。
UART发送模块的端口定义如下表所示。
端口名称 | 功能 | 备注 |
clock_i | 主时钟 | |
reset_ni | 复位 | |
start_i | 启动发送 | |
direction | 数据发送大小端控制 | |
data_i | 并行数据输入 | |
cntr_16x_max | 波特率分频计数器设置值 | |
parity_choice | 奇偶校验选择 | |
datanum | 发送数据位数量设置 | |
endnum | 停止位数量设置 | |
txd_o | UART发送信号 | |
over_o | UART发送完成信号 | |
baud_tick | 波特率输出 | |
baud_tick_x2 | 1/2波特率输出 |
具体的端口定义如下图所示:
发送功能的状态机跳转代码如下所示,通过判断start_i高电平启动状态机,跳转到s_start状态,开始发送1bit的起始位,跳转到数据发送状态,当按照发送数据bit位数达到用户设置的位数时,判断如果配置了发送奇偶校验位则跳转到奇偶校验状态,如果没有配置奇偶校位,跳转到发送停止位,由于停止位存在0.5bit的情况,所以这里对波特率进行了倍频,达到用于设置的停止位bit数量要求状态机跳转到s_wait状态最后回到空闲,等待第二次触发。
产生波特率计数器使能信号如下图所示:
波特率产生计数器
二倍频波特率信号产生
发送完成信号产生
发送数据计数器
停止位计数器
发送bit位,大小端数据发送控制。
奇偶校验位生成
发送数据端口控制
UART接收功能代码的端口如下下表。
端口名称 | 功能 | 备注 |
clock_i | 时钟接口 | |
rst_n | 复位接口 | |
rxd_i | UART接收端口 | |
direction | 数据接收大小端控制 | |
cntr_16x_max | 波特率分频计数器设置值 | |
parity_choice | 奇偶校验选择 | |
datanum | 发送数据位数量设置 | |
endnum | 停止位数量设置 | |
data_valid_o | 接收数据输出有效信号 | |
data_o | 接收数据输出信号 | |
parity_error_o | 奇偶校验错误信号 | |
frame_error_o | 接收帧错误信号 |
UART接收部分状态机跳转代码如下图所示,在空闲状态判断是否存在起始信号,如果存在起始信号,跳转到接收起始位状态,接收完成起始位信号,跳转到接收数据状态,达到用户设置的数据位数量,判断用户是否需要接收奇偶校验位,如果设置奇偶校验位跳到接收奇偶校验的状态接收奇偶校验位,否则接收停止位。
在实验室条件下,串口发送的数据通常是稳定的,在接收时取数据中点作为接收数据。
在工业环境下,干扰较多,信号中通常会产生冲激,用取数据中点的方法容易受到脉冲信号的影响,故用采样的方法保证接收数据的准确性。
16倍频波特率产生,用于进行16次信号采样,如下图示。
采样计数器和实际波特率的产生,如下图所示。
采样值进行累加,如果在16次采样中值大于7代表是0(因为rxd前面进行了取反),其他情况代表接收到了1,具体代码如下图所示。
接收数据bit有效值产生具体代码,如下图所示。
起始位检测信号产生,如下图所示。
0.5bit控制位信号产生,代码如下图所示。
开始bit位计数器,如下图所示。
数据接收串转并控制代码,如下图所示。
生成接收奇偶校验控制位,判断奇偶校验是否正确,如下图所示:
接收数据和数据有效输出控制,如下图所示。
UART的顶层主要例化接收和发送子模块,发送数据读取fifo功能,当发送fifo的非空去数据发送到UART的发送模块,当UART发送模块发送完成一个数据时取fifo下一个数据具体代码,如下图所示。
这一节主要介绍了UART的发送、接收代码和顶层的具体代码,由于篇幅太长,下一节我们主要介绍UART模块的仿真和板上调试。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。