概述
跟着电子规划自动化(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倍频采样办法。实践使用标明,进步采样倍数,接纳准确性相应进步;在必定范围内,进步数据波特率不会影响接纳准确性。