UART自动验证平台

发布时间:2014-12-16 14:59    发布者:designapp
关键词: UART , 通用异步收发器 , 寄存器

        通用异步收发器(UART)是将数据从一个系统发送到另一个系统的最简单方法。UART通常集成在微控制器中,而且很多现代的IC都包含一个也可以同步通信的UART,称为通用同步/异步收发器(USART)。
UART除了在系统中被广泛使用以外,它还是测试接口是否符合相关标准的必要工具。下面的测试内容通常在待测器件(DUT)的UART 硬件/IP上执行,并且采用不同的波特率、数据、奇偶校验和停止位宽度。

1. 基本回环测试
2. 标准UART发送与接收测试
3. 奇偶校验和成帧误差条件
4. 具有LSB/MSB首选项的UART发送与接收
5. 时序容差测试
除基本回环测试外,其它几种情况都需要专门的验证平台来检查DUT是否兼容于标准的UART接口。并没有现成可用的这种平台。公司在测试UART设计时通常制作定制的验证套件,进行手动测试,或者使用市场上的标准接口IC或USB-UART桥接器。但是,这些方法的测试范围很有限。
本文介绍一种通用的UART自动验证平台,可用于自动测试UART接口的所有方面。
一、标准的UART帧
图1给出一个标准的UART帧,并解释了其中的所有字段。该帧的定义是在考虑了市场上不同的UART规范后而制定的。因此可以肯定地说,以下结构覆盖了所有可能的UART数据帧组合。


图1:通用UART帧


从图1中可以看到,起始位(低位,1位长度)不会因UART版本的不同而变化。帧的其它字段长度可根据具体应用而变化。器件可支持每数据包的数据位宽度最低为4位,最高是9位。在特定情况下,当设计需要时数据宽度可采用任意值,以保持其它参数的兼容性,但不一定兼容于标准的UART接口。当需要错误校验时应加入奇偶校验位,而其它情况下可在数据包中省去该字段。由于这是单个位奇偶校验,因此在接收器处最多识别单个位错误。停止位(高位,直到下个数据包开始)会有不同,取决于接收器接收下个数据包的速度有多快,最快的接收器最低是1位,而最慢的接收器最低是4位。

本文下一页:UART验证平台




       

二、平台
稳健的UART验证平台必须测试通信接口的所有特性。为此,平台需要能够自动处理所有可能的UART参数组合。目前UART验证测试采用手动测试,需要在整个测试过程中使用专用资源,而且由于是手动测试,会消耗大量时间。这时可采用能够处理重复测试的UART自动验证平台实现流程的自动化,以减少测试工作。
我们可以看到标准的现成工具无法支持其中的多种特性,例如4位和9位数据宽度,或2.5位至4.0位停止宽度。因此,需要一种可支持全部甚至更多特性的全新验证平台。另一个要求则是实现测试的自动化,这可以减少对DUT执行测试时的手动工作。
本文描述的UART自动验证平台可支持如下配置:
1. 波特率(bps):50、110、300、600、1200、2400、4800、9600、19200、28800、38400、57600、115200、230400、460800、921600
2. 数据宽度(位):1、2、3、4、5、6、7、8、9、10
3. 奇偶校验位:无、奇数、偶数
4. 停止位宽度:1.0、1.5、2.0、2.5、3.0、3.5、4.0
5. TX缓冲器:16帧
6. RX缓冲器:16帧



图2:UART自动验证平台


图2 给出了包含UART自动验证平台所有主要模块的高级系统视图:
1. 测试控制器:验证平台的核心。这是一个用来收集、处理数据,并在系统中其它模块之间转发数据的MCU。它应该具有一个USB接口,从而与主计算机进行通信。
2. 发送与接收FIFO:需要发送的数据帧存储在发送FIFO中,从DUT接收到的数据帧则存储在接收FIFO中。MCU从主机收集发送数据包,将其转换为数据帧,并载入到发送FIFO中。接收FIFO负责转发从DUT收集的帧,将其转到测试控制器进行数据包转换,并转发至主机。数据包缓存是提高系统速度的有效方案。
FIFO通常在MCU的SRAM中实现。这种实现方案仅支持16帧的发送或接收会话。可根据特定要求提高这一数字,但要受限于所用的SRAM。
3. 移位寄存器(并行到串行和串行到并行转换器):UART可采用移位寄存器来实现。在发送比特位时,它可作为并行到串行转换器,在接收时另一个移位寄存器变成串行到并行转换器。两个寄存器都以双倍或多倍波特率频率计时。
待发送的数据包已被转换为帧比特并送入FIFO。帧数据被加载到发送移位寄存器中,并以正确的波特率发送到DUT。采用类似的方案从DUT接收数据包。对接收到的帧以双倍波特率(或更多)进行采样,一旦整个数据包进入接收移位寄存器中,帧比特位就会被转移到接收FIFO中。
4. PLL和波特率生成器:PLL模块使用外部11.0592MHz晶体振荡器生成供所有其它模块使用的时钟频率。PLL使输入模块乘以系数5,以生成55.296MHz的主时钟频率。由于所有模块都采用相同的时钟源工作,因此不必使用额外的逻辑来同步模块。
选择外部振荡器生成通用UART应用所需的精确波特率。可对11.0592MHz时钟源进行分频,从而为移位寄存器提供标准的波特率时钟。波特率生成器作用就在于此。这里采用数字PWM时钟生成波特率时钟。通过改变PWM的周期和比较参数可生成占空比为50%的波特时钟。占空比可变是使用PWM模块的另一个优势,相比之下时钟分频器只能生成固定占空比的时钟输出。可变的占空比可用来验证UART接口的时钟容差和输出保真度。
5. 控制寄存器:所有参数和设置都保存在8位寄存器中。测试控制器的SRAM可用来实现该目的。主计算机通过用来访问FIFO的相同接口读取和写入寄存器。为该平台提供如下寄存器
  a.控制:使用该寄存器传送即时命令。寄存器的MSB可用来通知测试控制器有新的命令进入寄存器。命令执行后该位被清空。所支持的命令及相应的值如下所示。






  b.状态:测试控制器使用该寄存器发布当前测试的结果,包括传输时的错误条件。






  c.波特率:该寄存器控制下次数据传输使用的波特率。所支持的波特率及其数值显示如下。





  d.数据宽度:该寄存器控制下次数据传输使用的数据宽度。所支持的数值为0x01至0x0A(10个值)。
  e.校验位:使用该寄存器设置校验位。可以是无校验,奇数校验或偶数校验,如下所示。





  f.停止宽度:该寄存器规定每个帧使用的停止宽度。所支持的停止宽度如下所示。





  g.过采样率:发送和接收帧所需的过采样数量使用该寄存器进行设定。逻辑复杂程度随所需的过采样率增加而增加。最小值是2。
  h.TX大小:该寄存器保留FIFO中发送帧的数量。此值既可在发送FIFO加载数据后手动设置,也可在FIFO加载后自动加载。最大值是16,最小值是1。
  i.RX大小:该寄存器保留FIFO中接收帧的数量。当接收到一个数据帧时,寄存器中的这个值增加1,当主机从FIFO中读取一个帧时,该值减去1。最大值是16,最小值是1。
6. DUT控制与状态信号:需要将以上参数送到DUT。这个模块从控制寄存器获取参数,并推送到DUT。使用并行接口向DUT报告当前设置。此外,平台具有一个控制信号“START”,用于断言该信号可初始化DUT。若DUT应用了平台的设置,并做好测试的准备工作,就会将另一个信号断言为“READY”。
7. 主计算机:主计算机执行测试用的Perl脚本,通过USB端口与平台进行通信。所有测试案例都实现为Perl脚本,其可生成覆盖验证过程的测试序列。此外,主计算机还收集用来检查测试是否通过的相关数据。该信息连同测试案例都被写入文件,以便记录。
8. 待测器件(DUT):测试带UART接口的目标器件。
从方框图及其描述中可以看到,平台使用移位寄存器来实现UART接口。这种方案的优势在于可通过增加移位寄存器的大小来实现扩展性。

本文下一页:帧验证模块及UART验证模块





       

三、帧验证模块
使用移位寄存器和FIFO实现UART接口其实并不容易,除非有一个用来识别有效帧的逻辑,用于解码接收到的数据。由下降沿检测器控制的简单计数器/定时器能实现此目的。
UART传输开始于下降沿,并在固定的时间内保持有效。如果我们已知波特率和UART数据包设置,可利用设定到该时钟频率的定时器来计算数据包的有效时长。这样便可在有效期间内精确地启动移位寄存器以便计入接收线路上看到的数据或者记出发送数据。
该逻辑的状态机实现方案如图3所示。有两个流程:一个流程控制移位寄存器使能输入,另一个用来保持定时器。



图3:帧验证状态机


状态机可用图4中的模块表示。状态机工作所需的模块输入和输出也在下面予以解释。



图4:帧验证模块


a. CLK_IN(输入):此为主时钟。该时钟的频率远高于波特时钟。使用该时钟采样和检测START输入的下降沿。
b. BAUD_CLK(输入):波特时钟频率乘以过采样率。此时钟输入的最小值是波特频率的两倍。
c. START(输入):该输入的下降沿代表状态机的开始。
d. COUNT(输入):8位帧宽度,用于初始化倒计时定时器周期。
e. FRAME_VALID(输出):该输出信号在START输入的下降沿变高,当计数器结束时变低。
f. IRQ(输出): 该输出的上升沿代表帧结束。当计数器计数结束时,该信号在一个主时钟周期内保持高电平。当状态机返回空闲状态时,值复位为 ‘0’。
四、UART验证模块
我们已经有了用来检测帧的开始和长度的逻辑模块,现在可以开始设计UART验证模块。对于接收帧验证模块,START输入就是RX线路本身。由于帧发送在我们的控制之下,因此进入帧验证模块(FVB) 的START输入来自单位寄存器。图5给出了完整的UART验证模块。



图5:UART验证方框图


由于发送和接收数据包的宽度相同,因此计数寄存器可由TX和RX帧验证模块共享。来自这两个模块的帧验证信号可作为各自部分移位寄存器的使能信号。前面已经介绍过,发送部分使用并行到串行转换器,而接收部分使用串行到并行转换器。这两个转换器都能访问存储单个帧的32位存储单元,并具有左移功能。两个寄存器在初始化过程中都被置为‘1’s。但只有位的“计数”数值有效。
UART验证模块随后连接到输入、输出和其它顶层模块,如图6所示。这是图2所示的系统级方框图的另一个视角。


图6:UART验证


UART验证模块的波特时钟采用PWM单元生成。它作为分频器使用,用来从固定的11.0592MHz输入时钟生成所需的时钟频率。PWM单元的输出频率由所需的波特率和验证模块的过采样率决定。通过改变PWM单元的周期和比较值来生成要求的时钟频率。该模块还可用来生成时钟抖动和可变的占空比时钟,用于验证DUT对波特率变化的容差。验证平台的这个功能可模拟所有可能的实际情景。
验证模块的中断请求(IRQ)输出与两个软件中断服务程序(ISR)有关 – 一个用于发送,一个用于接收。这两个ISR可用来处理发送和接收FIFO。帧发送结束时,调用发送ISR将下个帧从FIFO加载到发送移位寄存器。类似地,当接收数据帧时,接收IRQ从接收移位寄存器获取内容并将数据推送到接收FIFO中。
图7给出了接收事件的典型时序图,图8给出了发送事件的时序图。两个阶段涉及的所有信号也都包含在图中。这种情况都假设UART数据包包含8位数据,无校验位,有1.5位停止宽度。同样,为了简化,将过采样率设为2,即波特时钟是实际波特率频率的两倍。寄存器内容中的有效帧数据被标成黄色,原因在于为了填充32位移位寄存器,有些数据在初始化过程中被置为‘1’s。



图7:接收数据包



图8:发送数据包


本文下一页:硬件实现

本文下一页:固件及软件




       
五、固件

利用固件在微控制器(MCU)中实现简单的存储、处理和转发架构。其它功能则在硬件中实现,并由MCU进行访问控制。MCU从主机接收需处理的命令和数据。它将待发送的帧和从DUT接收的帧存储在SDRM中实现的FIFO内。用来处理发送和接收数据包的中断服务程序(ISR)通过通用IRQ在MCU中实现。图9的流程图给出了基本流程。



图9:基本固件流程


六、软件
这部分平台运行在Windows PC上,采用Perl脚本语言。平台所需的USB接口库是针对Perl进行重用的标准USB库。在硬件驱动器层上编写一个UART验证库,以支持与平台之间的通信。
UART验证库支持如下API。
a. Platform_Start():必须在执行任何操作前调用;启动接口。
b. Platform_Stop():必须在退出主脚本之前调用;停止接口,并显示最后的通信错误信息(如果有)。
c. Platform_GetSupportedBaud():返回支持的波特率列表。
d. Platform_ReportError($_):设置错误值,用于确定最后的错误。
e. Platform_CheckPassFail($_):如果输入是1,通过;否则失败。
f. Platform_COMMAND($_):从支持列表中向平台发送一个命令。
g. Platform_WriteConfig():将整个数据包从脚本发送至MCU。发送配置之前应使用额外的API设置参数。
h. Platform_ReadConfig():显示来自MCU的当前配置。
i. Platform_CopyConfig():将MCU配置复制到本地脚本缓冲器。并显示被复制的值。
j. Platform_SetBaudRate($_):在本地缓冲器中设置波特率数值;直到调用Platform_WriteConfig()时,才能将该值发送到MCU。
k. Platform_SetDataWidth($_):在本地缓冲器设置数据宽度值;直到调用Platform_WriteConfig()时,才能将该值发送到MCU。
l. Platform_SetParityBit($_):在本地缓冲器中设置校验位值;直到调用Platform_WriteConfig()时,才能将该值发送到MCU。
m. Platform_SetStopWidth($_):在本地缓冲器中设置停止宽度值;直到调用Platform_WriteConfig()时,才能将该值发送到MCU。
n. Platform_SetOverSampleRate($_):在本地缓冲器中设置过采样值;直到调用Platform_WriteConfig()时,才能将该值发送到MCU。
o. Platform_SetTXSize($_):设置一次会话中发送帧的数量;直到调用Platform_WriteConfig()时,才能将该值发送到MCU。
p. Platform_GetRXSize($_):返回RX缓冲器中帧的数量。
q. Platform_SetRXSize($_):在本地缓冲器中设置从PSoC3 RX缓冲器中读取的值的数量;直到调用Platform_WriteConfig()时,才能将该值发送到MCU。
r. Platform_SetTXDataArray(@_):设置一个会话中要发送的数据帧。这个API会覆盖利用Platform_SetTXSize($_) API设置的值(如果有);直到调用Platform_WriteConfig()时,才能将该值发送到MCU。
s. Platform_IsDUTReady():如果DUT空闲,返回1;如果DUT被占用,返回0。

本文下一页:硬件实现





       

七、硬件实现
实现UART自动验证平台所需的大部分逻辑都是通过各种类型的模块在硬件中实现。为实现该平台的硬件部分,我们需要如下组件:
1. 32位微控制器(MCU) – 1个
2. 用于倍增频率的PLL – 1个
3. 用于生成波特频率的PWM单元– 1个
4. 32位移位寄存器– 2个
5. 用于帧验证模块状态机的CPLDFPGA – 1个,具有足够单元
即使我们使用单个硬件单元实现所有模块,每个模块的通信和同步仍需很大量工作。如果我们能够将所有硬件在单个处理器上实现,该平台就会简单得多,例如使用赛普拉斯半导体的可编程片上系统(PSoC),这是微控制器(MCU)、可编程模拟、可编程数字和可编程互联的完美组合。像PsoC这样的集成型处理器还包含很多常用的固定功能块,例如PWM、移位寄存器、Opamp、ADCDAC。该处理器系列通常包含8位器件(例如PSoC 1和PSoC 3)以及32位处理器(例如PSoC 4、PSoC 5和PSoC 5LP),使开发人员能够根据应用选择所需的处理能力。片上系统器件还支持内部Flash、SRAM和EEPROM,以及复杂的时钟树和可编程时钟生成器。另外,还提供多种通信接口,例如USB 2.0、I2C、UART、SPI、I2S、LIN和CAN。
带可编程逻辑的SoC支持UART自动验证平台的更多内容能够在硬件(而非软件)中实现。例如,PsoC具有一个名为通用数字模块(UDB)的可编程逻辑阵列。PSoC 3/PSoC 5/PSoC 5LP共有24个UDB,每个包含8个宏单元、PLA(可执行16个乘积项)、1个数据路径单元、1个控制单元和1个状态单元。这意味着这个系列的PsoC能够媲美中高端的Altera MAXV 系列CPLD和Xilinx Cool Runner系列。
PsoC器件的编程和调试可通过PSoC Creator 来执行,这是一种基于分层原理图的设计工具,能利用预制组件和原语函数的加载库来帮助设计人员完成系统级设计方案。这给予了开发人员足够的灵活性,使其可以融入模拟和数字材料清单,同时通过简单的固件升级实现最后一分钟的设计变更。具有多个通信接口的引导加载器亦能实现简单直接的现场升级。

实现方案采用PSoC 5LP,该器件具有32位ARM Cortex M3内核、USB 2.0接口、可编程时钟/PLL、硬件PWM、24单元UDB、32位移位寄存器以及高度可配置的通用IO。图10给出了PSoC 5LP的简化方框图。


图10:PSoC 5LP器件的简化方框图


组件的固件位于PSoC 5LP中,包含两个部分:一个是针对数字/模拟模块的原理图输入,另一个是在ARM Cortex M3 MCU上运行的胶合逻辑。固件的原理图输入如图11所示,图中给出了波特率PWM、32位移位寄存器,以及发送和接收部分的帧验证模块。



图11:PSoC 5LP固件的原理图输入


设计采用如下主要组件:
a. Baud_PWM:生成一个是所选波特率两倍的时钟。这样能确保数据的正确采样。
b. ShiftReg_TX:32位移位寄存器,用以将TX帧移出到DUT。
c. ShiftReg_RX:32位移位寄存器,用以从DUT移入RX帧。
d. UART_Counter_TX:递减计数器,为TX移位寄存器生成时钟输入,整个帧宽度内有效。
e. UART_Counter_RX:与UART_Counter_TX在设计上相同,为RX移位寄存器生成输入时钟。
f. Start_TX:控制寄存器,指示来自固件的TX帧的开始。
g. FrameWidth:计数器的输入,指示预期的帧宽度,考虑双倍采样率。
h. tx_irq:上升沿标志TX帧的移出已完成。
i. rx_irq:上升沿标志RX帧的移入已完成。
j. StartTest:用来标志在设置控制线之后,对DUT测试的开始。
k. Ready_IRQ:在来自DUT的上升沿进行触发,以指明测试状态就绪。
l. 其他IO组件:将控制信号发送到DUT,以便在测试开始前对其进行配置。
UART_Counter_TX和UART_Counter_RX是Verilog语言的定制组件,位于PSoC 5LP的UDB中。它可用来实现之前介绍的帧验证状态机。



图12:针对PSoC 5LP用Verilog实现的帧验证组件


这样就可成功实现针对UART的自动验证平台,用以测试不同参数间的接口,例如波特率(高达921600波特)、数据宽度(最大9位)、校验和停止宽度(最大4位)。该平台有助于利用单芯片解决方案执行UART接口验证所需的所有测试,从而降低设计复杂性以及出现时序相关问题的几率。UART自动验证平台能减少整个测试期间的手动工作量和对专用资源的要求。

参考资料
[1] AN82250 – PSoC? 3、PSoC 4和PSoC 5LP采用Verilog实现可编程逻辑设计(http://www.cypress.com/?rID=69773)
[2] AN62510 –采用PSoC? 3、PSoC 4和PSoC 5LP实现状态机(http://www.cypress.com/?rID=44402)
[3] AN60631 - PSoC? 3和PSoC 5LP时钟资源(http://www.cypress.com/?rID=40990)
[4] AN82072 – 采用标准OS驱动器的PSoC? 3和PSoC 5LP USB 通用数据传输(http://www.cypress.com/?rID=70131)



本文地址:https://www.eechina.com/thread-135599-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

相关在线工具

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表