随着电子设计自动化(EDA)技术的发展,可编程逻辑器件FPGA/CPLD已经在许多方面得到了广泛应用,而UART(通用异步收发器) 是在数字通信和控制系统中广泛使用的串行数据传输协议。因此越来越多用户根据自己的需要,以EDA技术作为开发手段,用一块FPGA/CPLD设计出符合自己需要的UART芯片。基于FPGA/ CPLD的UART设计在诸多文献中都有论述,在此不再对UART整个功能模块实现做太多的论述。本文着重分析UART接收器起始位的检测。

3倍频采样的缺陷

首先,串行异步通信规定了字符数据的传送格式。每一帧数据由起始位、数据位、奇偶校验位、停止位和线路空闲状态组成,格式如图1所示。一般情况起始位为1 位,数据位为5、6、7或8位、奇偶校验位为1位,停止位为1、1.5或2位。其中的起始位和停止位就是用来实现字符的同步。在空闲状态,传送线为逻辑 “1”状态。数据的传送总是以一个“起始位”开始的,接着是要传送的若干数据位,低位先行,最后是一个“1”状态的“停止位”;那么,当接收器检测到一个 “1”向“0”的跳变时,便视为可能的起始位。起始位被确认后,就知道发送器已开始发送,当接收了已协议好的位数后并接收到字符帧中停止位就是一帧字符数据已发送完毕。这样,接收器就知道发送器何时开始发送数据和何时结束发送数据。

要提高接收器的接收准确性,减少误码率,必须要用比数据波特率高n 倍(n≥1)的速率对数据进行采样。文献2中采用了非常规的3倍频采样方法:用3倍频的波特率对每一位数据进行采样(如图2所示),然后对3次采样结果进行判决。如果3次采样中至少有2次为高电平,则接收这一位数据被判决为高电平,否则,为低电平。

此方法刚开始给人感觉比常规的16倍频采样准确性高,因为每一位数据都进行3取2的判决,而16倍频采样对每位数据只进行一次中间采样。然而笔者在实际应用中发现了其存在抗干扰性差,移植性差等不足。笔者在应用中自定义的异步数据帧长达21位,应用环境是涡轮工作间。在这样条件下,3倍频采样比在良好的实验室环境性能差了很多,误码率很高。

经分析代码,发现3倍频采样方法在检测异步数据起始位没有任何的抗干扰处理。如果在接收线上存在干扰信号,即使是一个很窄负脉冲干扰,接收器也会误判为是数据帧的起始位,从而产生采样时钟进行后续的数据采样。图3所示为存在干扰信号时,检测起始位信号时序仿真波形。图中COLCK3-IN是3倍频采样时钟,CLOCK1-IN是数据波特率,DATAIN是接收线上的数据。从图中看出,干扰信号后,COLCK3-IN时钟产生,接收器接收数据。可见接收到的数据都是错误数据。简单说,文献2中所论述方法不能识别真假数据起始位。再从程序可移植性来说,3倍频采样时钟是用三个数值进行计数判断而得,当波特率改变,其数值都要做相应改变,这就增加了程序的修改难度。

16倍频采样起始位的检测

3倍频采样方法无法识别真假数据起始位,导致其抗干扰性差,准确性得不到保证。笔者抛弃非常规3倍频采样方法,采用了常规的16倍频采样方法:采用数据速率的16倍进行采样,采样时钟连续采样到8个低电平信号,可确定该低电平为真正的起始位,从而防止干扰信号产生的假起始位现象的发生。此后,接收器每隔16个采样时钟采样一次,并把采样到的数据作为输入数据,以移位方式存入到接收移位寄存器。

起始位检测8个连续脉冲的另一个更重要的原因是,采用16倍频采样的时钟,第8个采样脉冲所对应的数据波形正好是该位数据位波形的正中点(以时钟上升沿采样),在该处读写数据应该是最安全点。

在设计时,充分抓住异步数据的特征进行设计:起始位为低电平、停止位为高电平、每帧数据帧结构相同。根据异步数据这些特征就可设计出以下相应程序:

process(clk16x,start) --产生clk1x时钟进程

begin

if start=’0’ then

q<="0001";

elsif clk16x’event and clk16x=’1’

then

q<=q+1;

end if;

end procESS ;

clk1x<=q(3);

process(clk16x,i,serialin,rst) --起始位检测进程

begin

if rst=’1’ then

start<=’0’;

elsif rising_edge(clk16x) then    if serialin=’0’ then

start<=’1’ ;

elsif over=’0’ then

start<=’1’;

else start<=’0’;

end if;

end if;

end process;

process(clk1x,serialin,i,rst) --读数据进程

begin

if rst=’1’ then

buff<= (others => ’1’);

Dout_P<= (others => ’1’);

i<=0;

over<=’1’;

elsif rising_edge(clk1x) then

if i<>

buff21<=serialin;

i<=i+1;

over<=’0’;    else

i<=0;

over<=’1’;

Dout_P<=buff;

end if;

end if;

end process ;

本设计采用VHDL硬件描述语言来进行描述。clk16x为16倍频采样时钟,clk1x是检测到真正起始位后由clk16x时钟分频产生的采样时钟,start为开始接收数据信号(接收数据期间为高电平)、serialin为异步数据输入端口。平常,接收器按clk16x时钟上升采样 serialin。当采样时钟检测到低电平时输出一个高电平给start信号,clk1x分频计数器启动。如果连续采集8个脉冲都为低电平(起始位之半),即确定该低电平为起始位,输出一个低电平给接收数据完信号over(接收数据期间为低电平,接收完数据为高电平),over信号在低电平检测共同作用下保持start为高电平。start长时间保持高电平(8个clk16周期T)产生clk1x时钟。反之判别为假起始位,over仍然为高电平,start却变为低电平,clk1x分频计数器复位,一直等到下次检测serialin为低电平才重新启动。可见,只有确定了起始位,clk1x时钟才会产生,否则不产生。而clk16x时钟始终存在,保证不会错过每次接收线上的数据采样。

结语

按常规的16倍频采样方法接收异步数据,其抗干扰性、移植性等都优于3倍频采样方法。实际应用表明,提高采样倍数,接收准确性相应提高;在一定范围内,提高数据波特率不会影响接收准确性。

UART的16倍频过采样和3倍频过采样相关推荐

  1. c语言ad采样程序思路,单片机AD采样程序及其寄存器讲解

    描述 ad采样的步骤:首先将外部的信号,通过电路或者已有的AD芯片转换成 主CPU能接受的电压 信号.但是此电压信号必须转换成8.10 .12位或更高位数的数字才能进一步做计算.另外转换成位数多少表明 ...

  2. python图像下采样_图像的上采样(upsampling)与下采样(subsampled)

    缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1.使得图像符合显示区域的大小:2.生成对应图像的缩略图. 放大图像(或称为上采样(upsampli ...

  3. 采样开关的作用计算机控制,采样过程

    采样是指用每隔一定时间的信号样值序列来代替原来在时间上连续的信号,也就是在时间上将模拟信号离散化. 把连续信号转换成离散信号的过程称为采样过程(sampling process),这一过程是通过采样开 ...

  4. 过采样与欠采样图像重采样(上采样下采样)

    参考文章: https://blog.csdn.net/majinlei121/article/details/46742339 https://blog.csdn.net/Chaolei3/arti ...

  5. 降采样,过采样,欠采样,子采样,下采样,上采样,你学会了吗?【总结】

    降采样: 2048HZ对信号来说是过采样了,事实上只要信号不混叠就好(满足尼奎斯特采样定理),所以可 以对过采样的信号作抽取,即是所谓的"降采样". 在现场中采样往往受具体条件的限 ...

  6. 降采样,过采样,欠采样,子采样,下采样

    这几天看了一篇将关于降采样,过采样,欠采样,子采样,下采样 的文章,写的挺好的,直接给出链接,文章比较长不贴过来了. http://blog.sina.com.cn/s/blog_4b146a9c01 ...

  7. python实现采样函数_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现

    刘浚嘉:PR:机器人学的概率方法学习路径​zhuanlan.zhihu.com PR 采样分章 第一节:蒙特卡洛采样.重要性采样 引言 还记得我们之前学过的贝叶斯推断吗?刘浚嘉:PR Ⅱ:贝叶斯估计/ ...

  8. c2000 电阻采样_C2000/STM32/Microchip电阻采样方案比较

    最近有时间把TI ST还有Microchip三家关于PMSM控制中使用电阻采样相的电路看了一下,发现各家都有自己的特点,就做个总结吧. 1.TI C2000系列双电阻采样法 ​ 原理说明 在U相和V相 ...

  9. matlab音频信号的采样与重构,信号的采样与重构

    采样定理 模拟信号经过(A/D)变换转换为数字信号的过程称为采样,信号采样后其频谱产生了周期延拓,每隔一个采样频率fs,重复出现一次.为保证采样后信号的频谱形状不失真,采样频率必须大于信号中最高频率成 ...

最新文章

  1. e4a编写文件服务器,e4a教程 联云服务器
  2. Java编程思想——多态
  3. BZOJ 1011: [HNOI2008]遥远的行星
  4. oracle 监控 视图,【转】oracle几个常用的监控视图
  5. [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型
  6. 使用机器学习预测天气_使用机器学习的二手车价格预测
  7. 内存映射处理大文件[转载]
  8. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 无效
  9. emWin—数字软键盘
  10. 微信公众号-网页内实现微信支付
  11. 可以去视频水印的软件 抖音的玩法和技巧图解
  12. 开源软件推荐-TMS运输管理系统 KYTMS
  13. scrapy安装时遇到问题怎么解决
  14. Oracle KEEP的用法
  15. 2021年危险化学品生产单位安全生产管理人员新版试题及危险化学品生产单位安全生产管理人员考试总结
  16. 论体型决定性格以及逗比潜质的遗传性分析
  17. 动态磨砂玻璃渐变背景
  18. 强制删除CAD_无法删除cad
  19. 实验一 顺序与选择结构(Python 头歌)
  20. HBase轻松入门之HBase架构图解析

热门文章

  1. 2021年春季学期-信号与系统-第十五次作业参考答案-第五小题参考答案
  2. 2021年春季学期-信号与系统-第六次作业参考答案-第十一小题
  3. 七分结构三分代码-直立车想节能
  4. 连续举办了十七年的韩国大学生智能车竞赛谢幕了
  5. 通用双谐振固态特斯拉驱动器 UD2.7
  6. 电子小帮手电路中电源开关电路分析
  7. STC单片机自动下载调试器设计
  8. c++气泡框提示_黄骅屋顶隔热气泡膜厂家,机房专用吸音板_德发防火保温建材
  9. 请选择JAVA中有效的标识_Java中有效的标识符是什么?
  10. web 容器 支持 php,web服务器lighttpd 对php的支持