发明内容
本发明的目的在于,针对上述问题,提出一种基于高速串行总线的通用DMA结构及预读方法,以实现数据传输快并且响应快的优点。
为实现上述目的,本发明采用的技术方案是:
一种基于高速串行总线的通用DMA结构,包括负责DMA数据读写的LIS总线、提供DMA数据发送与接收的StreamLink(为快速数据传输所设计的高速数据总线)接口、DCR寄存器、DMA控制模块以及DCR寄存器访问接口DCR总线;
所述DCR寄存器:负责DMA状态检测,寄存器管理;
所述DMA控制模块:负责DMA控制逻辑。
根据本发明的优选实施例,所述DMA控制模块包括端口状态机、RX状态机、TX/RX仲裁器和TX状态机;
所述端口状态机:为DMA的核心控制端;所有的描述符读写控制和数据读写控制都在端口状态机中进行,主要功能是负责完成从TX/RX仲裁器发来的读写请求,
所述RX状态机:控制发起操作请求,包括从内存中读描述符,或通过StreamlLink接口收集数据和写数据到内存,将描述符状态回写到内存;
所述TX状态机:是控制发起操作请求,包括从内存读描述符,从内存读数据发送到StreamlLink发送接口,或者写完成状态和应用程序定义数据回到内存。
TX/RX仲裁器的主要功能是对RX状态机发起的操作和TX状态机发起的操作进行仲裁,将操作按读操作和写操作分类,并决定接收谁的操作请求。
根据本发明的优选实施例,所述DCR寄存器包括寄存器文件仲裁器、DCR接口和中断寄存器;
所述寄存器文件仲裁器:对寄存器中的文件访问次序进行裁决,一次只允许一个状态机访问;
所述中断寄存器:中断控制/状态寄存器
所述DCR接口:上述寄存器文件仲裁器通过DCR接口访问寄存器。
同时本发明还公开一种DMA结构的数据读方法,所述数据读取分为TX操作和RX操作,所述TX操作和RX操作采用双工并行的方式,其具体步骤如下:
所述TX操作:主机通过DCR接口设置TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器,设置当前描述符地址和结尾描述符地址;
DMA的TX状态机比较上述TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器中的当前描述符地址和结尾描述符地址,如上述当前描述符地址和结尾描述符地址不同,所述TX状态机则发送读描述符操作给端口状态机;
上述端口状态机从LIS总线上读取描述符,并读取描述符所对应的数据,然后将上述数据发送到TX_streamlink接口上;
上述TX状态机发出写描述符请求,即由上述端口状态机将寄存器文件更新,上述写描述符状态通过LIS接口回写到所述主机,并对上述TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器中的当前描述符地址进行更新;
所述TX状态机重新比较上述TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器中当前描述符地址与尾地址是否相同,如果上述两个地址不同,则继续发起TX操作请求,直到两地址相同为止;
所述RX操作:由主机通过DCR接口设置RX_CURBUF_PTR寄存器和RX_TAILDESC_PTR寄存器,设置当前描述符地址和结尾描述符地址;
DMA的RX状态机比较上述RX_CURBUF_PTR寄存器和RX_TAILDESC_PTR寄存器当前描述符地址和结尾描述符地址,如上述两个地址不同,则所述RX状态机发起读描述操作给端口状态机;
上述端口状态机从LIS总线上读取描述符,并接收RX_streamlink接口上的数据,通过LIS总线接口将数据写到描述符指定的数据地址里;
所述TX状态机对上述TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器中的描述符更新,并比较上述TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器中的当前描述符与尾描述符地址,如果上述两个地址不同,则继续发起RX操作请求,直到上述两地址相同为止。
根据本发明的优选实施例,所述TX状态机读取描述符,包括以下步骤:
步骤1:判断TX状态机是否处于空闲状态,若处于空闲状态则由主机通过DCR写TX描述符寄存器,TX状态机检测TX寄存器,
步骤2:如果检测到TX寄存器中当前描述符与结尾描述符不同,则发送一个CL8R(读描述符)请求给TX/RX仲裁器,该CL8R请求完成后,将寄存器的完成读描述符功能位置为完成读描述符状态;
步骤3:连续发送几个B16R(读数据)请求给TX/RX仲裁器,直到描述符中要求传输的数据全部从内存读出并发送到StreamLink接口,然后将寄存器的完成数据位置位;
步骤4:所述TX状态机发送一个CL8W(写描述符)请求给TX / RX仲裁器,将完成状态信息写回内存,在完成CL8W请求之后,将寄存器的继续信号置位或者将寄存器的停止信号置位,如果状态寄存器显示下一个描述符指针不是一个空指针和未设置停止结束位,则将寄存器的继续信号置位并将状态机转换到取得描述符状态,否则将寄存器的停止信号置位并将TX状态机转换到空闲状态。
根据本发明的优选实施例,所述RX状态机读取描述符,包括以下步骤:
步骤1:判断RX状态机是否处于空闲状态,若处于空闲状态则由主机通过DCR写RX描述符寄存器,并检查RX描述符寄存器;
步骤2:如果检测到TX寄存器中当前描述符与结尾描述符不同,则发送一个CL8R请求给TX/RX仲裁器,该CL8R请求完成后,将寄存器的完成读描述符功能位置为完成读描述符状态;
步骤3:连续发送几个B16W(写数据)请求给TX/RX仲裁器,直到StreamLink接口收集到的所有数据并写入内存,将寄存器的完成数据位置位;
步骤4:所述RX状态机发送一个CL8W的请求给TX / RX仲裁器,在完成该CL8W请求之后,将寄存器的DMA继续位置位或者将寄存器的DMA停止位置位,如果状态寄存器显示下一个描述符指针不是一个空指针和未设置停止结束位,则将寄存器的DMA继续位置位并将状态机转换到取得描述符状态,否则将寄存器的DMA停止位置位并将RX状态机转换到空闲状态。
根据本发明的优选实施例,所述端口状态机读取描述符并将数据发送到TX_streamlink和RX_streamlink接口上,包括以下步骤:
步骤1:判断端口状态机是否处于空闲状态,如端口状态机处于空闲状态,则TX/RX仲裁器发出一个CL8R请求或者B16W请求;
步骤2:所述端口状态机根据上述的CL8R请求或者B16W请求访问寄存器文件中的缓冲区地址和缓冲区长度寄存器;
步骤3:若上述CL8R请求或者B16W请求被接受, 则上述端口状态机将缓冲区地址和缓冲区长度计数器的值从寄存器文件载入;
步骤4:如果所述端口状态机从上述缓冲区载入的地址和数据没有错误,则计数器载入缓冲区的地址和长度计数器的值,然后所述端口状态机发出一个CL8R或者B16W请求,若这个请求被接受,读端口状态机可以转换到步骤5或步骤9两个状态中的其中一个;
步骤5:若接受 CL8R请求,则上述端口状态机在设置控制信号去读取一个描述符;并等待端口状态机上的RdDataRdy的信号被置位;
步骤6:若RdDataRdy的信号被置位,则所述端口状态机请求访问寄存器文件,从PCIE卡的读FIFO中获取下个描述符指针、缓冲区地址、缓冲区长度寄存器以及状态寄存器值,并将描述符指针、缓冲区地址、缓冲区长度寄存器以及状态寄存器值存储在状态寄存器;
步骤7:所述端口状态机清空寄存器中的描述符,等待StreamLink接口接收DMA数据,如StreamLink接口接收到Dst_Rdy信号,则所述端口状态机转换到空闲状态;
步骤8:若接受B16Ws请求,则上述端口状态机设置控制信号从内存读数据传输到StreamLink接口,并将数据存储到寄存器,端口状态机请求访问寄存器文件,如果访问被接受,上述缓冲区地址和缓冲区长度寄存器的值更新为下一次缓冲区地址和缓冲区长度寄存器的值,然后读取内存中的数据并将该数据发送到StreamLink接口;
步骤9:如所有的数据获取完成或者被重置,所述端口状态机就清空所有数据;
步骤10,如数据的最后一个字符被StreamLink接口识别,则端口状态机回到空闲状态。
本发明的技术方案提供一种DMA架构,并采用读取描述符的方法,并将描述符集中读取中描述符列表中,提前对描述符进行预读,然后根据预读的描述符命令进行数据的读写,从而达到了数据传输快并且响应快的目的。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
具体实施方式
以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
实施例一:
如图1至图3所示,一种基于高速串行总线的通用DMA结构,包括负责DMA数据读写的LIS总线、提供DMA数据发送与接收的StreamLink(为快速数据传输所设计的高速数据总线)接口、DCR寄存器、DMA控制模块以及DCR寄存器访问接口DCR总线;
DCR寄存器:负责DMA状态检测,寄存器管理;
DMA控制模块:负责DMA控制逻辑。
其中DMA控制模块包括端口状态机、RX状态机、TX/RX仲裁器和TX状态机;
端口状态机:为DMA的核心控制端;所有的描述符读写控制和数据读写控制都在端口状态机中进行, 完成从TX/RX仲裁器发来的读写请求;
所述RX状态机:从内存中读描述符,或通过StreamlLink接口收集数据和写数据到内存,将描述符状态回写到内存;
所述TX状态机:是控制发起操作请求,包括从内存读描述符,从内存读数据发送到StreamlLink接口,并将描述符状态回写到内存中,或者写完成状态和应用程序定义数据回到内存。
TX/RX仲裁器:对TX状态机和RX状态机读写描述符或数据的次序进行裁决,一次只允许一个读或写操作通过,主要功能是对RX状态机发起的操作和TX状态机发起的操作进行仲裁,将操作按读操作和写操作分类,并决定接收谁的操作请求。
DCR寄存器包括寄存器文件仲裁器、DCR接口和中断寄存器;
寄存器文件仲裁器:对寄存器中的文件访问次序进行裁决,一次只允许一个状态机访问;
中断寄存器:中断控制/状态寄存器;
DCR接口:寄存器文件仲裁器通过DCR接口访问寄存器。
如图 2所示,DMA上端接口LIS总线负责DMA数据读写,下端StreamLink 接口提供发送与接收独立,全双工接口。还包括DMA寄存器访问接口DCR总线,主要负责DMA状态检测,寄存器管理功能。DMA控制部分主要完成DMA控制逻辑,包括DMA初始化,描述符预读与控制,中断管理等。 StreamLink接口为下端提供一个全双工,发送接口与接收接口。
DMA读写pipeline方法:
DMA读写提供pipeline方式:
读过程:DMA可以连续发几个读请求,然后接收读响应的数据。
写过程:DMA可以连续发写请求的同时,发送写数据。
DMA读写提供两个参数如下:
Brust_num: 最大数据突发长度
Pipeline_num: 最大流水线深度
最大数据突发长度是指一次读或写请求,最大能请求多少字节。最大流水线深度是指最多可以连续发多少个读或写请求。
两个参数可以动态设置,以便适应不同的高速串行总线接口和不同的应用。高速串行总线的每次数据传输,都需要经历组包、校验、编码、串行化等过程,传输延时比较大。如果DMA读写可以支持流水线方式,数据传输就可以形成流水线,数据传输就能无间隔,可以充分利用高速串行总线的高带宽,同时也避免传输延时造成的效能浪费。
DMA中寄存器说明如下:
表一:寄存器说明表:
TX为发送通道寄存器,RX为接收通道寄存器。
NXTDESC_PTR:下一个描述符缓存地址,复位值为0。
NXTDESC_PTR_64UP: 下一个描述符缓存地址64位地址的高32位,复位值为0。
CURBUF_ADDR: 当前数据缓存地址,复位值为0。
CURBUF_ADDR_64UP: 当前数据缓64位地址的高32位,复位值为0。
CURBUF_LEN:数据缓存长度,复位值为0。
CURBUF_PTR:当前描述符缓存地址,复位值为0。
CURBUF_PTR_64UP: 当前描述符缓存地址64位地址的高32位,复位值为0。
TAILDESC_PTR: 末尾描述符缓存地址,复位值为0。
TAILDESC_PTR_64UP:末尾描述符缓存地址64位地址的高32位,复位值为0。
CHNL_CTRL:控制寄存器,复位值为0。
表二: IRQ控制寄存器功能位说明表
表三:IRQ_REG状态寄存器功能位说明表:
表四:CHNL_STS寄存器功能位说明表:
表五: 描述符说明表
如图1所示是DMA的设计框图:上端接口LIS总线100负责DMA数据读写,下端接口是StreamLink 接口,分为RX接口103和TX接口104,提供独立的数据流模式的发送与接收,全双工接口。还包括DCR寄存器101,DMA寄存器访问接口DCR总线,主要负责DMA状态检测,寄存器管理功能。DMA控制模块102主要完成DMA控制逻辑,包括DMA初始化,描述符预读与控制,中断管理等。
以PCIE压缩卡为例, DMA的用法如下,PCIE是在计算机系统中应用十分广泛的一种高速串行总线。PCIE压缩卡主要用于数据压缩的硬件加速。设计框图如图2所示:
1.DMA模块106上端LIS总线接PCIE端点逻辑模块105,下端StreamLink总线接压缩计算单元模块107。DMA支持32位和64位PCIE总线。
2. PCIE压缩卡最大到PCIE gen2,4lane,PCIE带宽为2GB/s。一般情况下PCIE的最大读请求长度为512字节,最大写数据长度为512字节,读完成数据长度64字节。根据PCIE的特点,DMA读写参数设置如下:
Brust_num: 设置为9,一次读或写请求为512字节。
Pipeline_num: 设置为8,读或写请求最大可以连续发送8个。
这2个参数可以使PCIE读写以流水线的方式运行,中间无间断,使PCIE的运行达到最佳的效率。
3.PCIE每次的读或写,从发出到对端收到需要将近1us的时间,而并行总线PCI只需几个时钟,不到100ns。针对这种特性,除了增加上述的读写流水线支持,还可以通过增加描述符预读来提高性能。软件驱动可以将描述符链接起来形成一个环。软件异步分配描述符任务,DMA发现超过1个描述符的任务可做,就会一次取多个描述符到本地的RAM内。当读写通道完成一个任务后,无需等待读描述符,就可以直接在本地RAM中取描述符,进入下个任务继续读写操作。
如图3是DMA内部具体的结构框图,显示了DMA内部各种相互关联的状态机,包括端口状态机108(PORT_SM)、RX状态机109(RX_SM)、TX/RX仲裁器110(TX/RX Arbiter)、TX状态机111(TX_SM)、TX数据流模块112(TxStreamLink)、RX数据流模块模块113(RxStreamLink)、DCR接口114、中断寄存器115和寄存器文件仲裁器116。
端口状态机108是DMA的主要控制端,包括2个状态机(第一读状态机和第一写状态机),主要功能是负责完成从TX/RX仲裁器110 发来的读写请求,由于共享寄存器文件资源彼此互动密切,为DMA的核心控制端;所有的描述符读写控制和数据读写控制都在端口状态机中进行。
RX状态机109的主要功能是控制发起操作请求,包括:从内存读描述符,从StreamlLink接口收集数据和写数据到内存,或者写完成状态和应用程序定义数据回到内存。
TX/RX仲裁器110的主要功能是对RX状态机109发起的操作和TX状态机111发起的操作进行仲裁,将操作按读操作和写操作分类,并决定接收谁的操作请求。
TX状态机111的主要功能,是控制发起操作请求,包括从内存读描述符,从内存读数据发送到StreamlLink发送接口,或者写完成状态和应用程序定义数据回到内存。
TX数据流模块112从内存取数据,通过StreamLink接口发送数据。
RX数据流模块模块从StreamLink接口接收数据,将数据存入内存。
中断寄存器115是中断控制/状态寄存器。
实施例二:
一种DMA结构数据预读方法,分为TX操作和RX操作, TX操作和RX操作采用双工并行的方式,其具体步骤如下:
TX操作:主机通过DCR接口设置TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器,设置当前描述符地址和结尾描述符地址;
DMA的TX状态机比较TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器中的当前描述符地址和结尾描述符地址,如当前描述符地址和结尾描述符地址不同, TX状态机则发送读描述符操作给端口状态机;
端口状态机从LIS总线上读取描述符,并读取描述符所对应的数据,然后将数据发送到TX_streamlink接口上;当前描述符的任务完成,TX状态机发出写描述符请求,即更新描述符的状态;
TX状态机发出写描述符请求,即由上述端口状态机将寄存器文件更新,写描述符状态通过LIS接口回写到所述主机,并对TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器中的当前描述符地址进行更新;
TX状态机重新比较TX_CURBUF_PTR寄存器和TX_TAILDESC_PTR寄存器中当前描述符地址与尾地址是否相同,如果两个地址不同,则继续发起TX操作请求,直到两地址相同为止;
RX操作:由主机通过DCR接口设置RX_CURBUF_PTR寄存器和RX_TAILDESC_PTR寄存器,设置当前描述符地址和结尾描述符地址;
DMA的RX状态机比较RX_CURBUF_PTR寄存器和RX_TAILDESC_PTR寄存器当前描述符地址和结尾描述符地址,如两个地址不同,则RX状态机发起读描述操作给端口状态机;
端口状态机从LIS总线上读取描述符,并接收RX_streamlink接口上的数据,通过LIS总线接口将数据写到描述符指定的数据地址里;
RX状态机对RX_CURBUF_PTR寄存器和RX_TAILDESC_PTR寄存器中的描述符更新,并比较RX_CURBUF_PTR寄存器和RX_TAILDESC_PTR寄存器中的当前描述符与尾描述符地址,如果两个地址不同,则继续发起RX操作请求,直到两地址相同为止。
如图4所示,TX状态机读取描述符,包括以下步骤:
步骤1:判断TX状态机是否处于空闲状态,若处于空闲状态则由主机通过DCR写TX描述符寄存器,TX状态机检测TX寄存器,
步骤2:如果检测到TX寄存器中当前描述符与结尾描述符不同,则发送一个CL8R(读描述符)请求给TX/RX仲裁器,该CL8R请求完成后,将寄存器的完成读描述符功能位置为完成读描述符状态;
步骤3:连续发送几个B16R(读数据)请求给TX/RX仲裁器,直到描述符中要求传输的数据全部从内存读出并发送到StreamLink接口,然后将寄存器的完成数据位置位;
步骤4:所述TX状态机发送一个CL8W(写描述符)请求给TX / RX仲裁器,将完成状态信息写回内存,在完成CL8W请求之后,将寄存器的继续信号置位或者将寄存器的停止信号置位,如果状态寄存器显示下一个描述符指针不是一个空指针和未设置停止结束位,则将寄存器的继续信号置位并将状态机转换到取得描述符状态,否则将寄存器的停止信号置位并将TX状态机转换到空闲状态。
如图5所示;RX状态机读取描述符,包括以下步骤:
步骤1:判断RX状态机是否处于空闲状态,若处于空闲状态则由主机通过DCR写RX描述符寄存器,并将检查RX描述符寄存器;
步骤2:如果检测到TX寄存器中当前描述符与结尾描述符不同,则发送一个CL8R请求给TX/RX仲裁器,该CL8R请求完成后,将寄存器的完成读描述符功能位置为完成读描述符状态;
步骤3:连续发送几个B16W(写数据)请求给TX/RX仲裁器,直到StreamLink接口收集到的所有数据并写入内存,将寄存器的完成数据位置位;
步骤4:所述RX状态机发送一个CL8W的请求给TX / RX仲裁器,在完成该CL8W请求之后,将寄存器的DMA继续位置位或者将寄存器的DMA停止位置位,如果状态寄存器显示下一个描述符指针不是一个空指针和未设置停止结束位,则将寄存器的DMA继续位置位并将状态机转换到取得描述符状态,否则将寄存器的DMA停止位置位并将RX状态机转换到空闲状态。
如图6所示;端口状态机读取描述符并将数据发送到TX_streamlink和RX_streamlink接口上,包括以下步骤:
步骤1:判断端口状态机是否处于空闲状态,如端口状态机处于空闲状态,则TX/RX仲裁器发出一个CL8R请求或者B16W请求;
步骤2:所述端口状态机根据上述的CL8R请求或者B16W请求访问寄存器文件中的缓冲区地址和缓冲区长度寄存器;
步骤3:若上述CL8R请求或者B16W请求被接受, 则上述端口状态机将缓冲区地址和缓冲区长度计数器的值从寄存器文件载入;
步骤4:如果所述端口状态机从上述缓冲区载入的地址和数据没有错误,则计数器载入缓冲区的地址和长度计数器的值,然后所述端口状态机发出一个CL8R或者B16W请求,若这个请求被接受,读端口状态机可以转换到步骤5或步骤9两个状态中的其中一个;
步骤5:若接受 CL8R请求,则上述端口状态机在设置控制信号去读取一个描述符;并等待端口状态机上的RdDataRdy的信号被置位;
步骤6:若RdDataRdy的信号被置位,则所述端口状态机请求访问寄存器文件,从PCIE卡的读FIFO中获取下个描述符指针、缓冲区地址、缓冲区长度寄存器以及状态寄存器值,并将描述符指针、缓冲区地址、缓冲区长度寄存器以及状态寄存器值存储在状态寄存器;
步骤7:所述端口状态机清空寄存器中的描述符,等待StreamLink接口接收DMA数据,如StreamLink接口接收到Dst_Rdy信号,则所述端口状态机转换到空闲状态;
步骤8:若接受B16Ws请求,则上述端口状态机设置控制信号从内存读数据传输到StreamLink接口,并将数据存储到寄存器,端口状态机请求访问寄存器文件,如果访问被接受,上述缓冲区地址和缓冲区长度寄存器的值更新为下一次缓冲区地址和缓冲区长度寄存器的值,然后读取内存中的数据并将该数据发送到StreamLink接口;
步骤9:如所有的数据获取完成或者被重置,所述端口状态机就清空所有数据;
步骤10,如数据的最后一个字符被StreamLink接口识别,则端口状态机回到空闲状态。
DMA方法读取如下,在DMA内部实现一个512字节深度的内部Ram作为描述符缓存。计算公式如下:描述符尾指针与当前指针差值为描述符差值
1)等于64字节,读描述请求数据长度为64字节。
2)大于64字节,小于512字节,读描述请求数据长度为差值。
3)大于512字节,读描述请求数据长度为512字节。
当描述符差值大于64字节,表示DMA可以预读描述符,将多个小数据块读合并成大数据块读,可以减少读请求的次数。同时,消除两个DMA任务之间因为读描述符的延时等待,提高DMA的工作效率。
在DMA内部增加一个ram作为描述符的缓存,这样DMA就可以直接从ram中读取描述符再存入内存中,这样就避免了一个描述符读取完之后存入内存再读一个描述符之间的任务等待时间,减少了任务的等待时间。
如果内存的描述符列表只有一个描述符,那就不需要预读;如果描述符列表内的描述符数量大于1,那就要预读。最多预读多少个描述符,决定于缓存的大小,我们设置的描述符预读的最大值是8个。
如图4所示是RX_状态机的读取流程图:
判断RX状态机是否处于空闲状态,若处于空闲状态则CPU发出一个DCR写命令给当前RX描述符指针,并将寄存器的检查DCR写位置位;
发送一个CL8R请求给TX/RX仲裁器,这个请求完成后,将寄存器的完成读描述符位置位;
发送一个连续的请求给TX/RX仲裁器,直到描述符已经从StreamLink接口收集所有指定的数据并写入内存,将寄存器的完成数据位置位;
RX状态机发送一个CL8W请求给TX / RX仲裁器,在完成CL8W请求之后,将寄存器的DMA继续位置位或者将寄存器的DMA停止位置位,如果状态寄存器显示下一个描述符指针不是一个空指针和未设置停止结束位,则将寄存器的DMA继续位置位并将状态机转换到取得描述符状态,否则将寄存器的DMA停止位置位并将状态机转换到空闲状态;
如图5所示的是TX_状态机读的流程图,包括以下步骤:
步骤1是TX状态机处于空闲状态,当CPU发出一个DCR写命令给当前RX描述符指针,寄存器检查DCR写功能位置位,执行然后步骤2取描述符,发送一个CL8R请求给TX/RX仲裁器,当这个请求完成后,置读描述符完成功能位,之后继续执行步骤3取/存数据,发送一个连续的请求给TX/RX仲裁器,直到描述符已经从StreamLink接口收集所有指定的数据和写入内存,寄存器数据完成置位,最后执行步骤4存描述符,RX状态机发送一个CL8W请求给TX / RX仲裁者。在完成CL8W请求之后,寄存器继续功能位置位或者置寄存器停止功能位置位。如果状态寄存器显示下一个描述符指针不是一个空指针和未设置停止结束位,然后置继续功能位和将状态机转换到取描述符状态,否则置停止功能位和状态机转换到空闲状态。
如图6所示的是状态机读的流程图,包括以下步骤:
步骤5:首先状态机处于空闲状态,
TX/RX仲裁器发出一个CL8R请求或者B16R请求,
步骤6:状态机就进入请求配置,状态机请求访问寄存器文件中的缓冲区地址和缓冲区长度寄存器。一旦请求被接受,状态机就进入到步骤7配置, 缓冲区地址和缓冲区长度计数器从寄存器文件载入。如果没有错误,一旦计数器载入,读状态机就执行步骤8读地址应答,然后发出一个CL8R或者B16R请求,一旦这个请求被接受,读状态机可以转换到以下两个状态中的其中一个,第一个是进入步骤9等待CL8R读地址应答,步骤9等待CL8R读地址应答是CL8R和设置控制信号去读一个描述符。第二个是进入步骤16请求存储, 在B16Rs设置控制信号从内存读数据传输到StreamLink接口。一旦读状态机停留在步骤9等待读地址请求CL8R,它会等待直到端口接口的RdDataRdy位被置,这个信号表示在端口接口的数据可用,然后就执行步骤10请求读描述符,状态机请求访问寄存器文件。一旦请求被接受,就进入步骤11读描述符,从PCIE读FIFO中获取下个描述符指针,缓冲区地址以及缓冲区长度。继续执行步骤12读描述符的状态寄存器,从PCIE读FIFO中获取状态寄存器值。一旦该数据被存储在状态寄存器,读状态机就转换到步骤13完成读描述符,当端口接口发出RdComp信号(都完成信号),就进入步骤14清空读描述符,等待StreamLink接口准备好接收DMA数据。一旦从接口接收到Dst_Rdy信号,读状态机转就转换到步骤15空闲状态。如果读状态机是WAIT_ADDRACK状态,读取的数据是从StreamLink传送的,在端口接口识别B16R请求后进入步骤16请求存储,状态机请求访问寄存器文件,如果访问被接受,就进入步骤17存储,缓冲区地址和缓冲区长度寄存器的更新将被用于下一次缓冲区地址和缓冲区长度寄存器的DMA事务请求。在这次事务中,缓冲区地址从内存读取的字节数递增,缓冲区长度从内存读取的字节数递减。在这些寄存器更新后,读状态机就转换到步骤18激活TX,数据从内存读然后发送到Tx StreamLink。一旦所有的数据从PCIE读FIFO中获取完成或者被重置,读状态机就进入步骤19清空TX的流水线。在步骤19中,一旦数据的最后一个字符已经被StreamLink接口识别,就回到步骤5空闲状态。
如图7所示是状态机写的流程图,步骤如下:
步骤20是状态机处于空闲状态,依据TX/RX仲裁器的不同类型的请求,写状态机可以转换成以下三种状态之一。如果TX/RX仲裁器发出一个CL8W请求和且此请求是来自于Footer状态的RX模块,状态机就转换到步骤21激活RX。如果TX/RX仲裁器发出一个B16W请求和RX端在Payload状态,状态机就转换到步骤22请求PRESETUP。在步骤22请求PRESETUP(准备配置)中,状态机请求访问寄存器文件,一旦请求被接受,状态机就切换进入步骤24PRESETUP,在步骤24PRESETUP中,缓冲区地址和缓冲区长度计数器被装入寄存器文件。一旦这些计数器被载入,状态机就转换到步骤21激活RX。在步骤21激活RX中,状态机等待从RX StreamLink的Payload或Footer数据被存入PCIE的写FIFO。如果Footer数据被存入PCIE的写FIFO中。步骤25请求配置的请求访问寄存器文件,一旦访问被接受,写状态机就转换到步骤26配置。在步骤26配置中,状态寄存器被更新,然后写状态机就转换到步骤27等待写地址应答。在步骤27等待写地址应答中,端口发出一个写请求,一旦请求被接受,状态机可以转换成以下2中状态之一。如果是一个B16W请求,状态机转换到步骤28请求存储。如果是一个CL8W请求,状态机转换到步骤29请求更新PNTR(指针地址寄存器)。在步骤28请求存储中,状态机请问访问寄存器文件,一旦访问被接受,就转换到步骤30存储。步骤30存储中,缓冲区地址和缓冲区长度寄存器的更新将被用于下一次缓冲区地址和缓冲区长度寄存器的DMA事务请求。这些寄存器更新之后,写状态机就转换到步骤33空闲。如果写状态机从步骤27等待写地址应答到步骤29请求更新PNTR,状态机请求访问寄存器文件,一旦访问被接受,状态机转换到步骤31更新PNTR。在步骤31更新PNTR中,下一个描述符指针寄存器从寄存器文件获取,然后状态机转换到步骤32更新PNTR2,步骤32中执行的是下一个描述符指针寄存器被装载到当前描述符指针寄存器,然后状态机就转换到步骤33空闲。
如图8,图9和图10所示描述了Producer和Consumer模式,步骤如下:
Producer寄存器和Consumer寄存器初始值都是0,Comparator比较器,根据Producer寄存器和Consumer寄存器的值是否相同来判断是否需要发送中断请求给主机。
步骤34表示Host主机是初始化状态,没有任何操作,步骤35是主机发送请求给DMA,步骤36表示DMA也是初始化状态,没有任何操作, 步骤37是Consumer寄存器中的值为0,步骤38是Producer寄存器中的值为0。
步骤39是Host主机把准备好的描述符放入描述符列表中,然后步骤40是主机发送请求给DMA,然后DMA完成描述符任务,步骤41是DMA从描述符列表中取出描述符,随后步骤42将描述符任务的序列号写入到生产者寄存器中,步骤43表示消费者寄存器中的值保持0不变,但是经过步骤39生产者寄存器更新之后,步骤42是生产者寄存器中的值就由0变成了对应的描述符任务的序列号。这样生产者寄存器和消费者寄存器中的值就不相同了,步骤44就是DMA发送中断请求给主机。主机收到中断请求之后就会检查对应的序列号的描述符任务是否已经完成,如果确认完成,步骤45就将完成的描述符任务中的序列号写入到消费者的寄存器中,消费者寄存器中的值也由0更新到描述符任务的序列号,这样生产者寄存器中的值就与消费者寄存器中的值相同,中断就被清掉,然后如此循环直到完成。
说明:
DMA:Direct Memory Access (直接内存访问)。
PCIE:PCI Express是电脑总线PCI的一种,它沿用了现有的PCI编程概念及通讯标准,但建基于更快的串行通信系统。
StreamLink: 为快速数据传输所设计的高速数据总线。
B16W: Burst 16 word ( 16个32bit的描述符)。
CL8W:CacheLine 8 word (8个32bit的描述符)。
PRESETUP: 准备配置。
Brust_num:最大数据突发长度;
Pipeline_num:最大流水线深度,最大数据突发长度是指一次读或写请求,最大能请求多少字节。最大流水线深度是指最多可以连续发多少个读或写请求。
最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。