摘要:在工业控制中如何提高一对多的串口通讯可靠性和系统的集成性成为研究热点。本文利用嵌入式技术,提出基于CPLD/FPGA的多串口扩展设计方案。实现并行口到多个全双工异步通讯口之间的转换,并根据嵌入式系统实时性的需要,在每个UART接收器中开辟了8个接收缓冲单元,实现高速嵌入式CPU与RS232通讯设备之间的速度匹配,同时,串行口波特率等参数可根据需要进行设置。通过实践证明,本文设计的基于CPLD/FPGA的多串口完全符合工业控制中一对多串口通讯的要求。
关键词:CPLD/FPGA;多串口扩展;全双工;异步通信;嵌入式系统
在工业控制中,设备的通讯与控制主要采用简洁高效的串口方式进行。工控机通过PCI扩展卡方式进行串口的扩展,或采用电路复杂的扩展芯片实现串口扩展。随着嵌入式技术发展,嵌入式系统的应用逐步代替了成本高昂的工业控制计算机。为了简化硬件电路的设计,降低系统成本,本文提出了一种基于CPLD/FPGA多串口扩展的方案,实现多个外设串口的扩展和管理,同时解决一对多的串口通讯可靠性问题,满足嵌入式系统串口扩展的需求。
1 系统结构
本设计以CPLD/FPGA芯片为核心,在芯片内部通过设计、编程实现并行总线接口到多个串行口的扩展。设计的多串口扩展包括并行总线接口、4路接收缓冲器、4路发送器、波特率发生器和UART接口。为实现高速嵌入式CPU与RS232通讯设备之间的速度匹配,充分利用嵌入式系统的实时性,在每个接收缓冲器中开辟了8个接收缓冲单元。在实际应用中,可根据嵌入式系统扩展的需要,灵活增减串口数量以及接收缓冲单元个数。在通讯过程,波特率发生器的时钟信号由外部有源晶振提供,选择合适的晶振频率即可获得高性能的数据传输。系统结构如图1所示。
2 功能模块设计
2.1 接收缓冲模块
2.1.1 接收缓冲模块构架
在设计过程中,为便于串口扩展功能的实现,将功能相似的部件进行了集成。本设计以4路UART接口扩展为例,接收缓冲部分包含了4个独立的接收缓冲器,其结构如图2所示。接收缓冲器共用clk时钟信号,并将其作为串行数据接收的波特率;每个接收缓冲器均有单独的rxd、bf、cs引脚,其功能分别为:串行数据输入、接收缓冲器储存状态、接收缓冲器片选。各接收缓冲器的片选端分别与2-4译码器的输出脚相连。译码器的输入端构成了4路接收缓冲器选择的地址线,分别对应a3、a4脚;结构图中数据总线d0~d7、读缓冲端rd、缓冲储存状态清‘0’端clr和缓冲单元地址线a0~a2为共用信号端口,分别与4个接收缓冲器相连。
2.1.2 接收缓冲器内部结构
接收缓冲器内部由RXD接收器、地址及写控制器和双端口RAM构成,如图3所示。
1)RXD接收器
RXD接收器的作用是接收串行设备发送的数据。clk脚引入波特率时钟后,程序首先检测串行数据输入脚rxd的电平,当检测到rxd脚电平为‘0’即串行数据的开始信号后,接收器开始接收数据。连续接收8位数据后,接收到的数据将被送至d0~d7端,同时reg_flag端产生一个负脉冲信号,触发写控制器的ad_cnt端,写控制器的地址线加‘1’并同时产生双端口RAM的写操作信号,完成接收数据的存储。
接收时,clk时钟为波特率的16倍,clk信号8分频后即串行数据位的周期的中间位置检测rxd脚电平状态,以保证串行数据准确地接收,累计计数至16分频时完成一位数据的接收。连续接收8位数据后,并判断第9位状态为‘1’时(停止位),完成一个字节的接收。RXD接收器的程序如下:
2)写控制器
写控制器的ad_cnt端接收到RXD接收器的reg_flag负脉冲信号后,对地址寄存器进行加‘1’操作,并将新的地址状态送至双端口RAM的地址总线a0~a2。同时,reg_flag负脉冲触发写控制器对clk时钟计数,向双端口RAM产生cs片选信号和wr写控制信号,将RXD接收器d0~d7的数据写入双端口RAM地址线所对应的存储单元中。
3)双端口RAM
通过一系列时序信号的组合,RXD接收器接收的数据将暂存到双端口RAM中。本设计中,双端口RAM直接调用的Quartus8.0存储器子库中的LPM_RAM_DP元件。
2.2 发送模块
发送部分由4路并行的TXD发送器、2-4译码器和4输入或门组成,如图4所示。4路TXD发送器共用时钟信号clk、数据端d0~d7、发送启动端load;每个发送器均有单独sf、cs、txd引脚,其功能分别为:发送状态标志、TXD发送器选择、串行数据输出。TXD发送器的cs端分别与2-4译码器的输出脚相连,译码器的输入端a0~a1即构成发送部分的地址线;发送器的sf端经过4输入或门输出,构成发送部分的发送状态标志。
在通讯过程中,load脚接收到CPU的控制信号后,根据地址线a0~a1的组合选择相应的TXD发送器,将数据总线d0~d7上的数据通过txd脚逐位输出,通过串行总线发送至接收设备。一个字节发送完成后,发送状态端sf置‘0’,CPU可检测sf端的电平状态,以判断数据是否发送完成,也可以利用sf引脚的状态触发CPU中断,完成多个数据的连续发送。发送器的程序与接收器相匹配,在此不再阐述。
2.3 波特率发生器
UART的接收和发送按照相同的波特率进行数据传送。波特率发生器分别给接收部分和发送部分提供时钟信号,并且接收的波特率时钟是发送的16倍,利用16倍波特率时钟对串行数据进行高速采样,以确保接收数据的准确性。为实现与不同传输速率的串行设备通信,波特率发生器对系统时钟进行不同系数的分频,根据CPU控制线的组合可分别产生4800bit/s、9600bit/s、19200bit/s、38400bit/s等多种波特率。
3 仿真与实现
本串口扩展器通过VHDL编程,在Ouartus8.0下进行了仿真。由于仿真信号较多,仅对关键部件的信号进行分析。图5给出了RXD接收器仿真波形。在测试过程中,首先确定通信的波特率为19 200 bit/s,即RXD接收器CLK时钟为波特率的16倍,发送设备通过串行总线向RXD接收器发送F1H,当RXD接收器完成数据的接收后,立即将数据送至数据总线d0~d7,仿真结果如图5所示。
给写控制器的ad_cnt端输入地址计数脉冲,地址线a0~a2进行加‘1’操作,片选线cs和写操作端wr根据CLK时钟信号相应输出低电平,完成接收数据的写存储。连续存储8个字节后,缓冲器状态标志bf置‘1’。将clr端输入低电平,bf标志清‘0’,同时地址线a0~a2回到“000”状态。写控制器的仿真结果如图6所示。
给TXD发送器的数据总线d0~d7输入AAH,通过串行总线发送至接收设备。load端置‘0’,启动发送。发送完成后,sf标志清‘0’。检查接收设备的接收值,与发送数据完全匹配。TXD发送器的波形仿真结果如图7所示。
4 结束语
本文详细介绍了CPLD/FPGA多串口设计的内部构成,对各个模块的工作原理和关键信号进行了分析,给出了EDA软件仿真形波和测试结果。通过对FPGA/CPLD多串口的设计与实现,为嵌入式系统中串口的扩展提供了一定的帮助。