FPGA实现串口(UART) 您所在的位置:网站首页 串口调试模块是什么东西呀 FPGA实现串口(UART)

FPGA实现串口(UART)

2024-07-17 10:49| 来源: 网络整理| 查看: 265

文章目录

1、什么是串口(UART)?

2、串口的组成

2.1、串口的物理层

2.2、UART协议

3、串口发送模块

3.1、接口定义与整体设计

3.2、设计思路

3.3、Verilg代码

3.4、Testbench

3.5、仿真结果分析

3.6、上板实测

4、串口接收模块

4.1、接口定义与整体设计

4.2、设计思路

4.3、Verilg代码

4.4、Testbench

4.5、仿真结果分析

4.6、上板测试

5、总结

1、什么是串口(UART)?

        串口作为常用的三大低速总线(UART、SPI、IIC)之一,在设计众多通信接口和调试时占有重要地位。

        串口(UART)全称通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),主要用于数据间的串行传递,是一种全双工传输模式。它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。

        “异步”两个字即意味着在数据传递的两个模块之间使用的不是同步时钟。实际上在异步串口的传输中是不需要时钟的,而是通过特定的时序来标志传输的开始(起始位--由高到低)和结束(结束位,拉高)。

2、串口的组成 2.1、串口的物理层

        UART 通信只有两根信号线,一根是发送数据端口线叫 tx(Transmitter),一根是接收数据端口线叫 rx(Receiver),如图所示,对于 PC 来说它的 tx 要和对于 FPGA来说的 rx 连接,同样 PC 的 rx 要和 FPGA 的 tx 连接,如果是两个 tx 或者两个 rx 连接那数据就不能正常被发送出去和接收到。 

        信号的传输由外部驱动电路实现。电信号的传输过程有着不同的电平标准和接口规范,针对异步串行通信的接口标准有RS232、RS422、RS485等,它们定义了接口不同的电气特性,如RS-232是单端输入输 出,而RS-422/485为差分输入输出等。

        传输距离较短时(不超过15m),RS232是串行通信最常用的接口标准。RS-232标准的串口最常见的接口类型为DB9,样式如图所示,工业控制领域中用到的工控机一般都配备多个串口,很多老式台式机也都配有串口。但是笔记本电脑以及较新一点 的台式机都没有串口,它们一般通过USB转串口线来实现与外部设备的串口通信。

        DB9接口定义以及各引脚功能说明如图所示,我们一般只用到其中的2(RXD)、3 (TXD)、5(GND)引脚,其他引脚在普通串口模式下一般不使用:

2.2、UART协议

        UART 在发送或接收过程中的一帧数据由4部分组成,起始位、数据位、奇偶校验位和停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。

        校验位分为奇校验和偶校验,用于检验数据在传输过程中是否出错。

        奇校验时,发送方应使数据位中1的个数与校验位中1的个数之和为奇数;接收方在接收数据时, 对1的个数进行检查,若不为奇数,则说明数据在传输过程中出了差错。同样,偶校验则检查1的个数是否为偶数。关于奇偶校验可参考:Verilgo实现的FPGA奇偶校验 

         

        UART通信过程中的数据格式及传输速率是可设置的,为了正确的通信,收发双方应约定并遵循同样的设置。数据位可选择为5、6、7、8位,其中8位数据位是最常用的,在实际应用中一般都选择8位数据位;校验位可选择奇校验、偶校验或者无校验位;停止位可选择1位(默认), 1.5或2位。

        串口通信的速率用波特率表示,它表示每秒传输二进制数据的位数,单位是bps(位 /秒),常用的波特率有9600、19200、38400、57600以及115200等。

        如波特率9600则代表每秒传输9600bit数据,以串口发送1个字节10bit算(起始位1bit+数据8bit+停止位1bit+NO校验位),则传输1个字节需要的时间是1*10/9600秒。 

3、串口发送模块 3.1、接口定义与整体设计

        发送模块整体框图、输入输出信号如下所示:

        

        其中信号端口如下:

       需要说明的是,uart_tx_data为需要发送的一个字节的数据,uart_tx_en为发送使能位,当其拉高,则代表此时通过串口发送数据线发送数据uart_tx_data。

3.2、设计思路 该模块支持任意波特率(理论上)的发送,但需要在使用该模块时使用参数将其例化,数据位8位,起始位和停止位各1位,无奇偶校验当使能信号有效后拉高发送标志信号,标志模块进入发送过程;当发送完10个bit后,拉低发送标志信号,标志发送过程结束。使能信号有效时将要发送的数据寄存。假设波特率为9600,则发送一个bit的时间为1s/9600,一个数据的传输共10bit(数据位8位,起始位和停止位各1位),则共需要1s/9600;假设系统时钟为50MHz(参数化以便适应不同的系统频率),则其周期为20ns,那么发送一个bit所需要的系统周期数为(1s/9600)/ 20ns ≈ 5208(个)。在发送过程中使用一个计数器计数,计数区间为(0~5208-1),这样的区间一共10个(一个字节需要发送10个bit);此外还需一个计数器对发送的bit数计数(每当上一个计数器计数到5207则表示发送完了一个bit),计数区间(0~9)在发送过程,根据计数器的值(发送bit计数器),对发送数据线进行操作。 若发送bit计数器 = 0,则代表此时需要发送起始位;若发送bit计数器 = 1,则代表此时需要发送发送数据的最低位LSB(数据的发送总是低位在前,高位在后);······若发送bit计数器 = 8,则代表此时需要发送发送数据的最高位MSB;若发送bit计数器 = 9,则代表此时需要发送停止位;发送数据线在不处于发送状态时需拉高,以满足UART时序的空闲状态 3.3、Verilg代码

        根据上述设计思路,部分发送模块代码如下:

// ******************************************************************************************************* // ** 作者 : 孤独的单刀 // ** 邮箱 : [email protected] // ** 博客 : https://blog.csdn.net/wuzhikaidetb // ** 日期 : 2022/07/31 // ** 功能 : 1、基于FPGA的串口发送驱动模块; // 2、可设置波特率BPS、主时钟CLK_FRE; // 3、起始位1bit,数据位8bit,停止位1bit,无奇偶校验; // 4、每发送1个字节后拉高uart_tx_done一个周期,可用于后续发送多字节模块。 // ******************************************************************************************************* module uart_tx #( parameter integer BPS = 9_600 , //发送波特率 parameter integer CLK_FRE = 50_000_000 //主时钟频率 ) ( //系统接口 input sys_clk , //系统时钟 input sys_rst_n , //系统复位,低电平有效 //用户接口 input [7:0] uart_tx_data , //需要通过UART发送的数据,在uart_tx_en为高电平时有效 input uart_tx_en , //发送有效,当其为高电平时,代表此时需要发送的数据有效 //UART发送 output reg uart_tx_done , //成功发送1BYTE数据后拉高一个周期 output reg uart_txd //UART发送数据线tx ); //当发送使能信号到达时,寄存待发送的数据以免后续变化、丢失 always @(posedge sys_clk or negedge sys_rst_n)begin if(!sys_rst_n) uart_tx_data_reg


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

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