UART的fpga实现

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.csdn.net/download/alone_l/85451925

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值