UART的fpga实现

本文详细介绍了UART串口通信的基本原理,包括其作为异步通信接口的特点,与SPI、IIC的区别。讨论了UART的优缺点,如资源节省但速度较慢,并重点解析了RS232通信协议,阐述了起始位、停止位、波特率等概念。此外,还详述了串口接收和发送模块的设计思路,并展示了仿真波形,最后提及了Loopback测试以验证串口通信的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,串口简介
  通用异步收发传输器(Universal Asynchronous Rcceiver/Transmitter),通常称作UART.UART是一种通用的数据通信协议,也是也是串口的总称,它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。它包括RS232,RS499,RS423,RS485等接口标准规范和总线标准规范。

  串口作为常用的三大低速(UART,SPI,IIC)总线之一。不同于其他两种的是它是异步通信接口,而SPI,IIC是同步通信接口。同步通信中双方使用频率一致的时钟,在数据传输过程中时钟伴随着数据一起传输,发送方和接收方的时钟都是主机提供的。UART通信只有两根信号线,一根是发送数据端口线(tx),一根是接收数据端口线(rx).在通信时pc的tx与fpga的rx相连,rx与tx相连。UART可以实现全双工,即可以同时进行发送数据和接收数据。

2,优缺点
缺点:是传输距离不远,速率相对较慢;

优点:
(1)很多传感器芯片或CPU都带有串口功能,目的是在使用一些传感器或CPU时可以通 过串口进行调试;

(2)在较为复杂的高速数据接口和数据链路集合的系统中往往联合调试比较困难,可以先使用串口将数据链路部分验证后,再把串口换成高速数据接口。

(3)串口的数据线一共两根,没有时钟线,节省了大量的管脚资源。

3,RS232通信协议简介

(1) RS232是UART的一种,没有时钟线,只有两根数据线,分别是rx,tx。这两根线都是1bit位宽的。其中rx是接收数据的线,tx是发送数据的线。

(2)当pc通过串口调试助手向fpga发送8bit 数据时,fpga通过串口线rx一位一位的传给pc机,从最低位到最高位依次发送,最后在fpga里面位拼接成8bit数据。

(3)fpga通过串口向pc机发送8bit数据时,fpga把8bit数据通过tx线一位一位传给pc,从最低位到最高位依次发送,最后上位机通过串口助手按照RS232协议把数据拼接成8bit数据。

(4)串口数据的发送和接收是基于帧结构的,即一帧一帧的发送与接收。每一帧除了中间包含的8bit有效数据外,还在每一帧的开头都必须有一个起始位,且固定为0;在每一帧的结束时也必须有一个停止位,且固定为1;不包含校验位的情况下,一帧有10bit。在不发送和接收的情况下,rx,tx处于空闲状态,且都为高电平。有数据帧传输时,首先会有一个起始位,然后时8bit数据位,最后是1bit停止位,然后rx,tx继续进入空闲状态,等待下一次数据传输。
RS232帧结构
(5)波特率:在信息传输通道中,携带数据信息的信号单元叫码元(串口中码元代表一个二进制数),每秒钟通过信号传输的码元数称为码元的传输速率,简称波特率,常用符号“Baud”表示,单位是“波特每秒(Bps)”。串口常见的波特率有4800,9600,115200等。

(6)比特率:每秒种通信信道传输的信息量称为位传输速率,简称比特率,单位为“每秒比特数(bps)”。比特率可由波特率计算得出:比特率=波特率*单个调制状态对应的二进制位数。

(7)由计算的串口发送或接收1bit数据的时间为一个波特,即1/9600秒,如果时钟为50Mhz,需要计数个数为(1s*10^9)ns / 9600bit ns / 20 ns = 5208个系统时钟周期。即每个bit 数据之间的间隔要在50Mhz的时钟下计数5208次。

(8)上位机通过串口发送8bit数据时,会自动在发8bit有效数据前发一个波特时间的起始位,也会自动在发送完8位有效数据后发送一个停止位。串口助手接收上位机发送的数据前,必须检测到一个波特时间的起始位才开始接收数据,接收完8位数据后,在接收一个波特时间的停止位。

4,串口接收模块的设计
(1)串口接收模块的模型图
串口接收模块波形图
(2)思路详解
a,因为RS232是异步通信,所以需要先使用两级寄存器将接收到的数据进行同步,然后再利用一级寄存器来检测输入数据的下降沿。

b,当检测到输入数据的下降沿时,即说明rx接收到了上位机发送的起始位,此时产生一个标志数据起始信号的脉冲,然后再将使数据接收使能信号拉高(work_en),表明开始接收数据。当bit_cnt=8表示已经接收到所有的8bit数据,并且bit_flag = 1 时将work_en拉低,表示数据传输完成,可以不考虑停止位。

c,当work_en为高电平时,baud_cnt开始计数(每个bit传输需要的时钟周期数),当计数5208个数或work_en为0时,计数器清零。

d,当baud_cnt计数到中间时,将bit_flag拉高一个时钟周期,表示接收的数据稳定,可以被取走。此时将bit_cnt加一,表示已经接收的数据的个数。

e,当bit_cnt的值在1~8之间且bit_flag=1时对接收到的数据进行移位拼接将串行数据转换为并行数。并且在bit_cnt=8,bit_flag=1时产生一个移位完成标志信号rx_flag。

f,当移位完成标志信号rx_flag为高时,让rx_data信号赋值给专门用于稳定输出8bit有用数据的po_data;并将rx_flag信号延迟一个时钟周期输出。

接收的仿真
在这里插入图片描述
5,串口数据发送模块
(1)串口发送模块波形图
在这里插入图片描述
(2)思路详解
  当接收端pi_flag接收到一个时钟周期的高电平时,将work_en拉高,表示开始发送数据,此时baud_cnt开始计数,在计数值为1或其他中间值时将发送标志信号(bit_flag)拉高一个时钟周期.当bit_flag为高时bit_cnt加一。然后将数据从低位到高位依次发送出去。由于停止位为高电平,所以bit_cnt计数到9时即可清零。当bit_cnt = 9 ,且bit_flag = 1时,表示停止位已经发送出去,此时可以把work_en拉低,表示数据发送完成。

(3)仿真波形
在这里插入图片描述
5,loopback测试
  所谓loopback就是将串口接收和发送模块结合在一起,将通过串口助手从pc传到fpga的数据再传回pc。RTL图如下:
在这里插入图片描述
最后的仿真图
在这里插入图片描述

6,参考内容
野火:FPGA Verilog开发实战指南。

7,工程及仿真代码
https://download.youkuaiyun.com/download/alone_l/85451925

### FPGA中的UART接口设计与编程 #### UART协议简介 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter, UART),是一种用于串行通信的标准硬件电路。其主要功能是在微处理器和其他外设之间传送数据,通过将并行输入的数据转换成串行输出以及相反的操作来完成这一过程[^1]。 #### 设计考虑因素 在FPGA实现UART时需考虑到几个方面: - **波特率设置**:为了确保发送方和接收方同步工作,必须设定相同的波特率。 - **帧格式配置**:通常一帧由起始位、8个数据位、奇偶校验位(可选)、停止位组成。 - **状态机控制逻辑**:采用有限状态机(FSM)管理整个UART操作流程,包括初始化、等待启动信号、读取写入等阶段。 - **缓冲区处理机制**:当接收到新字符或准备发出下一个字节之前,应先将其存放在寄存器内作为临时存储空间。 #### Verilog代码实例 下面给出一段简单的Verilog HDL描述的UART模块片段,展示了基本结构框架: ```verilog module uart_top ( input wire clk, input wire rst_n, output reg tx, input wire rx, // CPU interface signals... ); // Internal signal declarations... always @(posedge clk or negedge rst_n) begin : proc_tx_state if (!rst_n) current_state <= IDLE; else case (current_state) ... endcase end // Other always blocks and combinational logic here... endmodule ``` 此段伪码仅提供了一个高层次的设计思路,并未完全展示所有细节部分;实际应用中还需要加入更多具体的功能单元和支持特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值