基于CPLD/FPGA的多串口设计与实现

发布者:Zhenxiang最新更新时间:2011-08-04 来源: 电子设计工程关键字:CPLD  串口 手机看文章 扫描二维码
随时随地手机看文章
   

摘要:在工业控制中如何提高一对多的串口通讯可靠性和系统的集成性成为研究热点。本文利用嵌入式技术,提出基于CPLD/FPGA的多串口扩展设计方案。实现并行口到多个全双工异步通讯口之间的转换,并根据嵌入式系统实时性的需要,在每个UART接收器中开辟了8个接收缓冲单元,实现高速嵌入式CPU与RS232通讯设备之间的速度匹配,同时,串行口波特率等参数可根据需要进行设置。通过实践证明,本文设计的基于CPLD/FPGA的多串口完全符合工业控制中一对多串口通讯的要求。
关键词:CPLD/FPGA;多串口扩展;全双工;异步通信;嵌入式系统

    在工业控制中,设备的通讯与控制主要采用简洁高效的串口方式进行。工控机通过PCI扩展卡方式进行串口的扩展,或采用电路复杂的扩展芯片实现串口扩展。随着嵌入式技术发展,嵌入式系统的应用逐步代替了成本高昂的工业控制计算机。为了简化硬件电路的设计,降低系统成本,本文提出了一种基于CPLD/FPGA多串口扩展的方案,实现多个外设串口的扩展和管理,同时解决一对多的串口通讯可靠性问题,满足嵌入式系统串口扩展的需求。

1 系统结构
    本设计以CPLD/FPGA芯片为核心,在芯片内部通过设计、编程实现并行总线接口到多个串行口的扩展。设计的多串口扩展包括并行总线接口、4路接收缓冲器、4路发送器、波特率发生器和UART接口。为实现高速嵌入式CPU与RS232通讯设备之间的速度匹配,充分利用嵌入式系统的实时性,在每个接收缓冲器中开辟了8个接收缓冲单元。在实际应用中,可根据嵌入式系统扩展的需要,灵活增减串口数量以及接收缓冲单元个数。在通讯过程,波特率发生器的时钟信号由外部有源晶振提供,选择合适的晶振频率即可获得高性能的数据传输。系统结构如图1所示。

a.jpg



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个接收缓冲器相连。

b.jpg


2.1.2 接收缓冲器内部结构
    接收缓冲器内部由RXD接收器、地址及写控制器和双端口RAM构成,如图3所示。

c.jpg


    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接收器的程序如下:
d.jpg
e.jpg
   [page] 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输入或门输出,构成发送部分的发送状态标志。

f.jpg


    在通讯过程中,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所示。

g.jpg


    给写控制器的ad_cnt端输入地址计数脉冲,地址线a0~a2进行加‘1’操作,片选线cs和写操作端wr根据CLK时钟信号相应输出低电平,完成接收数据的写存储。连续存储8个字节后,缓冲器状态标志bf置‘1’。将clr端输入低电平,bf标志清‘0’,同时地址线a0~a2回到“000”状态。写控制器的仿真结果如图6所示。

h.jpg


    给TXD发送器的数据总线d0~d7输入AAH,通过串行总线发送至接收设备。load端置‘0’,启动发送。发送完成后,sf标志清‘0’。检查接收设备的接收值,与发送数据完全匹配。TXD发送器的波形仿真结果如图7所示。

i.jpg



4 结束语
    本文详细介绍了CPLD/FPGA多串口设计的内部构成,对各个模块的工作原理和关键信号进行了分析,给出了EDA软件仿真形波和测试结果。通过对FPGA/CPLD多串口的设计与实现,为嵌入式系统中串口的扩展提供了一定的帮助。

关键字:CPLD  串口 引用地址:基于CPLD/FPGA的多串口设计与实现

上一篇:利用FPGA平台架构提升信息娱乐系统设计灵活性
下一篇:基于ARM和CPLD的嵌入式视觉系统设计

推荐阅读最新更新时间:2024-05-02 21:31

STM32串口通信的原理
通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。 串行通信的分类 1、按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输; 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。 2、按照通信方式,分为: 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。 异步通信:不带时钟同步信号
[单片机]
STM32<font color='red'>串口</font>通信的原理
STM32 串口通讯 发送 接收
STM32的使用有利有弊,种类多---但是种类有太多,资料也是比较乱的,还有就是库的调用,经常忘记一些函数的使用------比如最常用的串口------ ------------------------------------------------------------------------------USART ----设置------------------------------- void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC
[单片机]
51单片机之串口通讯应用实例(逻辑分析仪调试)
硬件:STC89C52RC 开发工具:Keil uVision4 前言:8051是一款很经典的、历史悠久的单片机,作为一款入门级的单片机8051受到很多初学者的欢迎。89c52是8051系列的成员之一,拥有8K字节程序存储空间,512字节随机数据存储空间;I/O口控制端口、中断功能、定时器及串行接口。下面详细讲述串行接口功能的使用。 不管你用的芯片是不是STC89C52RC,只要你看完这篇文章,就能自行运用到不同的芯片上;因为一种串口通信协议的传输原理在任何芯片上都是统一的;所以它可以作为不同芯片一起协作的通信媒介。 目前普遍的单片机都有串行通信的接口,因为它依赖的硬件比较简单,一条串行数据输出线(TX)、一条串行数据接收
[单片机]
51单片机之<font color='red'>串口</font>通讯应用实例(逻辑分析仪调试)
《初学者C51自学笔记》之串口
并行通信: 通常是将数据字节的各位用多条数据线同时进行传送 。 控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。 串行通信: 将数据字节分成一位一位的形式在 一条传输线上逐个地传送。 传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。 异步通信: 指通信的发送与接收设备使用各自的时钟控制 数据的发送和接收过程。为使双方的收发协调,要求发送和接 收设备的时钟尽可能一致。 特点:不要求收发双方时钟的严格一 致,实现容易,设备开销较小,但每个字符要附加2~ 3位用于起止位,各帧之间还有间隔,因此传输效率不高。 异步通信是以字符(构成的帧)为单位
[单片机]
《初学者C51自学笔记》之<font color='red'>串口</font>
串口工作在DMA模式下有时接收异常
1 前言 客户反馈在使用STM32F205的串口工作在DMA模式时,有时能够接收数据,有时完全没有数据,但如果换成中断模式来接收又能100%正常收到数据。 2 复现现象 2.1 问题背景 与客户沟通,客户使用的是STM32F2标准库V1.1.0,串口波特率为1.408Mbps,不经过串口RS232,直接连接主CPU和从MCU(STM32F205)的串口发送和接收引脚,如下图所示: 图1 2.2 尝试重现问题 由于客户使用的是主从架构,实验采用两块STM3220G-EVAL评估板来重现现象。一块用来不间断发送串口数据,另一块采用串口DMA进行接收,直接通过杜邦线连接串口PIN脚并共地,不使用评估板上的RS232收
[单片机]
<font color='red'>串口</font>工作在DMA模式下有时接收异常
tiny4412 串口驱动分析三 --- log打印的几个阶段之内核自解压
开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 u-boot:U-Boot 2010.12 Linux内核版本:linux-3.0.31 Android版本:android-4.1.2 内核自解压时期的串口打印 在zImage格式的内核启动时会自解压内核,此时打印信息如下: Uncompressing Linux... 这句话是在arch/arm/boot/compressed/misc.c中: void decompress_kernel(unsigned long output_start, unsigned lo
[单片机]
tiny4412 <font color='red'>串口</font>驱动分析三 --- log打印的几个阶段之内核自解压
HMC5883 51串口测试程序
51单片机串口输出 //*************************************** // HMC5883 51串口测试程序 // 使用单片机STC89C51 // 晶振:11.0592M // 显示:PC串口 // 编译环境 Keil uVision2 // 参考宏晶网站24c04通信程序 // 时间:2011年3月1日 //**************************************** #include REG51.H #include math.h //Keil library #include stdio.h //Keil library #include IN
[单片机]
HMC5883 51<font color='red'>串口</font>测试程序
STM32串口发送数据第一个字节丢失问题
STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。错误依旧。 故障排除过程: 1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。 2、使用单步调试,单步运行各个发送指令,都正常。能收到0x01
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved