利用VHDL实现异步通信起始位正确检测
摘要: 基于FPGA/CPLD的UART设计众多,本文分析了3倍频采样方法存在的不足,同时分 析了16倍频采样对起始位检测的可靠性,并给出相关的VHDL硬件描述语言程序代码。
关健词: 异步数据;UART;FPGA/CPLD;VHDL
概述
随着电子设计自动化(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”的跳变时,便视为可能的起始位。起始位被确认后,就知道发送器已开始发送,当接收了已协议好的位数后并接收到字符帧中停止位就是一帧字符 数据已发送完毕。这样,接收器就知道发送器何时开始发送数据和何时结束发送数据。
图1 异步通信字符帧格式
要提高接收器的接收准确性,减少误码率,必须要用比数据波特率高n 倍(n≥1)的速率对数据进行采样。文献2中采用了非常规的3倍频采样方法:用3倍频的波特率对每一位数据进行采样(如图2所示),然后对3次采样结果进 行判决。如果3次采样中至少有2次为高电平,则接收这一位数据被判决为高电平,否则,为低电平。
图2 3倍频采样时序图
此方法刚开始给人感觉比常规的16倍频采样准确性高,因为每一位数据都进行3取2的判决,而16倍频采样对每位数据只进行一次中间采样。然而笔者在实 际应用中发现了其存在抗干扰性差,移植性差等不足。笔者在应用中自定义的异步数据帧长达21位,应用环境是涡轮工作间。在这样条件下,3倍频采样比在良好 的实验室环境性能差了很多,误码率很高。
经分析代码,发现3倍频采样方法在检测异步数据起始位没有任何的抗干扰处理。如果在接收线上存在干扰信号,即使是一个很窄负脉冲干扰,接收器也会误判 为是数据帧的起始位,从而产生采样时钟进行后续的数据采样。图3所示为存在干扰信号时,检测起始位信号时序仿真波形。图中COLCK3-IN是3倍频采样 时钟,CLOCK1-IN是数据波特率,DATAIN是接收线上的数据。从图中看出,干扰信号后,COLCK3-IN时钟产生,接收器接收数据。可见接收 到的数据都是错误数据。简单说,文献2中所论述方法不能识别真假数据起始位。再从程序可移植性来说,3倍频采样时钟是用三个数值进行计数判断而得,当波特 率改变,其数值都要做相应改变,这就增加了程序的修改难度。
图3 存在干扰信号时3倍频采样时序图
16倍频采样起始位的检测
3倍频采样方法无法识别真假数据起始位,导致其抗干扰性差,准确性得不到保证。笔者抛弃非常规3倍频采样方法,采用了常规的16倍频采样方法:采用数 据速率的16倍进行采样,采样时钟连续采样到8个低电平信号,可确定该低电平为真正的起始位,从而防止干扰信号产生的假起始位现象的发生。此后,接收器每 隔16个采样时钟采样一次,并把采样到的数据作为输入数据,以移位方式存入到接收移位寄存器。16倍频对接收线的采样关系如图4所示。
图4 UART对数据的采样
起始位检测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< p>
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时钟始终存在,保证不会错过每次接收线上的数据采样。
图5所示为接收信号时序仿真波形。从图中可以清楚看到clk1x的上升沿都对准了每个数据的中间。图6是存在干扰信号起始位检测时序仿真波形。从图中 看到干扰信号后,没有产生clk1x时钟,接收器不接收数据。当真正检测到起始位,产生clk1x时钟,接收器开始接收数据。改变数据波特率, clk1x计数值不用改变,只要改变clk16x的分频计数器的计数值就可以了。对于自定义的异步数据,只要是起始位是低电平,停止位是高电平,改变 length的值就可以接收不同位数数据。可见以上代码容易移植。笔者在应用中自定义21位异步数据验证了其性能优越:无误码率高,抗干扰性强。
图5 16倍频采样时序图
图6 16倍频采样时序图(有干扰信号)
结语
按常规的16倍频采样方法接收异步数据,其抗干扰性、移植性等都优于3倍频采样方法。实际应用表明,提高采样倍数,接收准确性相应提高;在一定范围 内,提高数据波特率不会影响接收准确性。
参考文献:
1. 朱明程、孙普译,可编程逻辑系统的VHDL设计技术,东南大学出版社
2. 李刚强,基于VHDL的异步串行通信电路设计,电子开发网
3. 电子设计论坛:www.64134703.com
关健词: 异步数据;UART;FPGA/CPLD;VHDL
概述
随着电子设计自动化(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”的跳变时,便视为可能的起始位。起始位被确认后,就知道发送器已开始发送,当接收了已协议好的位数后并接收到字符帧中停止位就是一帧字符 数据已发送完毕。这样,接收器就知道发送器何时开始发送数据和何时结束发送数据。
图1 异步通信字符帧格式
要提高接收器的接收准确性,减少误码率,必须要用比数据波特率高n 倍(n≥1)的速率对数据进行采样。文献2中采用了非常规的3倍频采样方法:用3倍频的波特率对每一位数据进行采样(如图2所示),然后对3次采样结果进 行判决。如果3次采样中至少有2次为高电平,则接收这一位数据被判决为高电平,否则,为低电平。
图2 3倍频采样时序图
此方法刚开始给人感觉比常规的16倍频采样准确性高,因为每一位数据都进行3取2的判决,而16倍频采样对每位数据只进行一次中间采样。然而笔者在实 际应用中发现了其存在抗干扰性差,移植性差等不足。笔者在应用中自定义的异步数据帧长达21位,应用环境是涡轮工作间。在这样条件下,3倍频采样比在良好 的实验室环境性能差了很多,误码率很高。
经分析代码,发现3倍频采样方法在检测异步数据起始位没有任何的抗干扰处理。如果在接收线上存在干扰信号,即使是一个很窄负脉冲干扰,接收器也会误判 为是数据帧的起始位,从而产生采样时钟进行后续的数据采样。图3所示为存在干扰信号时,检测起始位信号时序仿真波形。图中COLCK3-IN是3倍频采样 时钟,CLOCK1-IN是数据波特率,DATAIN是接收线上的数据。从图中看出,干扰信号后,COLCK3-IN时钟产生,接收器接收数据。可见接收 到的数据都是错误数据。简单说,文献2中所论述方法不能识别真假数据起始位。再从程序可移植性来说,3倍频采样时钟是用三个数值进行计数判断而得,当波特 率改变,其数值都要做相应改变,这就增加了程序的修改难度。
图3 存在干扰信号时3倍频采样时序图
16倍频采样起始位的检测
3倍频采样方法无法识别真假数据起始位,导致其抗干扰性差,准确性得不到保证。笔者抛弃非常规3倍频采样方法,采用了常规的16倍频采样方法:采用数 据速率的16倍进行采样,采样时钟连续采样到8个低电平信号,可确定该低电平为真正的起始位,从而防止干扰信号产生的假起始位现象的发生。此后,接收器每 隔16个采样时钟采样一次,并把采样到的数据作为输入数据,以移位方式存入到接收移位寄存器。16倍频对接收线的采样关系如图4所示。
图4 UART对数据的采样
起始位检测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< p>
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时钟始终存在,保证不会错过每次接收线上的数据采样。
图5所示为接收信号时序仿真波形。从图中可以清楚看到clk1x的上升沿都对准了每个数据的中间。图6是存在干扰信号起始位检测时序仿真波形。从图中 看到干扰信号后,没有产生clk1x时钟,接收器不接收数据。当真正检测到起始位,产生clk1x时钟,接收器开始接收数据。改变数据波特率, clk1x计数值不用改变,只要改变clk16x的分频计数器的计数值就可以了。对于自定义的异步数据,只要是起始位是低电平,停止位是高电平,改变 length的值就可以接收不同位数数据。可见以上代码容易移植。笔者在应用中自定义21位异步数据验证了其性能优越:无误码率高,抗干扰性强。
图5 16倍频采样时序图
图6 16倍频采样时序图(有干扰信号)
结语
按常规的16倍频采样方法接收异步数据,其抗干扰性、移植性等都优于3倍频采样方法。实际应用表明,提高采样倍数,接收准确性相应提高;在一定范围 内,提高数据波特率不会影响接收准确性。
参考文献:
1. 朱明程、孙普译,可编程逻辑系统的VHDL设计技术,东南大学出版社
2. 李刚强,基于VHDL的异步串行通信电路设计,电子开发网
3. 电子设计论坛:www.64134703.com