【Verilog】UART异步串口的verilog实现 您所在的位置:网站首页 异步收发传输器原理 【Verilog】UART异步串口的verilog实现

【Verilog】UART异步串口的verilog实现

2024-07-15 05:19| 来源: 网络整理| 查看: 265

目录

一、UART介绍

二、Verilog代码

2.1 TOP

2.2 发送模块

2. 3 接收模块

一、UART介绍

        UART是一种采用异步串行通信方式的通用异步收发传输器(universal asynchronous receiver-transmitter),它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。

        UART串口通信需要两根信号线来实现,一根用于串口发送,另外一根负责串口接收。UART在发送或接收过程中的一帧数据由4部分组成,起始位、数据位、奇偶校验位和停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。校验位分为奇校验和偶校验,用于检验数据在传输过程中是否出错。 奇校验时,发送方应使数据位中1的个数与校验位中1的个数之和为奇数;接收方在接收数据时, 对1的个数进行检查,若不为奇数,则说明数据在传输过程中出了差错。同样,偶校验则检查1 的个数是否为偶数。

         UART通信过程中的数据格式及传输速率是可设置的,为了正确的通信,收发双方应约定并遵循同样的设置。数据位可选择为5、6、7、8位,其中8位数据位是最常用的,在实际应用中一般都选择8位数据位;校验位可选择奇校验、偶校验或者无校验位;停止位可选择1位(默认),1.5或2位。串口通信的速率用波特率表示,它表示每秒传输二进制数据的位数,单位是bps(位 /秒),常用的波特率有9600、19200、38400、57600以及115200等。

        在设置好数据格式及传输速率之后,UART负责完成数据的串并转换,而信号的传输则由外部驱动电路实现。电信号的传输过程有着不同的电平标准和接口规范,针对异步串行通信的接口标准有RS232、RS422、RS485等,它们定义了接口不同的电气特性,如RS-232是单端输入输出,而RS-422/485为差分输入输出等。 RS232接口标准出现较早,可实现全双工工作方式,即数据发送和接收可以同时进行。在传输距离较短时(不超过15m),RS232是串行通信最常用的接口标准。

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

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

 

二、Verilog代码

        串口数据环回实验系统框图:

        

         在编写代码之前,我们首先要确定串口通信的数据格式及波特率。在这里我们选择串口比

较常用的一种模式,数据位为8位,停止位为1位,无校验位,波特率为9600bps。则传输一 帧数据的时序图如图 所示:         

 

2.1 TOP module uart_top( input sys_clk, input sys_rst_n, input uart_rxd, output uart_txd ); parameter FREQ = 50000000; parameter BPS = 9600; wire en; wire [7:0] uart_data; uart_recv #( //串口接收模块 .FREQ (FREQ), //设置系统时钟频率 .BPS (BPS)) u_uart_recv( .sys_clk (sys_clk), .sys_rst_n (sys_rst_n), .uart_rxd (uart_rxd), .uart_txd (uart_data), .rx_done (en) ); uart_send #( //串口发送模块 .FREQ (FREQ), //设置系统时钟频率 .BPS (BPS)) u_uart_send( .sys_clk (sys_clk), .sys_rst_n (sys_rst_n), .uart_din (uart_data), .tx_en (en), .uart_txd (uart_txd) ); endmodule 2.2 发送模块 module uart_send( input sys_clk, input sys_rst_n, input [7:0] uart_din, input tx_en, output reg uart_txd ); parameter BPS = 9600; parameter FREQ = 50000000; localparam BPS_CNT = FREQ / BPS; wire start_flag; reg tx_en_d0; reg tx_en_d1; reg tx_flag; //发送过程标志 reg [15:0] bps_cnt; reg [3:0] tx_cnt; reg [7:0] tx_data; assign start_flag = tx_en && (~tx_en_d1); always@(posedge sys_clk or negedge sys_rst_n)begin if(!sys_rst_n)begin tx_en_d0


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

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