进阶项目(3)UART串口通信程序设计讲解

写在前面的话

UART串行接口简称串口,是我们各类芯片最常用的一种异步通信接口,通过串口我们就可以建立起计算机和我们实验板之间的通信和控制关系,也就是我们通常所说的上下位机通信。串口可以说是不同平台互相通信、控制的一个最基本的接口。

项目需求

设计一个UART控制器,当控制器从上位机接收到数据以后,马上将数据输出,发送回上位机,完成“回环测试”。

 UART的原理分析

要实现UART通信,首先我们需要用到一个外部的电平转换芯片MAX232,其具体配置电路如下:

注解:

MAX232芯片是美信(MAXIM)公司专为RS_232标准串口设计的单电源电平转换芯片,使用+5V单电源供电

主要特点:

符合所有的RS_232技术标准

只需要单一+5V电源供电

片载电荷泵具有升压、电源极性翻转能力,能够产生+10V和-10V电压

功耗低,典型供电电流5MA

内部集成2个RS_232驱动器

高集成度,片外最低只需四个电容即可工作

 

由原理图可以看出,最终我们FPGA需要控制的其实也就是两条信号线:

RXD和TXD,分别为数据接收线和数据发送线。

那么接下来,问题就变得简单了,既然只有两条线,那么我们只需要关注其数据收发时序即可,时序图如下:

UART数据格式:

 说明:在此实验中,无奇偶校验位,则一帧数据为十位。(奇偶校验是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。)

UART接收时,采集一帧数据的中间8位有效位,忽略开始位与停止位;在UART发送时,将发送的并行8位数据转为串行数据,并添加开始位与停止位。

UART中的一帧数据为10位,空闲时均为高电平,在检测到开始位(低电平)之后,开始采集8位有效数据位(低位在前),再将停止位置为高电平即可。

通过前面的学习,我们已经了解了UART的数据格式,那么,传输速率如何控制呢?这就涉及到了一个波特率的概念:

波特率是衡量数据传输速率的指针。表示为每秒钟传送的二进制位数(bit),例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10*120=1200波特(bit)。此实验中设置波特率为9600bit/s。

系统架构

 模块功能说明:bps_rx模块为串口接收数据的速率控制模块,当使能信号rx_en为高电平时,bps_rx模块内部计数器开始计数,按照设定好的波特率,输出控制数据采集的尖峰脉冲信号rx_sel_data和有效数据位的计数值rx_num。

模块功能说明:uart_rx为串口串行数据的接收模块,数据从端口rs232_rx输入,在采集控制信号rx_sel_data和有效位计数器rx_num的控制下,进行串并转换,从端口rx_d[7:0]输出。tx_en为发送控制模块的使能信号,当Uart_rx模块接收数据完毕以后,置高信号tx_en启动数据发送,将采集到的数据rx_d[7:0]发送到上位机。

 模块功能说明:bps_tx模块为串口发送数据的速率控制模块,当使能信号tx_en为高电平时,bps_tx模块内部计数器开始计数,按照设定好的波特率,输出控制数据发送的尖峰脉冲信号tx_sel_data和有效数据位的计数值tx_num。

模块功能说明:uart_tx为串口串行数据的发送模块,并行数据从端口rx_d[7:0]输入,在采集控制信号tx_sel_data和有效位计数器tx_num的控制下,进行并串转换,从端口rs232_tx输出。

 

模块功能介绍

模块名

功能描述

bps_rx

控制串口接收数据的速率

uart_rx

接收串口串行数据

bps_tx

控制串口发送数据的速率

uart_tx

发送串口串行数据

uart

顶层连接

端口和内部连线描述


顶层模块端口介绍

端口名

端口说明

clk

系统时钟输入

rst_n

系统复位

rs232_tx

数据输出端口

rs232_rx

数据输入端口

内部连线

连线名

连线说明

rx_en

bps_rx开始计数的使能信号

rx_sel_data

控制数据采集的尖峰脉冲信号

rx_num

接收有效数据位的计数值

rx_d

接收到的数据

tx_en

发送控制模块的使能信号

tx_sel_data

控制数据发送的尖峰脉冲信号

tx_num

发送有效数据位的计数值

代码解释

数据接收模块波特率生成

/****************************************************          

 *   Engineer      :   梦翼师兄

 *   QQ             :   761664056

 *   The module function:控制串口接收数据的速率

*****************************************************/

00 module bps_rx(        

01 clk,   //系统时钟50MHz

02 rst_n, //低电平复位

03 rx_en,    //使能信号:串口接收或发送开始

04 rx_sel_data,  //波特率计数的中心点(采集数据的使能信号)

05 rx_num   //一帧数据0-9

06 );

07 //模块输入

08 input    clk;   //系统时钟50MHz

09 input    rst_n; //低电平复位

10 input   rx_en;    //使能信号:串口接收开始

11 //模块输出

12 output reg   rx_sel_data;  //波特率计数的中心点(采集数据的使能信号)

13 output reg [3:0] rx_num;   //一帧数据0-9

14 //设置参数

15 parameter bps_div   = 13'd5207,

16   bps_div_2 = 13'd2603;

17

18 //接收标志位:接收到使能信号rx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值