基于FPGA自适应串口通信(Auto Baud Rate)

该博客介绍了作者用Verilog完成的基于FPGA的自适应串口通信项目,能够实现发送端8N1任意波特率与接收端固定921600波特率的通信。通过频率捕获层算法检测波特率,并利用UART协议进行数据传输。程序存在初始化问题,但达到了波特率交换的效果。
摘要由CSDN通过智能技术生成

做的课设,相当于复习了一遍verilog。


实现了

1.接收端固定模式:8N1 BAUD:921600。

2.发送端8N1,任意波特率(不取极端值)。

3.数码管显示波特率(16进制)。

 

用了

1.两天一夜。

2.ego1平台+usb2uart。


 

整体框图

输入tx信号经过频率捕获层获得100Mhz下的计数值,送给波特率产生层得到接收层波特率。

接收层接收数据送给串口FIFO层,串口FIFO层根据发送层的反馈将数据送出FIFO。

发送层将数据按固定921600波特率发给PC机。从而实现波特率交换。

 


 

频率捕获层算法

1.uart协议

这里只考虑最常用的8N1,即8位数据,无校验,1位停止位。

在时钟线上升沿,tx线下降沿并维持到下一个上升沿即为一个开始位。然后8位数据(低位在前)。然后到第10位停止位高电平。

值得一提的是,tx线不会在某个电平完后恢复初始电平,比如说上一个数据位是低,当前位还是低,这个数据位结束后不会变回高再变低。

有什么影响?倘若tx发送0xff,那么其实只有一个低电平脉宽!即起始位那个脉宽。

2.算法

 先打两拍,同步时钟以及滤除尖峰脉冲。考虑到输入的数据信号大多为ascii码。

我们从里面找一个最特殊的,U,这个字符二进制为10101010,再加上开始结束位的tx线电平变化为:

0101010101,这里有4个或者说5个低电平脉宽,这是最理想的情况。这样测出来的脉宽都是波特率。

但是如果是一般的字符,发送一个字节可能获得多个低电平脉宽,从里面找最小的有极大可能就是波特率(极小可能最小的低电平脉宽是波特率的倍数)。

所以我们的算法就是多次测频率,从里面找一个最小的,即认为是波特率。注意这里的频率,波特率都是相对于ego1的100Mhz时钟,并不需要化为实际波特率。

程序

 1 `timescale 1ns / 1ps
 2 
 3 
 4 module cap_freqence(
 5             input        clk,
 6             input        rst_n,
 7             input
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值