基于带硬件地址识别的UART IP的设计

时间:2011-08-12

  摘 要:随着科学技术快速的发展, 在通信和控制系统中,常使用异步串行通信控制器(UART)实现系统辅助信息的传输也越来越多了。因为计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem.

  UART首先将接收到的并行数据转换成串行数据来传输。消息帧从一个低位起始位开始,后面是7个或8个数据位,一个可用的奇偶位和一个或几个高位停止位。接收器发现开始位时它就知道数据准备发送,并尝试与发送器时钟频率同步。如果选择了奇偶,UART就在数据位后面加上奇偶位。奇偶位可用来帮助错误校验。在接收过程中,UART从消息帧中去掉起始位和结束位,对进来的字节进行奇偶校验,并将数据字节从串行转换成并行。UART也产生额外的信号来指示发送和接收的状态。例如,如果产生一个奇偶错误,UART就置位奇偶标志。其主要特性如下:

  ·全硬件地址识别,过滤数据不需要CPU的介入;支持一个特殊地址,可用于监听和广播。

  ·支持查询和中断两种工作方式,中断可编程。

  ·接收和发送通路分别有128Byte FIFO,每个接收字节附带状态信息。

  ·设计采用Verilog HDL语言,全同步接口,可移植性好。

  ·支持自环测试功能。

  ·波特率可以编程,支持八位或者九位两种数据格式。

  设计的UART的九位串行数据格式如图1所示。在空闲状态,数据线处于高电平状态。总线由高到低跳变,宽度为一个波特率时间的负脉冲为开始位,然后是8bit的数据位。数据位后面是1bit的地址信息位。如果此位是1,表示发送的字节是地址信息;如果此位是0,传输的是正常数据信息。地址指示位后是串行数据的停止位。

  1 UART设计

  UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。可以处理计算机与外部串行设备的同步管理问题。有一些比较的UART还提供输入输出数据的缓冲区,现在比较新的UART是16550,它可以在计算机需要处理数据前在其缓冲区内存储16字节数据,而通常的UART是8250.现在如果您购买一个内置的调制解调器,此调制解调器内部通常就会有16550 UART.

  UART采用模块化、层次化的设计思想,全部设计都采用Verilog HDL实现,其组成框图如图2所示。整个UART IP由串行数据发送模块、串行数据接收模块、接收地址识别模块、接收和发送FIFO、总线接口逻辑、寄存器和控制逻辑构成。串行发送模块和接收完成并/串及串/并的转换,接收地址的识别由接收地址识别模块完成。发送和接收FIFO用于缓存发送和接收的数据。总线接口逻辑用于连接UART IP内部总线和HOST接口。寄存器和控制逻辑实现UART IP内部所有数据的收发、控制和状态寄存器、内部中断的控制及波特率信号的产生。以下详细说明主要部分的设计原理。

  1.1 串行数据发送模块

  串行数据发送模块将数据或地址码由并行转换为串行,并从串行总线输出。设计采用有限状态机实现,分为空闲、取数、发送三个状态。其状态迁移如图3所示。各个状态说明如下:

  空闲状态:状态机不断检测发送使能位、UART使能位和发送FIFO空/满标志位,如果使能位为高、UART使能打开且FIFO空标志位为低,串行发送进入取数状态。

  取数状态:在此状态,分两个周期从发送FIFO中取出待发送的数据或者地址,然后进入发送状态。

  发送状态:在此状态,状态机按照九位串行数据的格式依次发送开始位、数据位、地址指示位。待停止位发送完毕后,返回空闲状态。

  1.2 串行数据接收模块

  串行数据接收模块用于检测串行数据的开始位,将串行总线上的串行数据转换成并行数据并输出。接收逻辑也采用有限状态机实现,分为空闲状态、寻找开始位、接收数据和保存数据四个状态。其状态迁移图如图4所示。各个状态说明如下:

  空闲状态:在此状态,不断检测接收使能、UART使能和串行输入信号的状态。如果串行输入信号出现由高到低的电平变化且UART使能和接收使能都为高,则将采样计数器复位,并进入寻找开始位状态。

  寻找开始位:在此状态,状态机等待半个波特率的时间,然后重新检测串行输入的电平。如果为低,则判断收到的开始位有效,进入接收数据状态;否则认为数据总线上出现干扰,开始位无效,重新返回空闲状态。

  接收数据:在此状态,依次接收串行数据线上的数据位、地址指示位和停止位,结束后进入保存数据状态。

  保存数据:此状态将收到的串行数据以并行方式从接口的并行总线输出,然后返回空闲状态,准备进行下一个字节数据的搜索和接收。

  为提高对串行输入上突发干扰的抵抗能力,对于接收数据,在脉冲的中间位置连续采样三次,较多的电平作为接收的有效数据。所有接收数据的采样频率为接收波特率的16倍。

  1.3  硬件地址识别模块

  硬件地址识别模块用于从接收到的数据中判断出地址和数据,在地址识别功能打开时,选择数据通过或者丢弃;而该功能关闭时,所有数据都会通过。其状态迁移图如图5所示。状态说明如下:

  地址状态:在此状态时,判断接收到的数据以及地址识别使能位。如果地址识别功能没有打开,对于接收的任何地址,都进入数据状态。如果地址识别功能打开,则将收到的地址和本地地址比较,如果相等,则保存此地址,进入数据状态;否则继续在此状态接收数据和地址,将收到的数据忽略。

  数据状态:将接收到的数据输出,直到收到地址位时,返回地址状态,处理地址。

  为实现监听和广播功能,将地址255作为特殊地址,它可以和任何地址匹配。若本站的地址为255,此站点可以接收任何地址的数据,此功能可以用于监听总线上的数据;若发送数据的目的地址为255,则任何站点都会接收到此数据,此功能可以用于发送广播数据。

  1.4  FIFO设计

  FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。

  FIFO由控制逻辑和双口RAM组成,控制逻辑用来实现将一个双口RAM转换成两个FIFO的功能,这两个FIFO分别用于发送和接收数据缓存;中断控制用于在中断工作方式时管理UART内部的中断状态和控制信息。

  为减少所需块RAM的数量,接收和发送FIFO使用同一个块RAM实现,使用仲裁机制保证两个FIFO的四个端口,在同一时刻多只有两个操作,不影响对FIFO的读写。

  FIFO设计的难点在于怎样判断FIFO的空/满状态。为了保证数据正确的写入或读出,而不发生溢出或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。在空的状态下不能进行读操作。怎样判断FIFO的满/空就成了FIFO设计的问题。由于同步FIFO几乎很少用到,这里只描述异步FIFO的空/满标志产生问题。

  在用到触发器的设计中,不可避免的会遇到亚稳态的问题(关于亚稳态这里不作介绍,可查看相关资料)。在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到。其中的一个方法就是使用格雷码。格雷码在相邻的两个码元之间只有一位变换(二进制码在很多情况下是很多码元在同时变化)。这就会避免计数器与时钟同步的时候发生亚稳态现象。但是格雷码有个缺点就是只能定义2^n的深度,而不能像二进制码那样随意的定义FIFO的深度,因为格雷码必须循环一个2^n,否则就不能保证两个相邻码元之间相差一位的条件,因此也就不是真正的各雷码了。第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为P,那么两个及联的触发器发生亚稳态的概率就为P的平方。

  1.5  总线接口

  UART采用同步接口,所有信号都在系统时钟的上升沿采样,设备的握手用一位应答信号完成。

  数据总线宽度采用8+2的方式。和16位或者32位宽度的数据总线连接时,可以读取接收数据的数据和地址指示位,减少总线操作次数;若和8位系统连接,可以只连接低8位数据线,接收数据的地址信息可以通过内部的状态寄存器读取。

  1.6  寄存器和控制逻辑

  寄存器部分实现UART内部所有数据的收发、控制和状态寄存,用于设置UART的数据格式、收发波特率、FIFO控制、本地地址、地址识别、中断控制和状态寄存,实现对UART工作的控制。

  控制逻辑产生所需的所有波特率信号及对应的上升和下降沿指示信号,并根据实际工作所选择的波特率输出与系统时钟同步的对应信号。波特率产生逻辑的组成框图如图6所示。

  2  功能和时序仿真

  首先结合功能仿真设计系统的仿真平台。仿真平台如图7所示。系统仿真平台和仿真激励采用Verilog HDL语言设计,可同时用于功能仿真和时序仿真,不能用于二者的综合。寄存器级模型为用于UART IP设计的RTL描述,全部采用可以综合的Verilog HDL语句编写。仿真使用的软件为ModelSim.

  功能仿真包括以下几个方面:

  (1)基本模块连线时序的仿真。首先用描述方式设计UART的接口模型,利用仿真激励进行简单的读写操作,设计出仿真激励信号和系统仿真平台。然后结合仿真激励信号逐步完成UART的各个子模块的设计。仿真时,需要逐步观察UART接口信号的波形、UART内部模块的接口信号波形、各种状态机的状态迁移和数据指针的值以及状态位的值,逐步完成寄存器传输级的UART设计。

  (2)UART的工作仿真。完成RTL的寄存器传输级模型后,根据系统软件工作的模式,用HDL设计出数据收发的仿真激励,打开自环功能,进行数据的发送和接收。仿真可以分为仿真查询和中断两种工作方式。对于中断工作方式,需要用HDL语言模拟软件的中断机制,进行中断工作方式的仿真。打开地址识别功能,发送不同目的地址的数据,观察UART的硬件地址识别情况。

  完成功能仿真后,将设计进行布局布线,生成Verilog HDL形式的时序仿真模型和标准时延文件,利用与功能仿真相同的仿真平台进行时序仿真。时序仿真只需要仿真工作方式。功能仿真和时序仿真使用相同的仿真平台和激励向量,这样便于比较二者的差异,发现设计代码存在的问题。

  3 综合和测试结果

  本设计用Synplicity公司的Synplify Pro作为综合工具,用Xilinx ISE5.2作为布局布线工具,采用器件为XC2S100IIE-7.综合结果显示,该UART IP占用资源情况为:SLICE 275个、内部块RAM 1个、I/O 24个,HOST总线可以达到的频率为73.2MHz.

  测试程序参考仿真激励的生成,用C语言在vxWorks操作系统下设计。测试所用方法和工作仿真完全相同,只是仿真激励对应测试程序,而RTL模型对应实际的FPGA器件。

  多点测试使用了五块单板,采用半双工总线方式,定义简单的数据包格式,用于检测数据错误并返回数据。数据包的格式为地址开头,后面是255Byte的数据;数据部分包括发送方的地址、数据校验和及包的长度。另外,还定义简单的驱动程序格式,完成基本数据的收发和控制,然后在上层加载多点通信协议。其中的一块加载主设备程序,其它单板加载从设备程序。主设备周期性地向其它从设备发送测试数据,并在规定的时间内等待接收目标单板的数据。从设备软件只接收发给本单板的数据,如果校验正确,将收到的数据发给主设备;如果有错误,则不进行任何操作。主设备若在规定时间内无法接收从设备的数据或者接收数据错误,则判断通信异常,进行下一个设备的测试。

  测试时,数据包长为240Byte,波特率为115200.常温和高低温环境下的测试结果表明,UART IP工作稳定可靠,达到了设计要求。

  本UART IP全部采用Verilog HDL设计,可以在采用FPGA实现的通讯和控制系统中作为系统多点通讯控制器,也可以用于片上系统(SoC)的设计。用于多点通信时,可以有效降低CPU的额外负担,提高CPU系统的利用率。由于采用语言描述,移植性强,可以用于不同厂家、不同型号的FPGA芯片中,提高了系统的设计速度和效率。


  

参考文献:

[1]. 1bit datasheet https://www.dzsc.com/datasheet/1bit_2178090.html.


上一篇:浅谈基于DDS和FPGA技术的高动态扩频信号源
下一篇:一种高、低成本A/D转换器的设计和实现

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料