基于FPGA和TL16C554A的多串口扩展方法转让专利

申请号 : CN201510271444.3

文献号 : CN104866452B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 贾建峰王常虹石峰王贺年

申请人 : 哈尔滨工业大学(鞍山)工业技术研究院

摘要 :

本发明提供一种基于FPGA和TL16C554A的多串口扩展方法,采用的硬件包括FPGA、n个TL16C554A芯片、n个串口电平变换芯片,FPGA与DSP通过数据总线、地址总线和控制总线相连接,FPGA作为DSP处理器的异步存储器,完成与DSP的通信,以及TL16C554A芯片的时序驱动、片选译码和中断译码。TL16C554A芯片为异步串行通信的管理单元,包括4个串口通信管理单元,能够将并行数据转换成4路的串行输出,可以实现4个串口的收发管理,能同时实现与4n个设备通讯。本方法是一种占用处理器地址空间和中断资源少,可靠性高,便于移植的多串口扩展方法。

权利要求 :

1.一种基于FPGA和TL16C554A的多串口扩展方法,采用的硬件包括FPGA、n个TL16C554A芯片、n个串口电平变换芯片,n为大于等于4的整数,FPGA与DSP通过数据总线、地址总线和控制总线相连接,FPGA作为DSP处理器的异步存储器,只需要DSP的三个地址指针用于实现与DSP的通信,这三个地址指针分别用于保存TL16C554A芯片的控制字C54_CTRL_WORD、发送到串口的数据DATA_TO_C54和从TL16C554A芯片收到来自串口的数据DATA_FROM_C54;其特征在于,具体扩展方法如下:其中,FPGA收到DSP发送的控制字C54_CTRL_WORD为两个字节,FPGA根据控制字C54_CTRL_WORD产生满足TL16C554A芯片的读写时序的控制信号CSD~CSA、Addr2~0、RESET、/IOW、/IOR;实现对TL16C554A芯片的初始化,波特率的设定,以及通过TL16C554A芯片从串口读取或通过串口发送数据,最终达到DSP处理器通过外扩串口与外界通信的目的;C54_CTRL_WORD从高位到低位定义如下:第16位ST为FPGA产生TL16C554A芯片驱动总线的状态位,ST置位时启动FPGA对TL16C554A芯片操作的读或写总线,复位时复位FPGA对TL16C554A芯片操作的读或写总线;第15位RW为FPGA产生的TL16C554A芯片驱动总线的读或写状态位,RW置位时总线为读数据时序,复位时总线写数据时序;第14位到第5位为串口片选控制位,DSP通过这10位数据告诉FPGA对哪个串口进行操作,FGPA根据这10位数据进行片选译码,从而对相应串口进行读写;第4位RESET为TL16C554A芯片的复位控制位,置位时对TL16C554A芯片进行复位操作;低3位为地址,该地址为经过片选译码所对应的TL16C554A芯片的3根地址线A2、A1、A0;

FPGA中的时序译码是利用状态机产生满足对TL16C554A芯片操作的读写时序,该状态机根据控制字C54_CTRL_WORD中的总线起始状态位ST来触发或复位状态机,状态机启动时会根据控制字C54_CTRL_WORD中的总线读写状态位RW产生TL16C554A芯片的读或写时序;

FPGA中的片选译码是利用组合逻辑对C54_CTRL_WORD的10位片选控制位进行译码,产生某一个TL16C554A芯片的4个片选信号CSA、CSB、CSC和CSD中的某一个串口的片选信号;根据扩展串口数量选择需要的位;

FPGA中的中断译码是根据每一个TL16C554A芯片的四个中断信号INTA、INTB、INTC、INTD和RXRDY_n产生给DSP的中断信号,首先,利用组合逻辑将每一个TL16C554A芯片的中断信号INTA、INTB、INTC、INTD取逻辑“或”运算,再与该TL16C554A芯片的信号RXRDY_n的“非”取逻辑“与”运算,即INT_C54_i=(INTA or INTB or INTC or INTD)&(not RXRDY_n);然后将每个TL16C554A芯片的运算后的信号再进行逻辑“或”运算,即C54_INT_Combine=INT_C54_0 or INT_C54_1or … … or INT_C54_n,最后再根据C54_INT_Combine置位时触发FPGA中产生DSP中断的状态机,产生信号给DSP的外中断EXTINT4;当DSP把所有串口数据都读取时,C54_INT_Combine复位,取值为0,产生DSP中断的状态机也复位,同时DSP的外中断EXTINT4信号也复位;

在FPGA中自定义设置了串口中断状态寄存器,寄存器的每一位代表一个串口的中断状态,置位时代表该串口有数据中断产生,复位时表示没有数据中断或产生中断的数据已经被读取,该寄存器的个数根据串口数量设置;

当某一个串口有数据收到时,即有一个字节到达该串口的接收缓冲寄存器RBR,则该串口的中断标志寄存器IIR的值为0x04,同时该串口对应TL16C554A芯片的四个中断信号INTA、INTB、INTC、INTD中的那一个被拉高,产生高电平中断信号,而且,该TL16C554A芯片的RXRDY_n被拉低表示数据准备好,只有当RBR中的数据被读取后,对应的中断信号和RXRDY_n才恢复默认值,通过FPGA的中断译码程序,保证每个串口有数据收到时都能够产生中断,而且只有数据被读取后中断才能消除,不会有数据接收到而没被读取的情况;

所有扩展的串口都采用查询发送,中断接收,为DSP处理器扩展32串口其过程具体如下:

查询发送过程:

(1.1):查询第15个串口的发送保持寄存器THR是否为空的标志位,即第15个串口对应的线性状态寄存器LSR:地址0x05的第6位是否置位,DSP将2字节的控制字保存到控制字的指针地址中,即*CTRL_WORD_C54=addr+cs_num+0xC000;其中,ST=1触发TL16C554A时序状态机标志位;RW=1产生TL16C554A的读时序标志位;addr=0x05,即线性状态寄存器LSR的地址;cs_num为发送到串口序号,第15个串口对应cs_num=0x00F0;

(1.2):FPGA通过控制字CTRL_WORD_C54指针译码,将控制字的值保存到FPGA中;

(1.3):FPGA对控制字CTRL_WORD_C54的值进行译码:从控制字定义得出的ST、RW、cs_num和addr的值,控制字的值为0xC0F5,从而ST=1,RW=1,cs_num=0x00F0,addr=0x05;

(1.4):FPGA根据控制字中的ST、RW、addr产生TL16C554A的控制时序;ST=1,RW=1,addr=0x05则表示启动TL16C554A的读时序,产生TL16C554A的片选信号CSx:cs_num=

0x00F0,产生的CSx信号对应第4片TL16C554A芯片的CSD,读信号IOR,并将控制字中的地址addr按照时序送到TL16C554A芯片的IOR、CSD、A2、A1、A0的管脚上,由状态机根据时序要求从D7~D0读取1个字节的数据,读时序完成后,控制字所指定地址:0x05,线性状态寄存器LSR的1个字节数据就到达FPGA中DSP数据指针:*DATA_FROM_C54所指定的空间;

(1.5):DSP通过指针*DATA_FROM_C54读取1个字节的值,即LSR的值;

(1.6):与0x20取逻辑“与”运算,判断是否为1;如果是说明串口15的发送保持寄存器空,进行发送数据,跳到下一步;否则,表示发送保持寄存器有数据没有发送完成,则跳到第(1.1)步;

(1.7):将待发送的1个字节数保存到DATA_TO_C54的指针中,即*DATA_TO_C54=data;

(1.8):FPGA通过对DATA_TO_C54的指针地址译码,将1字节的数据保存到FPGA中;

(1.9):将2字节的控制字保存到控制字的指针地址中,即*CTRL_WORD_C54=addr+cs_num+0x8000;其中,ST=1触发TL16C554A时序状态机标志位;RW=0产生TL16C554A的写时序标志位;addr=0x00,即发送保持寄存器THR的地址;cs_num为发送到串口号,第15个串口对应cs_num=0x00F0;

(1.10):FPGA通过对控制字CTRL_WORD_C54的地址进行译码,将控制字的值保存到FPGA中;

(1.11):FPGA根据控制字中的ST、RW、cs和addr的值进行相关操作;从控制字定义得ST=1,RW=0,cs=0x00F0,addr=0x00;

(1.12):FPGA进行片选译码;根据cs_num的值将产生TL16C554A时序的状态机输出片选信号CS连接到对应的串口片选信号上,cs_num=0x00F0,即对应串口号15,状态机输出的CS片选信号则直接给第4片TL16C554A芯片的CSD;

(1.13):FPGA根据控制字中的ST、RW、addr产生TL16C554A的控制时序;ST=1,RW=0,addr=0x00,则表示启动TL16C554A的写时序,产生TL16C554A的片选信号CSx,cs_num=

0x00F0,产生的CSx信号对应第4片TL16C554A芯片的CSD,写信号IOW,并将控制字中的地址addr和步骤(1.7)中保存的待发送数据DATA_T0_C54按照时序要送到TL16C554A芯片的IOW、CSD、A2、A1、A0和D7~D0的管脚上,写时序完成后,要发送的一个字节就到达TL16C554A芯片的发送保持寄存器THR中;

(1.14):TL16C554A芯片将THR中的数据发送到串口输出信号上;THR中的数据由发送移位寄存器按照设置好的波特率,再添加上起始位和停止位后按位写到串口的发送信号线TXD上,完成一个字节的发送;

中断接收过程:

(2.1):当有一个或多个串口收到数据,TL16C554A芯片成功收到后将数据保存到串口对应通道的接收数据缓冲寄存器RBR,同时TL16C554A芯片将对应的有数据收到串口的中断信号线INTx拉高,并且将RXRDY_n拉低;

(2.2):FPGA根据TL16C554A芯片的中断信号INTx将自定义的中断寄存器C54_INT_REG0和C54_INT_REG1中对应有数据收到串口的“位”置1,等到数据被读取后,FPGA会根据TL16C554A芯片的中断信号INTx的清除再将自定义的中断寄存器C54_INT_REG0和C54_INT_REG1中对应有数据收到而且被读取的串口对应的“位”置0;

(2.3):同时,FPGA中的中断译码程序根据INT_C54_i=(INTA or INTB or INTC or INTD)&(not RXRDY_n)和C54_INT_Combine=INT_C54_0 or INT_C54_1 or … … or INT_C54_8运算后产生满足DSP中断的高电平信号C54_INT_Combine,从而触发FPGA中的中断的状态机产生DSP外部中断低信号EXTINT4,该状态机等待中断C54_INT_Combine清除后回到idle状态;

(2.4):DSP收到外部中断EXTINT4进入中断服务程序;

(2.5):首先读取中断状态寄存器C54_INT_REG0和C54_INT_REG1的值,即C54_INT_REG0_value=*C54_INT_REG0、C54_INT_REG1_value=*C54_INT_REG1;

(2.6):从低到高依次判断中断寄存器其值C54_INT_REG0_value和C54_INT_REG0_value的每一位,如果为1跳到下一步,否则判断下一位;设置循环计数器,该计数器的值代表串口号,从0到31,每判断一位,对应计数器值加1;

(2.7):DSP把读第i个串口,设为第0个串口的接收缓冲寄存器RBR,TL16C554A芯片对应的地址为0x00的控制字写入控制字指针,即*CTRL_WORD_C54=0x00+0x000+0xC000;

(2.8):FPGA根据控制字CTRL_WORD_C54的指针地址进行译码,将控制字的值保存到FPGA中;

(2.9):FPGA对控制字CTRL_WORD_C54的值进行译码:根从控制字定义得出的ST、RW、cs和addr的值,控制字的值为0xC000,从而ST=1,RW=1,cs_num=0x0000,addr=0x00;

(2.10):FPGA进行片选译码:根据cs_num的值产生TL16C554A的时序状态机的输出片选信号CSx,并将片选信号CSx输出给对应的串口片选信号上;设cs_num=0x0000,即对应串口号0,状态机输出的片选信号CSx则直接给第1片TL16C554A芯片的CSA;

(2.11):FPGA根据控制字中的ST、RW、addr产生TL16C554A的控制时序:ST=1,RW=1,addr=0x00表示启动TL16C554A的读时序,产生TL16C554A的片选信号CSx,读信号IOR,并将控制字中的地址addr按照时序要分别输出到C54的IOR、CSA、A2、A1、A0的管脚上,由状态机根据时序要求从D7~D0读取1个字节的数据,读时序完成后,控制字所指定地址:0x00,接收缓冲寄存器RBR的1个字节数据就到达FPGA中DSP数据指针*DATA_FROM_C54所指定的空间;

(2.12):DSP通过指针*DATA_FROM_C54读取1个字节的值,即RBR中的数据,也就是控制字中cs_num所对应串口收到的数据;

(2.13):判断第(2.6)步中的循环计数器是否等于31,如果不等于跳到第(2.6)步继续执行;否则,跳到下一步执行;

(2.14):当所有串口数据都被读取后,8片TL16C554A芯片的中断信号INTA、INTB、INTC、INTD都被置低,RXRDY_n被拉高,FPGA中的中断状态机复位,DSP跳出中断服务程序,等待下次中断触发。

说明书 :

基于FPGA和TL16C554A的多串口扩展方法

技术领域

[0001] 本发明涉及一种基于FPGA和TL16C554A的多串口扩展方法。

背景技术

[0002] 针对多传感器(往往大于4个)数据采集实时性要求较高的系统,由于处理器自带串口数量往往小于4个,为了实现处理器与多个传感器通过串口通信,需要对处理器进行串口扩展。
[0003] 串口扩展方式一般有两种:第一种是利用软件模拟方法扩展串口,即在PLD等可编程数字逻辑芯片中,利用软件模拟串口收发的功能,实现串口扩展。该方法具有占用微处理器I/O口的资源少、电路设计简单等优点,但是模拟实现串口逻辑较复杂,开发难度大,扩展的串口实时性、可靠性不能够保证。第二种是利用硬件扩展串口,即利用串口扩展芯片实现串口扩展。该方法具有电路设计简单,串口实时性高,可靠性高的优点。但是,利用该方法扩展串口的难点和关键在于串口扩展芯片与处理器之间接口环节的处理,即多串口扩展芯片的片选译码、中断译码和时序译码,以及与处理器通信四个方面的处理。若处理方式不当,就会造成多串口与处理器通信时串口数据丢失等问题。
[0004] 传统上在利用硬件扩展串口时处理串口扩展芯片与处理器之间接口环节的方式有两种,一种是通过逻辑门电路与扩展芯片相连,另一种是采用CPLD作为扩展芯片和处理器之间的控制信号相连。
[0005] 第一种处理方式是利用处理器的地址和相关控制信号通过组合逻辑门进行串口扩展芯片简单的片选译码,中断译码。这种方式适合于单个串口扩展芯片扩展串口时采用,往往软件编程比较复杂,不易于扩展多于4个以上的串口。而且,该方法占用处理器的地址空间资源和中断资源比较多,采用简单组合逻辑译码,靠处理器延时不能很好地满足串口扩展芯片驱动的读写时序,容易出现误码。
[0006] 第二种处理方式往往将处理器的低3位地址直接与扩展芯片相连,低8位数据线直接与扩展芯片相连,利用CPLD连接处理器与串口扩展芯片,实现片选和中断译码。这种方式只考虑片选和中断的逻辑,没有考虑到串口扩展芯片的时序驱动,往往时序上的不满足串口扩展芯片的要求,导致串口收发数据丢失,扩展的串口可靠性也不高。

发明内容

[0007] 综上所述,针对需要外扩多串口(大于4个)的处理器,在利用串口扩展芯片进行多串口扩展时,提供一种基于FPGA和TL16C554A的多串口扩展方法,该方法满足串口扩展芯片时序要求,扩展串口数量可以灵活改变,并且实时性高,可靠性高。
[0008] 本发明所采用的技术如下:一种基于FPGA和TL16C554A的多串口扩展方法,采用的硬件包括FPGA、n个TL16C554A芯片、n个串口电平变换芯片,n为大于等于4的整数,FPGA与DSP通过数据总线、地址总线和控制总线相连接,FPGA作为DSP处理器的异步存储器,只需要DSP的三个地址指针用于实现与DSP的通信,这三个地址指针分别用于保存TL16C554A芯片的控制字C54_CTRL_WORD、发送到串口的数据DATA_T0_C54和从TL16C554A芯片收到来自串口的数据DATA_FROM_C54;
[0009] 其中,FPGA收到DSP发送的控制字C54_CTRL_WORD为两个字节,FPGA根据控制字C54_CTRL_WORD产生满足TL16C554A芯片的读写时序的控制信号CSD~CSA、Addr2~0、RESET、/IOW、/IOR;实现对TL16C554A芯片的初始化,波特率的设定,以及通过TL16C554A芯片从串口读取或通过串口发送数据,最终达到DSP处理器通过外扩串口与外界通信的目的;C54_CTRL_WORD从高位到低位定义如下:第16位ST为FPGA产生TL16C554A芯片驱动总线的状态位,ST置位时启动FPGA对TL16C554A芯片操作的读或写总线,复位时复位FPGA对TL16C554A芯片操作的读或写总线;第15位RW为FPGA产生的TL16C554A芯片驱动总线的读或写状态位,RW置位时总线为读数据时序,复位时总线写数据时序;第14位到第5位为串口片选控制位,DSP通过这10位数据告诉FPGA对哪个串口进行操作,FGPA根据这10位数据进行片选译码,从而对相应串口进行读写;第4位RESET为TL16C554A芯片的复位控制位,置位时对TL16C554A芯片进行复位操作;低3位为地址,该地址为经过片选译码所对应的TL16C554A芯片的3根地址线A2、A1、A0;
[0010] FPGA中的时序译码是利用状态机产生满足对TL16C554A芯片操作的读写时序,该状态机根据控制字C54_CTRL_WORD中的总线起始状态位ST来触发或复位状态机,状态机启动时会根据控制字C54_CTRL_WORD中的总线读写状态位RW产生TL16C554A芯片的读或写时序;
[0011] FPGA中的片选译码是利用组合逻辑对C54_CTRL_WORD的10位片选控制位进行译码,产生某一个TL16C554A芯片的4个片选信号CSA、CSB、CSC和CSD中的某一个串口的片选信号;根据扩展串口数量选择需要的位;
[0012] FPGA中的中断译码是根据每一个TL16C554A芯片的四个中断信号INTA、INTB、INTC、INTD和RXRDY_n产生给DSP的中断信号,首先,利用组合逻辑将每一个TL16C554A芯片的中断信号INTA、INTB、INTC、INTD取逻辑“或”运算,再与该TL16C554A芯片的信号RXRDY_n的“非”取逻辑“与”运算,即INT_C54_i=(INTA or INTB or INTC or INTD)&(not RXRDY_n);然后将每个TL16C554A芯片的运算后的信号再进行逻辑“或”运算,即C54_INT_Combine=INT_C54_0 or INT_C54_1 or......or INT_C54_8,最后再根据C54_INT_Combine置位时触发FPGA中产生DSP中断的状态机,产生信号给DSP的外中断EXTINT4;当DSP把所有串口数据都读取时,C54_INT_Combine复位,取值为0,产生DSP中断的状态机也复位,同时DSP的外中断EXTINT4信号也复位;
[0013] 在FPGA中自定义设置了串口中断状态寄存器,寄存器的每一位代表一个串口的中断状态,置位时代表该串口有数据中断产生,复位时表示没有数据中断或产生中断的数据已经被读取,该寄存器的个数根据串口数量设置;
[0014] 当某一个串口有数据收到时,即有一个字节到达该串口的接收缓冲寄存器RBR,则该串口的中断标志寄存器IIR的值为0x04,同时该串口对应TL16C554A芯片的四个中断信号INTA、INTB、INTC、INTD中的那一个被拉高,产生高电平中断信号。而且,该TL16C554A芯片的RXRDY_n被拉低表示数据准备好,只有当RBR中的数据被读取后,对应的中断信号和RXRDY_n才恢复默认值,通过FPGA的中断译码程序,保证每个串口有数据收到时都能够产生中断,而且只有数据被读取后中断才能消除,不会有数据接收到而没被读取的情况;
[0015] 所有扩展的串口都采用查询发送,中断接收,为DSP处理器扩展32串口其过程具体如下:
[0016] 查询发送过程:
[0017] (1.1):查询第15个串口的发送保持寄存器THR是否为空的标志位,即第15个串口对应的线性状态寄存器LSR:地址0x05的第6位是否置位,DSP将2字节的控制字保存到控制字的指针地址中,即(*CTRL_WORD_C54)=addr+cs_num+0xC000;其中,ST=1触发TL16C554A时序状态机标志位;RW=1产生TL16C554A的读时序标志位;addr=0x05,即线性状态寄存器LSR的地址;cs_num为发送到串口序号,第15个串口对应cs_num=0x00F0;
[0018] (1.2):FPGA通过控制字CTRL_WORD_C54指针译码,将控制字的值并保存到FPGA中;
[0019] (1.3):FPGA对控制字CTRL_WORD_C54的值进行译码:从控制字定义得出的ST、RW、cs_num和addr的值,控制字的值为0xC0F5,从而ST=1,RW=1,cs_num=0x00F0,addr=0x05;
[0020] (1.4):FPGA根据控制字中的ST、RW、addr产生TL16C554A的控制时序;ST=1,RW=1,addr=0x05则表示启动TL16C554A的读时序,产生TL16C554A的片选信号CSx:cs_num=
0x00F0,产生的CSx信号对应第4片TL16C554A芯片的CSD,读信号IOR,并将控制字中的地址addr按照时序送到TL16C554A芯片的IOR、CSD、A2、A1、A0的管脚上,由状态机根据时序要求从D7~D0读取1个字节的数据,读时序完成后,控制字所指定地址:0x05,线性状态寄存器LSR的1个字节数据就到达FPGA中DSP数据指针:*DATA_FROM_C54所指定的空间;
[0021] (1.5):DSP通过指针(*DATA_FROM_C54)读取1个字节的值,即LSR的值;
[0022] (1.6):与0x20取逻辑“与”运算,判断是否为1;如果是说明串口15的发送保持寄存器空,进行发送数据,跳到下一步;否则,表示发送保持寄存器有数据没有发送完成,则跳到第(1.1)步;
[0023] (1.7):将待发送的1个字节数保存到DATA_T0_C54的指针中,即(*DATA_T0_C54)=data;
[0024] (1.8):FPGA通过对DATA_T0_C54的指针地址译码,将1字节的数据保存到FPGA中;
[0025] (1.9):与第(1.2)、(1.3)、(1.4)步相同,将2字节的控制字保存到控制字的指针地址中,即(*CTRL_WORD_C54)=addr+cs_num+0x8000;其中,ST=1触发TL16C554A时序状态机标志位;RW=0产生TL16C554A的写时序标志位;addr=0x00,即发送保持寄存器THR的地址;cs_num为发送到串口号,第15个串口对应cs_num=0x00F0;
[0026] (1.10):FPGA通过对控制字CTRL_WORD_C54的地址进行译码,将控制字的值保存到FPGA中;
[0027] (1.11):FPGA根据控制字中的ST、RW、cs和addr的值进行相关操作;从控制字定义可得ST=1,RW=0,cs=0x00F0,addr=0x00;
[0028] (1.12):FPGA进行片选译码;根据cs_num的值将产生TL16C554A时序的状态机输出片选信号CS连接到对应的串口片选信号上,cs_num=0x00F0,即对应串口号15,状态机输出的CS片选信号则直接给第4片TL16C554A芯片的CSD。
[0029] (1.13):FPGA根据控制字中的ST、RW、addr产生TL16C554A的控制时序;ST=1,RW=0,addr=0x00,则表示启动TL16C554A的写时序,产生TL16C554A的片选信号CSx,cs_num=
0x00F0,产生的CSx信号对应第4片TL16C554A芯片的CSD,写信号IOW,并将控制字中的地址addr和步骤(1.2)中保存的待发送数据DATA_T0_C54按照时序要送到TL16C554A芯片的IOW、CSD、A2、A1、A0和D7~D0的管脚上,写时序完成后,要发送的一个字节就到达TL16C554A芯片的发送保持寄存器THR中;
[0030] (1.14):TL16C554A芯片将THR中的数据发送到串口输出信号上;THR中的数据由发送移位寄存器按照设置好的波特率,再添加上起始位和停止位后按位写到串口的发送信号线TXD上,完成一个字节的发送;
[0031] 中断接收过程:
[0032] (2.1):当有一个或多个串口收到数据,TL16C554A芯片成功收到后将数据保存到串口对应通道的接收数据缓冲寄存器RBR,同时TL16C554A芯片将对应的有数据收到串口的中断信号线INTx拉高,并且将RXRDY_n拉低;
[0033] (2.2):FPGA根据TL16C554A芯片的中断信号INTx将自定义的中断寄存器C54_INT_REG0和C54_INT_REG1中对应有数据收到串口的“位”置1,等到数据被读取后,FPGA会根据TL16C554A芯片的中断信号INTx的清除而将该寄存器中对应位置0;
[0034] (2.3):同时,FPGA中的中断译码程序根据INT_C54_i=(INTA or INTB or INTC or INTD)&(not RXRDY_n)和C54_INT_Combine=INT_C54_0 or INT_C54_1 or......or INT_C54_8运算后产生满足DSP中断的高电平信号C54_INT_Combine,从而触发FPGA中的中断的状态机产生DSP外部中断低信号EXTINT4,该状态机等待中断C54_INT_Combine清除后回到id1e状态;
[0035] (2.4):DSP收到外部中断EXTINT4进入中断服务程序;
[0036] (2.5):首先读取中断状态寄存器C54_INT_REG0和C54_INT_REG1的值,即C54_INT_REG0_value=(*C54_INT_REG0)、C54_INT_REG1_value=(*C54_INT_REG1);
[0037] (2.6):从低到高依次判断中断寄存器其值C54_INT_REG0_value和C54_INT_REG0_value的每一位,如果为1跳到下一步,否则判断下一位;设置循环计数器,该计数器的值代表串口号,从0到31,每判断一位,对应计数器值加1;
[0038] (2.7):DSP把读第i个串口,设为第0个串口的接收缓冲寄存器RBR,TL16C554A芯片对应的地址为0x00的控制字写入控制字指针,即(*CTRL_WORD_C54)=0x00+0x000+0xC000;
[0039] (2.8):FPGA根据控制字CTRL_WORD_C54的指针地址进行译码,将控制字的值保存到FPGA中;
[0040] (2.9):FPGA对控制字CTRL_WORD_C54的值进行译码:根从控制字定义得出的ST、RW、cs和addr的值,控制字的值为0xC000,从而ST=1,RW=1,cs_num=0x0000,addr=0x00;
[0041] (2.10):FPGA进行片选译码:根据cs_num的值产生TL16C554A的时序状态机的输出片选信号CSx,并将片选信号CSx输出给对应的串口片选信号上;设cs_num=0x0000,即对应串口号0,状态机输出的片选信号CSx则直接给第1片TL16C554A芯片的CSA;
[0042] (2.11):FPGA根据控制字中的ST、RW、addr产生TL16C554A的控制时序:ST=1,RW=1,addr=0x00表示启动TL16C554A的读时序,产生TL16C554A的片选信号CSx,读信号IOR,并将控制字中的地址addr按照时序要分别输出到C54的IOR、CSA、A2、A1、A0的管脚上,由状态机根据时序要求从D7~D0读取1个字节的数据,读时序完成后,控制字所指定地址(0x00,接收缓冲寄存器RBR)的1个字节数据就到达FPGA中DSP数据指针(*DATA_FROM_C54)所指定的空间;
[0043] (2.12):DSP通过指针(*DATA_FROM_C54)读取1个字节的值,即RBR中的数据,也就是控制字中cs_num所对应串口收到的数据;
[0044] (2.13):判断第6步中的循环计数器是否等于31,如果不等于跳到第(2.6)步继续执行;否则,跳到下一步执行;
[0045] (2.14):当所有串口数据都被读取后,8片TL16C554A芯片的中断信号INTA、INTB、INTC、INTD都被置低,RXRDY_n被拉高,FPGA中的中断状态机复位,DSP跳出中断服务程序,等待下次中断触发。
[0046] 本发明的特点和优点:
[0047] 第一:与传统其它扩展串口方式相比,该方法严格按照串口扩展芯片的读写时序编写驱动程序,对串口驱动芯片进行时序译码、片选译码和中断译码,保证了串口扩展通信的可靠性。
[0048] 第二:由于该方法进行扩展串口时,采用处理器的一个外中断源和自定义中断标志寄存器来管理多串口中断,减少了处理器的外中断资源的占用。而且,在中断服务程序中通过判断自定义中断标志寄存器中代表串口号的每一位的值,可以直接从有数据接收到的串口读取数据,避免逐个查询串口接收数据中断寄存器的状态,节省了时间,提高了多串口通信的实时性。
[0049] 第三:只需要处理器的几个地址空间,减少了处理器地址空间资源的占用。
[0050] 第四:当采用该方法扩展的串口数量不同时,FPGA和DSP中的程序基本不需要修改,只需将FPGA中多余串口相关信号线置于三态即可,便于扩展串口数量的灵活改变,也方便移植到不同数量扩展串口系统中。

附图说明

[0051] 图1为本发明的串口扩展方式框图;
[0052] 图2为TL16C554A芯片读时序图;
[0053] 图3为TL16C554A芯片写时序;
[0054] 图4为查询发送过程流程图;
[0055] 图5为中断接收过程流程图;
[0056] 图6实施例2的处理器多串口扩展方式的实施方式

具体实施方式

[0057] 下面根据说明书附图举例对本发明做进一步说明:
[0058] 实施例1
[0059] 本扩展方式技术指标:
[0060] DSP处理器:TMS320C6713B
[0061] FPGA:EP2C50F484I8
[0062] 串口扩展芯片:TL16C554A
[0063] 串口电平转换芯片:MAX3490
[0064] 若多传感器实时数据采集系统中采用DSP处理器TMS320C6713B(这里处理器以DSP为例,其它类型的处理器选取相应的信号线即可,下同),由于该处理器本身不带串口,采用串口扩展芯片扩展多串口时,本专利发明的多串口扩展方式,包括FPGA、TL16C554A、串口电平变换芯片,原理框图如图1所示。
[0065] 其中,FPGA主要完成与DSP的通信,以及TL16C554A的时序驱动、片选译码和中断译码。TL16C554A为异步串行通信的管理单元,单个TL16C554A包括4个TL16C550串口通信管理单元。该器件能够将并行数据转换成4路的串行输出,单片可以实现4个串口的收发管理。通过n片TL16C554A的使用可以扩展4n个串口,能同时实现与4n个设备通讯。串口电平变换芯片(RS422、RS232选取相应的芯片)实现串口电平到TL16C554A采用的TTL电平变换。
[0066] FPGA与DSP相连的数据总线、地址总线和控制总线,包括DSP的低8位地址线、低16位数据线、片选线CE3、写使能线AWE、读使能线AOE、外部中断4的信号线EXTINT4以及复位信号线RST。
[0067] FPGA作为DSP处理器的异步存储器,只需要DSP的三个地址指针即可实现与DSP的通信。这三个地址指针分别用于保存C54(TL16C554A的简称,下同)的控制字C54_CTRL_WORD、发送到串口的数据DATA_TO_C54和从C54收到来自串口的数据DATA_FROM_C54。
[0068] 其中,FPGA收到DSP发送的C54控制字C54_CTRL_WORD为两个字节,FPGA根据C54控制字产生满足C54的读写时序的控制信号CSD~CSA、Addr2~0、RESET、/IOW、/IOR。实现对C54的初始化,波特率的设定,以及通过C54从串口读取或通过串口发送数据,最终达到DSP处理器通过外扩串口与外界通信的目的。C54_CTRL_WORD从高位到低位定义如下:第16位ST为FPGA产生C54驱动总线的状态位,ST置位时启动FPGA对C54操作的读或写总线,复位时复位FPGA对C54操作的读或写总线;第15位RW为FPGA产生的C54驱动总线的读或写状态位,RW置位时总线为读数据时序,复位时总线写数据时序;第14位到第5位为串口片选控制位,DSP通过这10位数据告诉FPGA对哪个串口进行操作,FGPA根据这10位数据进行片选译码,从而对相应串口进行读写;第4位RESET为C54的复位控制位,置位时对C54进行复位操作;低3位为地址,该地址为经过片选译码所对应的TL16C554A的3根地址线A2、A1、A0。
[0069] FPGA中的时序译码是利用状态机产生满足对C54操作的读写时序。该状态机根据控制字C54_CTRL_WORD中的总线起始状态位ST来触发或复位状态机。状态机启动时会根据控制字C54_CTRL_WORD中的总线读写状态位RW产生如图2和图3所对应C54的读或写时序。
[0070] FPGA中的片选译码是利用组合逻辑对C54_CTRL_WORD的10位片选控制位进行译码,产生某一个C54的4个片选信号CSA、CSB、CSC和CSD中的某一个串口的片选信号。根据扩展串口数量选择需要的位即可。这里比如扩展32个串口(以扩展32个串口为例,下同),则只需要这10位中的低5位即可实现,二进制从00000b到11111b代表串口的序号从0到31,FPGA根据这5位的值分别产生对应串口序号从0到31的片选信号。假设这5位的二进制为01111b,十进制值为15,FPGA经过片选译码产生第15个串口的片选信号,即第4片TL16C554A的CSD拉低,从而对该串口进行操作。
[0071] FPGA中的中断译码是根据每一个C54的四个中断信号INTA、INTB、INTC、INTD和RXRDY_n产生给DSP的中断信号。首先,利用组合逻辑将每一个C54的中断信号INTA、INTB、INTC、INTD取逻辑“或”运算,再与该C54的信号RXRDY_n的“非”取逻辑“与”运算,即INT_C54_i=(INTA or INTB or INTC or INTD)&(not RXRDY_n);然后将每个C54的运算后的信号再进行逻辑“或”运算,即C54_INT_Combine=INT_C54_0 or INT_C54_1 or......or INT_C54_8。最后再根据C54_INT_Combine置位时(即有数据接收中断)触发FPGA中产生DSP中断的状态机,产生信号给DSP的外中断EXTINT4;当DSP把所有串口数据都读取时(C54_INT_Combine复位,取值为0),产生DSP中断的状态机也复位,同时DSP的外中断EXTINT4信号也复位。
[0072] 为了避免DSP进入中断服务程序后不知道哪个串口收到数据而产生的中断,在FPGA中自定义设置了串口中断状态寄存器。该寄存器为16位的寄存器,地址由DSP分配。寄存器的每一位代表一个串口的中断状态,置位时代表该串口有数据中断产生,复位时表示没有数据中断或产生中断的数据已经被读取。该寄存器的个数根据串口数量设置。若32个串口,则设置两个16位的中断寄存器,分别记为C54_INT_REG0和C54_INT_REG1,串口号对应寄存器从低位到高位递增。所设置寄存器的值由FPGA根据每个串口对应C54的中断信号INTA、INTB、INTC、INTD进行更新:当串口收到数据有数据中断产生,对应串口号寄存器中的位被置位;当数据被读取后,对应串口号寄存器中的位被复位。当DSP进入中断服务程序,首先读这些中断寄存器,通过寄存器每位的值判断哪些串口有数据收到,直接从相应串口读取数据,而不用查询每个串口的状态进行判断,节省了DSP从串口读取数据的时间,提高了串口数据接收的实时性。
[0073] 当某一个串口有数据收到时,即有一个字节到达该串口的接收缓冲寄存器RBR(Receiver-buffer register),则该串口的中断标志寄存器IIR(Interrupt-identification register)的值为0x04,同时该串口对应C54的四个中断信号INTA、INTB、INTC、INTD中的那一个被拉高,产生高电平中断信号。而且,该C54的RXRDY_n被拉低表示数据准备好。只有当RBR中的数据被读取后,对应的中断信号和RXRDY_n才恢复默认值。通过FPGA的中断译码程序,保证每个串口有数据收到时都能够产生中断,而且只有数据被读取后中断才能消除,不会有数据接收到而没被读取的情况。
[0074] 所有扩展的串口都采用查询发送,中断接收。采用FPGA、TL16C554A为DSP处理器扩展32串口的收发过程如下:
[0075] 查询发送过程:
[0076] 1:查询第15个(以第15串口为例,下同)串口的发送保持寄存器THR是否为空的标志位,即第15个串口对应的线性状态寄存器LSR(地址0x05)的第6位是否置位。DSP将2字节的控制字保存到控制字的指针地址中,即(*CTRL_WORD_C54)=addr+cs_num+0xC000;其中,ST=1触发TL16C554A时序状态机标志位;RW=1产生TL16C554A的读时序标志位;addr=0x05,即线性状态寄存器LSR的地址;cs_num为发送到串口序号,第15个串口对应cs_num=
0x00F0;
[0077] 2:FPGA通过控制字CTRL_WORD_C54指针译码,将控制字的值保存到FPGA中;
[0078] 3:FPGA对控制字CTRL_WORD_C54的值进行译码:从控制字定义得出的ST、RW、cs_num和addr的值,控制字的值为0xC0F5,从而ST=1,RW=1,cs_num=0x00F0,addr=0x05;
[0079] 4:FPGA根据控制字中的ST、RW、addr产生TL16C554A的控制时序;ST=1,RW=1,addr=0x05则表示启动TL16C554A的读时序,产生图2中TL16C554A的片选信号CSx(cs_num=0x00F0,产生的CSx信号对应第4片C54的CSD),读信号IOR,并将控制字中的地址addr按照时序送到C54的IOR、CSD、A2、A1、A0的管脚上,由状态机根据图2时序要求从D7~D0读取1个字节的数据。读时序完成后,控制字所指定地址(0x05,线性状态寄存器LSR)的1个字节数据就到达FPGA中DSP数据指针(*DATA_FROM_C54)所指定的空间;
[0080] 5:DSP通过指针(*DATA_FROM_C54)读取1个字节的值,即LSR的值;
[0081] 6:与0x20取逻辑“与”运算,判断是否为1;如果是说明串口15的发送保持寄存器空,可以进行发送数据,跳到下一步;否则,表示发送保持寄存器有数据没有发送完成,则跳到第1步;
[0082] 7:将待发送的1个字节数保存到DATA_TO_C54的指针中,即(*DATA_TO_C54)=data;
[0083] 8:FPGA通过对DATA_TO_C54的指针地址译码,将1字节的数据保存到FPGA中;
[0084] 9:与第2、3、4步类似,将2字节的控制字保存到控制字的指针地址中,即(*CTRL_WORD_C54)=addr+cs_num+0x8000;其中,ST=1触发TL16C554A时序状态机标志位;RW=0产生TL16C554A的写时序标志位;addr=0x00,即发送保持寄存器THR(Transmitter-holding register)的地址;cs_num为发送到串口号,第15个串口对应cs_num=0x00F0;
[0085] 10:FPGA通过对控制字CTRL_WORD_C54的地址进行译码,将控制字的值保存到FPGA中;
[0086] 11:FPGA根据控制字中的ST、RW、cs和addr的值进行相关操作;从控制字定义可得ST=1,RW=0,cs=0x00F0,addr=0x00;
[0087] 12:FPGA进行片选译码;根据cs_num(第5到14位为片选)的值将产生TL16C554A时序的状态机输出片选信号CS连接到对应的串口片选信号上。cs_num=0x00F0,即对应串口号15,状态机输出的CS片选信号则直接给第4片C54的CSD。
[0088] 13:FPGA根据控制字中的ST、RW、addr产生TL16C554A的控制时序;ST=1,RW=0,addr=0x00,则表示启动TL16C554A的写时序,产生图3中TL16C554A的片选信号CSx(cs_num=0x00F0,产生的CSx信号对应第4片C54的CSD),写信号IOW,并将控制字中的地址addr和步骤2中保存的待发送数据DATA_T0_C54按照时序要送到C54的IOW、CSD、A2、A1、A0和D7~D0的管脚上。写时序完成后,要发送的一个字节就到达C54的发送保持寄存器THR中;
[0089] 14:C54将THR中的数据发送到串口输出信号上;THR中的数据由发送移位寄存器按照设置好的波特率,再添加上起始位和停止位后按位写到串口的发送信号线TXD上,完成一个字节的发送。
[0090] 中断接收过程:
[0091] 1:当有一个或多个串口收到数据,C54成功收到后将数据保存到串口对应通道的接收数据缓冲寄存器RBR,同时C54将对应的有数据收到串口的中断信号线INTx(INTA、INTB、INTC或INTD)拉高,并且将RXRDY_n拉低;
[0092] 2:FPGA根据C54的中断信号INTx将自定义的中断寄存器C54_INT_REG0和C54_INT_REG1中对应有数据收到串口的“位”置1,等到数据被读取后,FPGA会根据C54的中断信号INTx的清除而将该寄存器中对应位置0;
[0093] 3:同时,FPGA中的中断译码程序根据INT_C54_i=(INTA or INTB or INTC or INTD)&(not RXRDY_n)和C54_INT_Combine=INT_C54_0 or INT_C54_1 or......or INT_C54_8运算后产生满足DSP中断的高电平信号C54_INT_Combine,从而触发FPGA中的中断的状态机产生DSP外部中断低信号EXTINT4,该状态机等待中断C54_INT_Combine清除后回到idle状态;
[0094] 4:DSP收到外部中断EXTINT4进入中断服务程序;
[0095] 5:首先读取中断状态寄存器C54_INT_REG0和C54_INT_REG1的值,即C54_INT_REG0_value=(*C54_INT_REG0)、C54_INT_REG1_value=(*C54_INT_REG1);
[0096] 6:从低到高依次判断中断寄存器其值C54_INT_REG0_value和C54_INT_REG0_value的每一位,如果为1跳到下一步,否则判断下一位;设置循环计数器,该计数器的值代表串口号,从0到31,每判断一位,对应计数器值加1;
[0097] 7:DSP把读第i个串口(假定为第0个串口,下同)的接收缓冲寄存器RBR(C54对应的地址为0x00)的控制字写入控制字指针,即(*CTRL_WORD_C54)=0x00+0x0000+0xC000;
[0098] 8:FPGA根据控制字CTRL_WORD_C54的指针地址进行译码,将控制字的值保存到FPGA中;
[0099] 9:FPGA对控制字CTRL_WORD_C54的值进行译码:根从控制字定义得出的ST、RW、cs_num和addr的值,控制字的值为0xC000,从而ST=1,RW=1,cs_num=0x0000,addr=0x00;
[0100] 10:FPGA进行片选译码:根据cs_num(控制字的第5到14位为cs_num)的值产生TL16C554A的时序状态机的输出片选信号CSx,并将片选信号CSx输出给对应的串口片选信号上。假设cs_nun=0x0000,即对应串口号0,状态机输出的片选信号CSx则直接给第1片C54的CSA。
[0101] 11:FPGA根据控制字中的ST、RW、addr产生TL16C554A的控制时序:ST=1,RW=1,addr=0x00表示启动TL16C554A的读时序,产生图2中TL16C554A的片选信号CSx(cs_num=0x0000,产生的CSx信号对应第1片C54的CSA),读信号IOR,并将控制字中的地址addr按照时序要分别输出到C54的IOR、CSA、A2、A1、A0的管脚上,由状态机根据图2时序要求从D7~D0读取1个字节的数据。读时序完成后,控制字所指定地址(0x00,接收缓冲寄存器RBR)的1个字节数据就到达FPGA中DSP数据指针(*DATA_FROM_C54)所指定的空间;
[0102] 12:DSP通过指针(*DATA_FROM_C54)读取1个字节的值,即RBR中的数据,也就是控制字中cs_num所对应串口收到的数据;
[0103] 13:判断第6步中的循环计数器是否等于31,如果不等于跳到第6步继续执行;否则,跳到下一步执行;
[0104] 14:当所有串口数据都被读取后,8片C54的中断信号INTA、INTB、INTC、INTD都被置低,RXRDY_n被拉高,FPGA中的中断状态机复位,DSP跳出中断服务程序,等待下次中断触发。
[0105] 使用本方法扩展串口接收数据,32个串口参数配置相同,波特率均为TL16C554A最大波特率1Mbps,1个起始位,8个数据位,1个停止位,无奇偶校验位。当32个串口同时向DSP发送1个字节数据,最短的时间T=10bit×10^9/1Mbps=10000ns,则对于本扩展方式而言要在时间T内将32个串口的数据全部收到。
[0106] 使用本方法扩展串口,FPGA内部采用40M时钟频率,时钟周期为25ns。对于FPGA中产生TL16C554A时序的状态机,产生读时序需要6个时钟周期共计150ns,产生写时序需要5个时钟周期共计125ns。DSP处理器TMS320C6713B对异步存储器读写时参照外部总线的时钟频率,按照100M时钟频率,时钟周期10ns计算。配置FPGA对应片选信号CE3为异步时序,初始化CE3外部扩展总线EMIF寄存器使读或写时序保持时间均为1个周期,则在10ns内DSP就可以完成一次异步存储器的读或写操作,从FPGA读取两个字节数据。
[0107] 通过以上计算,当DSP进入中断服务程序时,读取两个自定义C54的中断标志寄存器需要20ns。从1个串口读取1个字节的数据,即通过FPGA读TL16C554A数据缓存寄存器RBR,DSP需要写1次控制字,读1次数据缓冲寄存器RBR,所需要的时间150ns+10ns+125ns+10ns=295ns。同时读取32个串口数据所需要的时间t=20ns+295ns×32=9460ns,在时间t内DSP即可完成从32个串口同时读1字节的数据。显然,DSP处理32个串口同时收到1字节的数据所需要的时间t小于32个串口以1Mbps同时发送1个字节数据最短时间T,从而证明本设计扩展方法的可行性。
[0108] 实施例2
[0109] 如图6为DSP处理器外扩展32个串口的一种实施方式。其中,FPGA选择EP2C50F484I8,其可用IO有294个,满足8片TL16C554A与FPGA相连接所需要的184个IO和DSP与FPGA相连的29个IO需求。FPGA晶振的时钟频率采用40MHz。
[0110] FPGA占用DSP片选信号CE3对应地址空间中5个双字节地址,0xB0000000、0xB0000002、0xB0000004、0xB0000006和0xB0000008,分别用于控制字CTRL_WORD_C54指针、发送数据DATA_TO_C54指针、接收数据DATA_FROM_C54指针,以及两个自定义中断标志寄存器指针C54_INT_REG0和C54_INT_REG1。FPGA根据CE3、低8位地址线、DSP读信号线、DSP写信号线完成对这三个地址指针译码,并从DSP的低16位数据线上读数据或将数据通过16位数据线发送给DSP。通过这三个地址和相关控制信号完成与DSP的通信。