发明名称 基于FPGA和TL16C554A的多串口扩展方法
摘要 本发明提供一种基于FPGA和TL16C554A的多串口扩展方法,采用的硬件包括FPGA、n个TL16C554A芯片、n个串口电平变换芯片,FPGA与DSP通过数据总线、地址总线和控制总线相连接,FPGA作为DSP处理器的异步存储器,完成与DSP的通信,以及TL16C554A芯片的时序驱动、片选译码和中断译码。TL16C554A芯片为异步串行通信的管理单元,包括4个串口通信管理单元,能够将并行数据转换成4路的串行输出,可以实现4个串口的收发管理,能同时实现与4n个设备通讯。本方法是一种占用处理器地址空间和中断资源少,可靠性高,便于移植的多串口扩展方法。
申请公布号 CN104866452A 申请公布日期 2015.08.26
申请号 CN201510271444.3 申请日期 2015.05.19
申请人 哈尔滨工业大学(鞍山)工业技术研究院 发明人 贾建峰;王常虹;石峰;王贺年
分类号 G06F13/40(2006.01)I;G06F13/42(2006.01)I;G06F13/24(2006.01)I 主分类号 G06F13/40(2006.01)I
代理机构 代理人
主权项 一种基于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;其特征在于,具体扩展方法如下:其中,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_1 or ... ... or INT_C54_8,最后再根据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_T0_C54的指针中,即(*DATA_T0_C54)=data;(1.8):FPGA通过对DATA_T0_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.2)中保存的待发送数据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的清除而将该寄存器中对应位置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):判断第6步中的循环计数器是否等于31,如果不等于跳到第(2.6)步继续执行;否则,跳到下一步执行;(2.14):当所有串口数据都被读取后,8片TL16C554A芯片的中断信号INTA、INTB、INTC、INTD都被置低,RXRDY_n被拉高,FPGA中的中断状态机复位,DSP跳出中断服务程序,等待下次中断触发。
地址 114051 辽宁省鞍山市千山中路196号哈尔滨工业大学(鞍山)工业技术研究院