一种复用性强的FIFO控制模块及其管理内存的方法
技术领域
本发明涉及计算机领域的存储器控制技术,具体涉及一种复用性强的FIF0控制模块及其管理内存的方法。
背景技术
随着片上系统(SOC)芯片的技术发展,一颗芯片上集成的模块对存储器(包括片内内存与片外存储器)的需求也越来越多,因此如何更加高效的使用内存就显得相当的重要,先入先出(First In First Out,以下简称为FIFO)控制模块在实际应用中有相当高的使用频率,其可以提供非常高效的内存使用方式。一般来说,片上系统芯片中会有两个模块同时访问FIFO控制模块控制的内存,一个进行只读操作,一个进行只写操作,该内存访问方式主要有如下2种:(1)该内存是上述两个模块的专用内存,不能被其余模块访问,其逻辑框图如图1所示;(2)该内存是可以通过总线访问的共享内存,其逻辑框图如图2所示。
由于第一种方式的内存不能共享给其它模块,因此当FIFO控制模块不被使用时,会对内存造成一定的浪费。对于第二种内存使用方式,目前一般的设计方法是在总线仲裁模块中加入专门处理该FIFO控制的逻辑,通过该逻辑来控制和管理内存的使用情况,但由于总线控制模块在不同的芯片设计中会发生很大的变化,因此,这种处理方法针对于不同的芯片需要重新进行设计和验证,复用能力低下,不能适应当今芯片技术的发展需求。
发明内容
本发明的目的在于针对现有技术的缺陷,提供一种具有很强复用性的FIFO控制模块,以适应不同类型芯片的需求,同时,本发明还要提供这种FIFO控制模块管理内存的方法。
本发明的技术方案如下:一种复用性强的FIFO控制模块,包括如下组成结构:
--FIFO主控模块,用于接收总线仲裁模块发送来的内存读写信号,并根据读写指针控制模块所给出的读写指针位置向总线仲裁模块发出读写请求;
--FIFO控制寄存器,用于外部设置FIFO所用内存的信息,并将这些信息传递给读写指针控制模块和中断产生模块;
--读写指针控制模块,用于计算读写指针位置,并将读写指针位置传递给FIFO主控模块;
--中断产生模块,用于根据当前的读写指针位置和设置在FIFO控制寄存器中的基本空/满阈值信息,产生中断;
其中,FIFO主控模块与读写指针控制模块连接,FIFO控制寄存器分别与读写指针控制模块和中断产生模块连接。
如上所述的复用性强的FIFO控制模块,其中,FIFO主控模块通过内存接口模块和总线接口模块与总线仲裁模块连接。内存接口模块的主要接口信号包括:读写地址、读写长度、读写使能、读/写动作。
如上所述的复用性强的FIFO控制模块,其中,FIFO控制寄存器设置的内存信息包括FIFO起始地址、长度、基本空阈值、基本满阈值以及FIFO指针复位信号。
如上所述的复用性强的FIFO控制模块,其中,中断产生模块产生的中断类型包括空、满、基本空、基本满中断。
一种复用性强的FIFO控制模块管理内存的方法,包括向所管理的内存中写数据和从所管理的内存中读数据的操作,其中,针对一个模块通过一路总线发起的写操作或读操作,总线仲裁模块经过仲裁以后,通过与FIFO控制模块之间的内存访问接口来对FIFO控制模块发起一次内存写操作或读操作,FIFO控制模块再通过它与总线仲裁模块之间的总线接口发起一次内存写操作或读操作,总线仲裁模块再与其它n路总线一起经过仲裁以后向真正的内存区域中做一次写操作或读操作。
进一步,在写数据的过程中,FIFO控制模块的动作流程为:内存接口模块收到写使能信号后将写地址、写数据、写长度发送到FIFO主控模块;FIFO主控模块将写地址替换成当前写地址,发送写动作及写长度信号给读写指针控制模块,并同时将写数据、写地址、写长度传递给总线接口模块;读写指针控制模块收到FIFO主控模块发过来的写动作及写长度信号后,将写指针加写长度,当指针位置到达FIFO内存的尾部时,自动绕回到FIFO内存的头部;总线接口模块根据总线协议,产生写数据动作。
如上所述的复用性强的FIFO控制模块管理内存的方法,其中,在读数据的过程中,总线仲裁模块向真正的内存区域中发出读控制信号后,内存将读数据返回总线仲裁模块,总线仲裁模块再将这个数据通过与FIFO控制模块之间的总线接口模块返回给FIFO控制模块,然后FIFO控制模块再通过它与总线仲裁模块之间的内存接口模块将读数据返回给总线仲裁模块,从而总线仲裁模块结束等待数据过程,完成一次读数据操作。
进一步,在读数据的过程中,FIFO控制模块的动作流程为:内存接口模块收到读使能信号后将读地址、读长度发送到FIFO主控模块;FIFO主控模块将读地址替换成当前读地址,发送读动作及读长度信号给读写指针控制模块,并同时将读地址、读长度传递给总线接口模块;读写指针控制模块收到FIFO主控模块发过来的读动作及读长度信号后,将读指针减读长度,当指针位置到达FIFO内存的头部时,自动绕回到FIFO内存的尾部;总线接口模块根据总线协议,产生读数据动作,将读数据返回给FIF0主控模块;FIFO主控模块将读数据返回给内存接口模块,内存接口模块将读数据返回给总线仲裁模块。
本发明的有益效果如下:
(1)该FIFO控制模块无需任何修改就可以很方便的集成到各个SOC系统中去,使设计、验证的工作量大大降低,该系统只需要增加3个部分内容:
总线仲裁模块增加一个对FIFO的访问仲裁模块,一般来说这一模块与其他的内存仲裁基本一样,无需特殊处理;
总线仲裁模块与FIFO控制模块之间增加一条总线接口;这条总线接口和其他总线(比如总线1,总线2...)都一样;
总线仲裁模块与FIFO控制模块之间增加一个内存访问接口。
(2)由于该FIFO控制模块的数据流程是简单的顺序流动,因此该FIFO控制模块可以很容易的用多级流水线来操作,可以达到很高的运行频率。
附图说明
图1为现有技术中FIFO控制模块管理专用内存的逻辑框图。
图2为现有技术中FIFO控制模块管理共享内存的逻辑框图。
图3为本发明中FIFO控制模块管理内存的逻辑框图。
图4为本发明中FIFO控制模块的结构示意图。
图5为向FIFO控制模块所管理的内存中写数据的过程示意图。
图6为从FIFO控制模块所管理的内存中读数据的过程示意图。
图7为写数据的过程中FIFO控制模块的动作流程图。
图8为读数据的过程中FIFO控制模块的动作流程图。
具体实施方式
下面结合附图对本发明进行详细的描述。
本发明所提供的FIFO控制模块同时作为总线仲裁模块的访问主导方和被动方,作为主导方时,FIFO控制模块和一般的总线主模块具有一样的总线接口和总线访问方式;作为被动方时,FIFO控制模块模拟为一个内存模块。FIFO控制模块管理内存的逻辑如图3所示,其通过总线接口和内存访问接口与总线仲裁模块连接,总线仲裁模块与共享内存连接。
FIFO控制模块的组成如图4所示,包括如下结构:
该模块主要负责外部设置FIFO所用内存的一些信息,比如:FIFO起始地址,长度,基本空阈值,基本满阈值以及FIFO指针复位信号;并将这些信号传递给读写指针控制模块和中断产生模块。
该模块主要负责计算读写指针。当收到FIFO主控模块发过来的读/写动作、读/写长度信号后,将读写指针减/加读/写长度,在写操作中当指针位置到达FIFO内存的尾部时,需要自动绕回到FIFO内存的头部,在读操作中当指针位置到达FIFO内存的头部时,需要自动绕回到FIFO内存区域的尾部;其读写指针起始位置根据FIFO控制寄存器中设置的FIFO起始地址、长度以及FIFO指针复位信号来产生;并将读写指针位置传递给FIFO主控模块。
该模块主要负责根据当前的读写指针位置和设置在FIFO控制寄存器中的基本空/满阈值信息,产生空、满、基本空、基本满中断。
FIFO主控模块是FIF0控制模块的核心模块,其主要功能是:从内存访问接口接收总线仲裁模块发过来的内存读写信号,并根据读写指针控制模块所给的读写指针位置通过总线接口向总线仲裁模块发出读写请求;如果是读操作,当总线仲裁模块返回读数据后,还需要通过内存访问接口返回读数据给总线仲裁模块,并最终返回给读写发起模块。
FIFO内存接口模块,主要是给总线仲裁模块模拟一个内存接口,主要接口信号有:读写地址,读写长度,读写使能,读/写动作。当收到一个读/写动作信号后,该模块需要将读写地址、写数据、读写长度传递给FIFO主控模块,并且当该动作是读动作时,还需要将FIFO主控模块发过来的读数据传递给外部。
FIFO控制模块利用该接口将自身模拟为一个总线的发起方,并将真正的读写操作发送给外部总线仲裁模块。
FIFO主控模块与读写指针控制模块连接,FIFO控制寄存器分别与读写指针控制模块和中断产生模块连接;FIFO主控模块通过内存接口模块和总线接口模块与总线仲裁模块连接。
向FIFO所管理的内存中写数据的过程如图5:
模块1通过总线1发起一个写操作,总线仲裁模块经过仲裁以后,通过与FIFO控制模块之间的内存访问接口来对FIFO控制模块发起一次内存写操作,FIFO控制模块再通过它与总线仲裁模块之间的总线接口发起一次内存写操作,总线仲裁模块再与其他n路总线一起经过仲裁以后往真正的内存区域中做一次写操作。
在写数据的过程中,FIFO控制模块的动作流程如图7:
内存接口模块收到写使能信号后将写地址、写数据、写长度发送到FIFO主控模块;FIFO主控模块将写地址替换成当前写地址,发送写动作及写长度信号给读写指针控制模块,并同时将写数据、写地址、写长度传递给总线接口模块;
读写指针控制模块收到FIFO主控模块发过来的写动作及写长度信号后,将写指针加写长度,当指针位置到达FIFO内存的尾部时,自动绕回到FIFO内存的头部;总线接口模块根据总线协议,产生写数据动作。
读写指针控制模块的读写指针起始位置是根据FIFO控制寄存器中设置的FIFO起始地址、长度以及FIFO指针复位信号产生的。
由于FIFO是一个设定大小的内存区域,如果读数据方的读速率小于写数据方的写速率,该FIFO内存一定会被写满。FIFO内存被写满是一个错误状态,因为写进来的数据已经要覆盖还没有被读出的数据。这种情况的发生是由于设计人员错误的估计了读写速率差,此时,需要中断产生模块给出满中断以通知MCU来进行处理和调整。
由于FIFO控制寄存器中设置了基本满阈值,并将其传递给了中断产生模块,当达到此阈值时,中断产生模块产生基本满中断,此时,读模块收到基本满中断,然后去把FIFO内存读空,以保证读写双方的操作能够继续进行下去。
向FIFO所管理的内存中读数据的过程如图6:
模块2通过总线2发起一个读操作,总线仲裁模块经过仲裁以后,通过与FIFO控制模块之间的内存访问接口来对FIFO控制模块发起一次内存读操作(给出读数据访问请求,然后等待读数据的返回),FIFO控制模块再通过它与总线仲裁模块之间的总线接口发起一次内存读操作,总线仲裁模块再将这一路信号与其他n路总线一起经过仲裁以后往真正的内存区域中多一次读操作(给出读控制信号,包括片选,读地址等),经过若干时钟周期以后内存将读数据返回总线仲裁模块,总线仲裁模块再将这个数据通过与FIFO控制模块之间的总线接口返回给FIFO控制模块,然后FIFO控制模块再通过它与总线仲裁模块之间的内存访问接口将读数据返回给总线仲裁模块,从而总线仲裁模块结束等待数据过程,一次读数据操作完成。
在读数据的过程中,FIFO控制模块的动作流程如图8:
内存接口模块收到读使能信号后将读地址、读长度发送到FIFO主控模块;FIFO主控模块将读地址替换成当前读地址,发送读动作及读长度信号给读写指针控制模块,并同时将读地址、读长度传递给总线接口模块;读写指针控制模块收到FIFO主控模块发过来的读动作及读长度信号后,将读指针减读长度,当
指针位置到达FIF0内存的头部时,自动绕回到FIFO内存的尾部;总线接口模块根据总线协议,产生读数据动作,将读数据返回给FIFO主控模块;FIFO主控模块将读数据返回给内存接口模块,内存接口模块将读数据返回给总线仲裁模块。
一般来说,读数据方的读速率是要大于写数据方的写速率的,当FIFO内存中的数据被读空,然后又发生了一次读操作时,需要中断产生模块给出空中断,然后对读数据方进行控制,直到有数据到达才把新的数据给出。
由于FIF0控制寄存器中设置了基本空阈值,并将其传递给了中断产生模块,当达到此阈值时,中断产生模块产生基本空中断,此时,写模块收到基本空中断,然后去把FIF0内存写满,以保证读写双方的操作能够继续进行下去。
本发明所述的模块及方法并不仅限于具体实施方式中所述的实施例,本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围。