【接口时序】3、UART串口收发的原理与Verilog实现 您所在的位置:网站首页 串口收发过程 【接口时序】3、UART串口收发的原理与Verilog实现

【接口时序】3、UART串口收发的原理与Verilog实现

2023-11-21 00:40| 来源: 网络整理| 查看: 265

一、软件平台与硬件平台

  软件平台:

    1、操作系统:Windows-8.1

    2、开发套件:ISE14.7

    3、仿真工具:ModelSim-10.4-SE

  硬件平台:

    1、FPGA型号:XC6SLX45-2CSG324

    2、USB转UART芯片:Silicon Labs CP2102GM

二、原理介绍

  串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。 串口按电气标准及协议来划分,包括RS-232、RS-422、RS485等。其中最常用的就是RS-232接口。

  RS-232接口有以下三个特性:

    1、用了一个9针的连接器"DB-9"(早期的电脑有用25针的连接器"DB-25")

    2、允许全双工通信(即通过串口发送数据和接收数据可以同时进行)

    3、通信的最大速率大约在10KBytes/s左右

  DB-9接口的实物图如下图所示(早期电脑主机后面可以看到这个接口,现在一般都用USB转串口线进行串口通信):

虽然DB-9接头一共有9根线,但是实现串口通信只需要其中的3根线就可以了,分别是:

    1、pin-2:RXD(receive data),接收串行数据

    2、pin-3:TXD(transmit data),发送串行数据

    3、pin-5:GND(ground),地线

  在串口通信中,数据在1位宽的单条线路上进行传输,一个字节的数据要分为8次,由低位到高位按顺序一位一位的进行传送,这个过程称为数据的"串行化(serialized)"过程。由于串口通信是一种异步通信协议,并没有时钟信号随着数据一起传输,而且空闲状态(没有数据传输的状态)的时候,串行传输线为高电平1,所以发送方发送一个字节数据之前会先发送一个低电平0,接收方收到这个低电平0以后就知道有数据要来了,准备开始接收数据从而实现一次通信。串口通信的时序如下图所示:

  串口通信的规范如下:

    1、空闲状态(没有数据传输的状态)下,串行传输线上为高电平1

    2、发送方发送低电平0表示数据传输开始,这个低电平表示传输的起始位

    3、8-bit的数据位(1 Byte)是从最低位开始发送,最高位最后发送

    4、数据位的最高位发送完毕以后的下一位是奇偶校验位,这一位可以省略不要,同时,当不发送奇偶校验位的时候接收方也相应的不接收校验位

    5、最后一位是停止位,用高电平1表示停止位

  下面以发送字节0x55为例来说明整个的发送过程:

    先把0x55转化成二进制为:01010101。显然0x55的最低位bit 0是1,次低位bit 1是0,……..,最高位bit 7是0,由于串口是从最低位开始发送一个字节,所以0x55各个位的发送顺序是1-0-1-0-1-0-1-0,波形如下图所示

下面在给出一个波形,根据上面的规则也可以很容易判断这是发送字节0x13的波形

接下来的最后一个问题是:串口传输的速度是多少?

  实际上,串口传输的速度用波特率(baudrate)来指定。波特率表示的是每秒发送的比特数,单位是bps(bits-per-seconds),例如,1000 bauds表示1秒钟发送了1000个比特,或者说每个比特持续的时间是1ms。关于串口发送的波特率是有一组标准的规定的,并不是随便一个数字。常用的波特率标准有:

    1、1200 bps

    2、9600 bps (常用)

    3、38400 bps

    4、115200 bps (常用,而且通常情况下是我们能用的最快的波特率)

  波特率为115200 bps时,每个比特持续的时间为(1/115200)=8.7us,所以发送8个bit(1 Byte)需要的时间是8*8.7us=69us。在不考虑奇偶校验位的情况下,发送一个字节还需要发送额外的1个起始位和1个停止位,所以发送1个字节实际所需要的最少时间是10*8.7us=87us,这意味着1s(1000000us)中能发送的字节数为(1000000/87) = 11494,所以在波特率为115200bps的情况下,串口传输数据的速率约为11.5KB/s。而有些电脑的串口有时候需要一个更长的停止位,比如1.5位或2位的停止位,那么发送一个字节所需要的时间比只有一个比特停止位的情况所耗费的时间更长,在这种情况下,串口的传输速率会低于10.5KB/s。

  通过上面一系列的总结以后,可以得出FPGA与PC之间的串口通信主要包括三个模块:波特率产生模块、发射模块和接收模块。

三、目标功能

  1、编写发送模块的verilog代码,并往PC上连续不断发送0x00~0xff这些数据,PC上用串口调试助手进行接收并以16进制显示出来

  2、在第一个功能的基础上编写接收模块的verilog代码,接收模块接收到第一个功能中发送模块发送的数据以后,用接收到的并行数据的低四位驱动板上的四个LED灯

  3、编写一个顶层模块把发送模块和接收模块均例化进去,然后从PC的串口调试助手上发送数据到FPGA,FPGA接收到数据以后把接收的数据返回给串口调试助手显示

四、设计思路与Verilog代码编写

4.1、发送模块波特率时钟的设计与实现

  本节以波特率为115200bps为例来说明波特率模块设计方法,其余波特率可以以此类推。由于我的开发板上的时钟为50MHz,周期T=20ns,而波特率为115200bps,所以1个bit持续的时间是8.7us,那么每个bit占用的周期数N=(8.7us / 20ns) = 434,所以可以定义一个计数器,每当计数器从0计数到433的时候就把计数器清零,然后在计数值为1(这个计数值最好比433的一半要小,这篇博客的最后一部分分析了原因)的情况下产生一个高脉冲。发射模块只要检测到这个高脉冲的到来就发送一个bit,这样就实现了波特率为115200bps的串口数据发送。

  而接收模块的波特率时钟产生逻辑与发送的波特率时钟相比稍有不同。不同之处在于当接收模块检测到I_rs232_rxd的下降沿以后,表示有数据过来,准备开始接收数据了,由于一个bit持续的时间为434个时钟周期,所以为了保证接收模块接收数据的准确性,我们需要在434/2=217个周期,也就是数据的正中间位置的时候把输入的数据接收并存起来。也就是说接收模块的波特率时钟要比发射模块的波特率时钟滞后数个周期

  波特率产生模块的框图如下图所示

  其中:

  I_clk是系统时钟;

  I_rst_n是系统复位;

  I_tx_bps_en是发射模块波特率使能信号,当I_tx_bps_en为1时O_bps_tx_clk才有时钟信号输出;

  I_rx_bps_en是接收模块波特率使能信号,当I_rx_bps_en为1时O_bps_rx_clk才有时钟信号输出。

  波特率模块的完整代码如下:

module baudrate_gen ( input I_clk , // 系统50MHz时钟 input I_rst_n , // 系统全局复位 input I_bps_tx_clk_en , // 串口发送模块波特率时钟使能信号 input I_bps_rx_clk_en , // 串口接收模块波特率时钟使能信号 output O_bps_tx_clk , // 发送模块波特率产生时钟 output O_bps_rx_clk // 接收模块波特率产生时钟 ); parameter C_BPS9600 = 5207 , //波特率为9600bps C_BPS19200 = 2603 , //波特率为19200bps C_BPS38400 = 1301 , //波特率为38400bps C_BPS57600 = 867 , //波特率为57600bps C_BPS115200 = 433 ; //波特率为115200bps parameter C_BPS_SELECT = C_BPS115200 ; //波特率选择 reg [12:0] R_bps_tx_cnt ; reg [12:0] R_bps_rx_cnt ; /////////////////////////////////////////////////////////// // 功能:串口发送模块的波特率时钟产生逻辑 /////////////////////////////////////////////////////////// always @(posedge I_clk or negedge I_rst_n) begin if(!I_rst_n) R_bps_tx_cnt


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有