原创 19.我与FPGA的恋爱之Uart接收数据

2016-4-20 21:16 818 19 19 分类: FPGA/CPLD 文集: 我与FPGA的恋爱

UART串口接收模块设计(工业环境)

 

上次笔记记录过UART发送协议,回顾一下UART发送端发送一个字节数据时序图:

1000001733-6359678346906394024070465.jpg-g560

对于其中的每一位进行采样,一般情况下每一位数据的中间点是最稳定的,因此一般应用中,采集中间时刻时的数据即可,如下图所示:

(实验室条件)

1000001733-6359678346913194027583790.jpg-g560

但是在工业应用中,往往有非常强的电磁干扰,只采样一次就作为该数据的电平判定,是不保险的,有可能恰好采集到被干扰的信号而导致结果出错,因此需要使用多次采样求概率的方式进行。

以下为改进型的单bit数据接收方式示意图:

 1000001733-6359678346901094024855311.jpg-g560

 

在这张图中,将每一位数据又平均分成了16小段,对于Bit_x这一位数据,考虑到数据在刚刚发生变化和即将发生变化的这一时期,数据极有可能不稳定的(用红色标出的两段),在这两个时间段采集数据,很有可能得到错误的结果,因此这两段时间的电平无效,采集时直接忽略。而中间这一时间段(用绿色标出),数据本身是比较稳定的,一般都代表了正确的结果。但是也不排除该段数据受强电磁干扰而出现错误的电平脉冲,因此对这一段电平,进行多次采样,并求高低电平发生的概率,6次采集结果中,取出现次数多的电平作为采样结果。例如,采样6次的结果分别为1/1/1/1/0/1/,则取电平结果为1,若为0/0/1/0/0/0,,则取电平结果为0,当6次采样结果中1和0各占一半(各3次),则可判断当前通信线路环境非常恶劣,数据不具有可靠性。

 

串口发送模块包含两个主要组件:

1、 起始位检测进程

2、 波特率产生模块

3、 数据接收进程

 

串口接收模块整体结构体

2016-04-20_211346.jpg

 

串口发送模块详细结构图

 

波特率时钟计算:

 

系统时钟周期为System_clk_period

 

波特率

波特率周期

波特率分频计数值

System_clk_period = 20计数值

9600

104167ns

104167/ System_clk_period/16

325-1

19200

52083ns

52083/ System_clk_period/16

163-1

38400

26041ns

26041/ System_clk_period/16

81-1

57600

17361ns

17361/ System_clk_period/16

54-1

115200

8680ns

8680/ System_clk_period/16

27-1

 

 

部分代码详情查看附件文档)

1000001733-6359678337005194026060687.jpg-g560

1000001733-6359678337014294027032503.jpg-g560

1000001733-6359678337014894025559920.jpg-g560

 

发送数据效果以及仿真:

1000001733-6359678358729694023280017.jpg-g560

1000001733-6359678358736494026793343.jpg-g560

文章评论0条评论)

登录后参与讨论
我要评论
0
19
关闭 站长推荐上一条 /2 下一条