发明内容
本发明的目的在于提供一种实现芯片内部与片外主存之间多通道不连续数据直接访问的多通道数据直接内存访问系统和方法。
本发明所采用的技术方案为:这种多通道数据直接内存访问系统,包括数据处理模块、总线接口模块、片外主存和通道,其特征在于:它包括直接访问处理模块,该直接访问处理模块包括接收DMA模块和发送DMA模块,所述接收DMA模块用于接收数据处理模块处理的包数据,并经总线接口模块将数据存入片外主存,所述发送DMA模块用于将待发送的包数据从数据处理模块传至相应的通道;在接收DMA模块中具有FREE_FIFO存储器、DONE_FIFO存储器和配置RAM存储器,以及用于访问控制的控制逻辑,FREE_FIFO存储器用于存放空闲队列描述子FreeQueue Descriptor,DONE_FIFO存储器用于存放完成队列描述子DoneQueue Descriptor;在发送DMA模块中具有PENDING_FIFO存储器、DONE_FIFO存储器和配置RAM存储器,以及用于访问控制的控制逻辑,PENDING_FIFO存储器用于存放待发送队列描述子,DONE_FIFO存储器用于存放发送完成队列描述子;
所述的接收DMA模块(21)中配置用于存放空闲队列描述子的数据FIFO存储器,数据FIFO存储器用于存储从数据处理模块接收到的数据。
这种用于上述多通道数据直接内存访问系统的多通道数据直接内存访问方法,其特征在于:
在接收数据时,各通道的数据经数据处理模块的正常处理后,包数据发至接收DMA模块;接收DMA模块根据空闲队列描述子Free QueueDescriptor提供的片外主存中的空闲数据缓存区地址以及最后用于描述该缓存区的信息的包数据描述子在片外主存中的位置经总线接口模块,通过片外总线将数据存入片外主存;在发送数据时,待发送包链的数据经片外总线通过总线接口模块,在发送DMA模块产生发送完成队列描述子,CPU将需要发送的数据通过待发送包描述子和待发送队列描述子的形式写到片外主存中的待发送包数据描述子队列和待发送队列中,更新发送DMA模块中的待发送队列描述子的指针,发送DMA模块根据待发送队列描述子及待发送包数据描述子的信息,修改待发送包数据描述子和配置RAM的信息,将CPU要发送的待发送包数据串链起来,从数据处理模块传至相应的通道;
所述的包数据描述子的数据结构包括:
Data Buffer Address:数据缓存区的起始地址;
Next Descriptor Pointer:数据包下一个数据缓存区的包数据描述子指针;
Length:该数据缓存区的数据长度;
Buffer Status:数据缓存区状态,用以表示该数据缓存区里填的数据是该数据包的开始部分还是中间部分,或者最后部分;
Channel:通道号,数据属于哪个通道;
所述的接收DMA模块使用完成队列描述子Done Queue Descriptor反映接收DMA模块将数据填到空闲数据缓存区后,CPU处理时需要用到的已经填到主存里的完整的或非完整的数据包的信息;接收DMA模块中的配置RAM存储器按通道分块,用于存放接收DMA模块在从数据处理模块接收各通道数据过程中根据控制逻辑产生的有关包数据描述子等各种信息;接收DMA模块在数据包长度超过一个数据缓存区的容量时,通过包数据描述子和完成队列描述子的信息,将多个数据缓存区链接起来存放一个完整的数据包;接收DMA模块通过中断告诉CPU有数据可以处理,CPU通过接收完成队列描述子中的第一个数据缓冲区的包数据描述子指针,找到第一个数据缓存区的包数据描述子,根据其中的数据缓存区开始地址找到第一个数据缓存区,处理完第一个数据缓存区的数据后,根据第一个数据缓存区的包数据描述子中的信息找到第二个数据缓存区的包数据描述子……依此类推,直至将该数据包或要处理的数据全部处理完毕。
所述的发送DMA模块接收到CPU的信息,通知某个通道的一个待发送包链,发送DMA模块存放待发送队列描述子,待发送队列描述子反映待发送包链的第一个数据缓存区对应的包数据描述子及该待发送包链属于哪个通道,待发送队列描述子对应相应的待发包数据描述子;待发送包链的数据经片外总线通过总线接口模块,由发送DMA模块根据相应的控制逻辑产生发送完成队列描述子,存放到内部的DONE_FIFO存储器中;CPU将需要发送的数据通过待发送包描述子和待发送队列描述子的形式写到片外主存中的待发送包数据描述子队列和待发送队列中,更新发送DMA模块中的待发送队列描述子的指针,发送DMA模块读取待发送队列描述子;发送DMA模块根据待发送队列描述子及待发送包数据描述子的信息,修改待发送包数据描述子和配置RAM的信息,将CPU要发送的待发送包数据串链起来,根据待发送包数据所属通道的包数据发送情况,产生正确的状态信息放在配置RAM中,同时响应数据模块申请包数据的请求,从数据处理模块传至相应的通道。
所述的数据处理模块向发送DMA模块申请某个通道的数据时,发送DMA模块根据数据处理模块送过来的通道号从配置RAM存储器中读出数据处理模块想要申请的通道的信息,从主存中读出相应的待发包数据描述子,根据其中的信息从主存中的数据缓冲区读出数据送给数据处理模块,递减当前数据缓冲区的剩余数据量。
所述的数据处理模块如果还未等发送DMA模块将当前正在读的数据缓冲区的数据全部读出送给数据处理模块就因为内部原因而停止接收数据,要求停止当前传送,发送DMA模块停止从数据缓存区读数据,将当前读数据缓冲区地址写到配置RAM存储器该通道部分的相应信息中;待数据处理模块在其有能力接收该通道的数据的时候,向发送DMA模块申请该通道的数据,发送DMA模块从配置RAM存储器读出该通道的信息,发起向数据缓冲区读数据送给数据处理模块、递减数据缓冲区的剩余数据量。
所述的接收DMA模块中,完成队列描述子Done Queue Descriptor主要包括:需要处理的数据包或数据属于那个通道、需要处理的数据包或数据占了几个数据缓存区、需要处理的数据包或数据所占用的几个数据缓存区的第一个缓存区所对应的包数据描述子指针、需要处理的数据是否一个完整的数据包;其数据结构包括:
Descriptor Pointer:指向数据包或者包数据所占的第一个数据缓存区的包数据描述子的指针;
Channel:数据属于哪个通道;
Buffers:等待CPU处理的数据包或数据占用了几个数据缓存区;
Packet Status:包数据状态,记录在接收过程中发生错误的类型;
EOF:包结束符,表示一个数据包已结束;
在接收DMA模块中,配置RAM存储器按通道分块, 用于存放接收DAM在从数据处理模块接收各通道数据过程中产生的一些中间信息,以及CPU对各通道的配置信息,其数据结构包括:
Current Data Buufer Address:数据缓存区当前地址,由接收DMA模块(21)写入;
Current Descriptor Pointer:当前数据缓存区的包数据描述子指针,由接收DMA模块(21)写入;
Start Descriptor Pointer:CPU要处理数据的第一个数据缓存区的包数据描述子指针,由接收DMA模块写入;
Threshold:控制接收DMA模块在填了几个数据缓存区后生成一个接收完成队列描述子,由CPU写入;
Data Number:数据缓存区的数据量,由接收DMA模块写入,CPU初始化时置零;
Threshold Count:当前数据包所占用的实际数据缓存区数,由接收DMA模块写入,CPU初始化时置零;
Buffer Size:该通道数据缓存区的大小,由CPU写入;
接收DMA模块在数据包长度超过一个数据缓存区的容量时,通过Next Descriptor Pointer和EOF位,将多个数据缓存区链接起来存放一个完整的数据包;
所述的接收DMA模块中配置数据FIFO存储器,在FREE_FIFO存储器中的空闲队列描述子数目少于某个设定的门限时,根据其内部实时调整的读空闲队列指针通过总线接口控制模块从片外主存中的空闲队列:存放空闲队列描述子的缓存区,读取足够多的空闲队列描述子将FREE_FIFO存储器填满;接收DMA模块接到数据处理模块向接收DMA模块的请求,一边从数据处理模块接收数据填到数据FIFO存储器中,同时从配置RAM存储器中将该通道的信息读出。
本发明的有益效果为:在本发明中,在接收DMA模块中具有FREE_FIFO存储器、DONE_FIFO存储器和配置RAM存储器,以及用于访问控制的控制逻辑,FREE_FIFO存储器用于存放空闲队列描述子,DONE_FIFO存储器用于存放完成队列描述子,利用空闲队列描述子、完成队列描述子、配置RAM、包数据描述子等数据结构信息,用一个接收DMA模块不连续地接收各通道的数据,在接收DMA模块中配置数据FIFO存储器,在FREE_FIFO存储器中的空闲队列描述子数目少于某个设定的门限时,根据其内部实时调整的读空闲队列指针通过总线接口控制模块从片外主存中的空闲队列,以读取足够多的空闲队列描述子将FREE_FIFO存储器填满,接收DMA模块接到数据处理模块向接收DMA模块的请求,一边从数据处理模块接收数据填到数据FIFO存储器中,同时从配置RAM存储器中将该通道的信息读出,可以加快处理速度;在发送DMA模块中具有PENDING_FIFO存储器、DONE_FIFO存储器和配置RAM存储器,以及用于访问控制的控制逻辑,PENDING_FIFO存储器用于存放待发送队列描述子,DONE_FIFO存储器用于存放发送完成队列描述子,利用待发送队列描述子、发送完成队列描述子、配置RAM、待发包数据描述子的数据结构信息用一个发送DMA模块不连续地发送多通道数据,当芯片内部通过片外总线和片外主存之间进行不连续数据传送时,将各通道的连续数据从芯片内部写到片外主存中的正确位置并通知CPU作处理,可根据需要随时停止当前正在进行的数据搬移,将各通道在主存中的连续数据正确发送到各通道;本发明能经济、智能、高效地处理芯片内部和片外主存之间多通道数据的不连续数据搬移,实现芯片内部与片外主存之间多通道不连续数据直接访问。
具体实施方式
下面根据附图和实施例对本发明作进一步详细说明:
根据图1、图2、图3、图4、图5、图6、图7、图8、图9、图10、图11和图12:
在本发明中,如图1、图2和图6所示,直接访问处理模块包括接收DMA模块21和发送DMA模块22;在接收DMA模块21中具有FREE_FIFO存储器、DONE_FIFO存储器和配置RAM存储器,以及用于访问控制的控制逻辑,FREE_FIFO存储器用于存放空闲队列描述子Free QueueDescriptor,DONE_FIFO存储器用于存放完成队列描述子;
在发送DMA模块22中具有PENDING_FIFO存储器、DONE_FIFO存储器和配置RAM存储器,以及用于访问控制的控制逻辑,PENDING_FIFO存储器用于存放待发送队列描述子,DONE_FIFO存储器用于存放发送完成队列描述子;
如图1和图2所示,各通道的数据经数据处理模块1的正常处理后,包数据发至接收DMA模块21;接收DMA模块21根据空闲队列描述子FreeQueue Descriptor提供的片外主存中的空闲数据缓存区地址以及最后用于描述该缓存区的信息的包数据描述子在片外主存中的位置经总线接口模块3,通过片外总线将数据存入片外主存;空闲队列描述子FreeQueue Descriptor的数据结构如表1所示:
Free Data Buffer Address | Free Packet Descriptor Pointer |
表1
其中:
Free Data Buffer Address:片外主存中空闲数据缓存区的起始地址;
Free Packet Descriptor Pointer:包数据描述子指针,指向用于描述该数据缓存区的信息的包数据描述子在主存中的位置。
如表2所示,包数据描述子的数据结构包括:
Data Buffer Address:数据缓存区的起始地址;
Next Descriptor Pointer:数据包下一个数据缓存区的包数据描述子指针;
Length:该数据缓存区的数据长度;
Buffer Status:数据缓存区状态,用以表示该数据缓存区里填的数据是该数据包的开始部分还是中间部分,或者最后部分;
其中:000代表数据包的第一个数据缓存区;
010代表数据包的中间数据缓存区;
100代表数据包的最后一个数据缓存区;
Channel:通道号,数据属于哪个通道;
Channel | Buffer Status | Length |
Next DescriptorPointer |
表2
接收DMA模块21使用完成队列描述子Done Queue Descriptor反映接收DMA模块21在将数据填到一个或多个空闲数据缓存区后,或者将一个数据包全部填到片外主存的空闲数据缓存区后,CPU处理时需要用到的已经填到主存里的完整的或非完整的数据包的信息;
如表3所示,在接收DMA模块21中,完成队列描述子Done QueueDescriptor主要包括:需要处理的数据包或数据属于那个通道、需要处理的数据包或数据占了几个数据缓存区、需要处理的数据包或数据所占用的几个数据缓存区的第一个缓存区所对应的包数据描述子指针、需要处理的数据是否一个完整的数据包;其数据结构包括:
Descriptor Pointer:指向数据包或则包数据所占的第一个数据缓存区的包数据描述子的指针;
Channel:数据属于哪个通道;
Buffers:等待CPU处理的数据包或数据占用了几个数据缓存区;
Packet Status:包数据状态,记录在接收过程中发生错误的类型;
EOF:包结束符,表示一个数据包已结束。
EOF |
Packet Status |
Buffers |
Channel |
Descriptor Pointer |
表3
接收DMA模块21中的配置RAM存储器存储器按通道分块,用于存放接收DMA模块21在从数据处理模块1接收各通道数据过程中根据控制逻辑产生的有关包数据描述子等各种信息,利用包数据描述子记录数据缓存区的信息以及CPU在处理时知道被处理数据的信息;
如图3所示,在接收DMA模块21中,配置RAM存储器按通道分块,用于存放接收DAM在从数据处理模块1接收各通道数据过程中产生的一些中间信息,以及CPU对各通道的配置信息,其数据结构包括:
Current Data Buufer Address:数据缓存区当前地址,由接收DMA模块21写入;
Current Descriptor Pointer:当前数据缓存区的包数据描述子指针,由接收DMA模块21写入;
Start Descriptor Pointer:CPU要处理数据的第一个数据缓存区的包数据描述子,由接收DMA模块21写入;
Threshold:控制接收DMA模块21在填了几个数据缓存区后生成一个接收完成队列描述子,由CPU写入;
Data Number:数据缓存区的数据量,由接收DMA模块21写入,CPU初始化时置零;
Threshold Count:当前数据包所占用的实际数据缓存区数,由接收DMA模块21写入,CPU初始化时置零;
Buffer Size:该通道数据缓存区的大小,由CPU写入;
接收DMA模块21在数据包长度超过一个数据缓存区的容量时,通过包数据描述子和完成队列描述子的信息,将多个数据缓存区链接起来存放一个完整的数据包;接收DMA模块21在数据包长度超过一个数据缓存区的容量时,通过Next Descriptor Pointer和EOF位,将多个数据缓存区链接起来存放一个完整的数据包;接收DMA模块21中配置数据FIFO存储器,在FREE_FIFO存储器中的空闲队列描述子数目少于某个设定的门限时,根据其内部实时调整的读空闲队列指针通过总线接口控制模块从片外主存中的空闲队列:存放空闲队列描述子的缓存区,读取足够多的空闲队列描述子将FREE_FIFO填满;接收DMA模块21接到数据处理模块1向接收DMA模块21的请求,一边从数据处理模块1接收数据填到数据FIFO存储器中,同时从配置RAM存储器中将该通道的信息读出。
根据图1、图2,如图4和图5所示,如果配置RAM存储器中的Threshold Count和Data Number都为“0”,表示刚开始接收该当前通道的数据,或则接收DMA模块21在通知CPU处理该通道过去接收的数据后直到现在才接收该通道的数据,需要将数据填到一个新的数据缓冲区,接收DMA模块21从FREE_FIFO存储器读出一个空闲队列描述子,根据其中空闲数据缓存区地址Free Data Buffer Address将包数据填入数据缓存区,同时递增数据缓冲区中的数据量、实时调整写数据缓存区的地址,同时用指向该数据缓冲区的包数据描述子的包数据描述子指针更新配置RAM存储器的Current Descriptor;
如果从数据处理模块1接收的数据不足以填满一个数据缓存区,或则还没有接收到一个完整的数据包,接收DMA模块21在数据FIFO存储器为空时,结束通过总线接口模块3向数据缓冲区填数据的操作,用该数据缓存区中的当前数据量更新配置RAM存储器中的Data Number、用写数据缓冲区地址更新配置RAM存储器中的Current Data BufferAddress、该数据包目前已经占用了片外主存中的几个数据缓存区更新配置RAM存储器中的Threshold Count;
接收DMA模块21从数据处理模块1再次接收到该通道的数据时,发现配置RAM存储器中的Data Number或Threshold Count不为“0”,则根据配置RAM存储器中的Current Data Buffer Address通过接口控制模块紧接着上次填的地址将数据填入上次未填满的数据缓存区,递增已经填在该数据缓存区的实际数据量、调整写数据缓存区地址;
接收DMA模块21在向数据缓存区填写数据过程中,发现已经填到数据缓存区的数据量达到了配置RAM存储器中的Buffer Size,CPU给该通道设置的数据缓冲区最多可缓存的数据量,判断已经填满了一个数据缓冲区,将该数据包占用的数据缓存区加一,同时根据从数据处理模块1接收的数据中发现该数据包未结束,则从FREE_FIFO存储器读出的一个新空闲队列描述子找到下一个空闲数据缓存区,然后用新空闲队列描述子中的包数据描述子指针写配置RAM存储器中Current DescriptorPointer指向的包数据描述子中的Next Descriptor Pointer域,用当前被填满的数据缓存区的起始地址、数据所属通道、该数据缓冲区的数据量、该数据缓冲区在当前数据包中的状态,该数据包数据占用的几个数据缓冲区中的第一个数据缓冲区,该数据包数据占用的几个数据缓存区的中间一个,该数据包数据占用的几个数据缓冲区的最后一个数据缓冲区,写包数据描述子的相应域,用新读出的空闲队列描述子中的Free Packet Descriptor Pointer更新配置RAM存储器中的CurrentDescriptor Pointer;
如果发现当前数据包全部被填完或已经填满了当前数据缓冲区,且当前该数据包占用的数据缓冲区数目已经达到了配置RAM存储器中Threshold值,即CPU预先设定的填多少个数据缓冲区生成一个完成队列描述子,则将当前数据包或数据所属通道、配置RAM存储器中的Threshold Count,即数据包或数据目前已经占用的数据缓存区数目、配置RAM存储器中的Start Descriptor Pointer,即数据包或数据所占用的几个数据缓存区的第一个缓存区所对应的包数据描述子指针、包结束符,即用以表示需要处理的数据是一个完整的数据包还是数据包的一部分数据,作为完成队列描述子写入DONE_FIFO存储器,将配置RAM存储器中的Threshold Count和Data Number清零;
接收DMA模块21在DONE_FIFO存储器里有了一定数目的接收完成队列描述子时,根据其内部实时调整的写完成队列指针将DONE_FIFO存储器里的接收完成队列描述子按顺序写入主存中的接收完成队列:存放接收完成队列描述子的缓存空间,并通过中断告诉CPU有数据可以处理,将该数据包或要处理的数据全部处理完毕。
这样,接收DMA模块21通过中断告诉CPU有数据可以处理,CPU通过接收完成队列描述子中的第一个数据缓冲区的包数据描述子指针,找到第一个数据缓存区的包数据描述子,根据其中的数据缓存区开始地址找到第一个数据缓存区,处理完第一个数据缓存区的数据后,根据第一个数据缓存区的包数据描述子中的信息找到第二个数据缓存区的包数据描述子,再根据包数据描述子中数据缓存区开始地址找到第二个数据缓存区,处理完第二个数据缓存区后再根据第二个数据缓冲区的包数据描述子中的信息找到第三个数据缓冲区的包数据描述子……依此类推,直至将该数据包或要处理的数据全部处理完毕;
根据图1、图6、图7、图8、图9、图10、图11和图12所示,在发送DMA模块22中,CPU通知发送DMA模块22某个通道的一个待发送包链,发送DMA模块22存放待发送队列描述子,待发送队列描述子反映待发送包链的第一个数据缓存区对应的包数据描述子及该待发送包链属于哪个通道,待发送队列描述子对应相应的待发包数据描述子;
如表4所示,待发送队列描述子数据结构:
Channel |
Descriptor Pointer |
表4
其中:
Descriptor Pointer:描述子指针,指向待发送包链的第一个数据缓存区对应的包数据描述子。
Channel:通道号,表明待发送包链属于哪个通道。
在发送DMA模块22中,待发包数据描述子的数据结构如表5所示:
Data Buffer Address |
EOF |
CV |
Length |
Next Descriptor Pointer |
PV |
Channel |
Next Pending Descriptor Pointer |
表5
其中:Data Buffer Address:待发送数据缓存区起始地址,由CPU写入;
Next Descriptor Poitner:下一待发送包数据描述子,在EOF为“0”时指向该待发送数据包的下个待发送数据缓存区的包数据描述子。在EOF和CV都是“1”的时候,指向下个待发送数据包的的第一个待发送数据缓存区的包数据描述子,由CPU写入;
Length:数据长度,待发送数据缓存区的数据量,由CPU写入;
CV:链有效标识(Chain Valid),该位作用在介绍Next DescriptorPointer时已经介绍过,由CPU写入;
EOF:帧结束表示(End Of Frame),为“1”表示当前待数据缓存区是该待发送数据包的最后一个待发送数据缓存区了,由CPU写入;
Next Pengding Descriptor Pointer:在PV为“1”的时候有效,发送DMA模块22内部只存放两个待发送包链,如果某个通道有多个待发送包链的话,发送DMA模块22通过写该域,并置PV为“1”,将多个待发送包链串起来,然后在发送数据过程中,通过读PV和该域的指针,将一个通道的待发送包链中的所有数据正确发送出去。
Channel:通道号,由CPU写入;
PV:下一待发送队列指针有效标识Pending Descriptor Valid,为“1”表示Next Pending Descriptor Pointer有效,由发送DMA模块22写入;
待发送队列描述子的数据结构包括:
Descriptor Pointer:描述子指针,指向待发送包链的第一个数据缓存区对应的包数据描述子。
Channel:通道号,表明待发送包链属于哪个通道。
待发送包链的数据经片外总线通过总线接口模块3,由发送DMA模块22根据相应的控制逻辑发送至数据处理模块1,在发送DMA模块22产生发送完成队列描述子,存放到内部的DONE_FIFO存储器中,在DONE_FIFO存储器中的发送完成队列数目超过其上限时,自动写到片外主存中的发送完成队列同时报中断给CPU,该发送完成队列描述子记录发送DMA模块22在发完一个待发送数据缓冲区的数据或一个完整的待发送数据包过程中记录的信息;例如:整个数据包被完整发送、待发送数据包的第一个待发送数据缓冲区的数据被发送、待发送数据包的中间某个待发送数据缓存区的数据被发送、待发送数据包的最后一个待发送数据缓冲区的数据被发送,如果在发送数据过程中有错误发生,则记录错误现象或原因。
如表6所示,发送完成队列描述子的数据结构如下:
EOF |
Stauts |
Channel |
Descriptor Pointer |
表6
其中:
Descriptor Pointer:包数据描述子指针,用于指向已经被发送出去的待发送包的第一个待发送数据缓存区的包数据描述子,或则指向已经被发送出去的待发送缓存区的包数据描述子。
Channel:通道号,被发送数据属于哪个通道,由发送DMA模块22写入;
Status:状态,主要记录被发送数据在待发送包中的位置,以及记录在发送数据过程中的出错情况。
EOF:帧结束标识,End Of Frame。
在发送DMA模块22中,配置RAM存储器按通道分块,存放发送DMA模块22在发送包数据过程中需要用到的中间信息和CPU对该通道的配置信息;如图9所示,其数据结构包括:
Current Data Buffer Address:待发送数据缓冲区的当前地址,由发送DMA模块22写入,CPU只读;
DQS:如果为“0”,发送DMA模块22只在发送了一个数据包以后才写完成队列描述子,如果为“1”,发送DMA模块22在发完一个待发送数据缓存区的数据后写完成队列描述子;由CPU写入;
Length Left:当前待发送数据缓存区的剩余数据量,由发送DMA模块22写入;CPU初始化时置零;
EOF:和当前待发送数据缓存区的包数据描述子中的EOF一样,由发送DMA模块22写入,CPU初始化时置零;
CV:和当前待发送数据缓存区的包数据描述子中的CV一样,由发送DMA模块22写入,CPU初始化时置零;
PENDST:用于表示配置RAM存储器中Next Dscriptor、Next PendingDescriptor的状态,由发送DMA模块22写入,CPU初始化时置零,如下所示:
PENDST Next Descriptor Pointer Next Pending Descriptor Pointer
000 无效 无效
100 无效 无效
101 有效 有效
111 有效 有效
其中PENDST的最高为“0”表示该通道目前没有它可以发送的数据,为“1”表示有。
Next Descriptor Pointer:下个待发送数据缓存区的包数据描述子指针
Start Descriptor Pointer:当前待发送数据包的第一个待发送数据缓存区的包数据描述子指针。
Next Pending Descriptor Pointer:下个待发送包链的第一个待发送数据缓存区的包数据描述子指针。
Last Pending Descriptor Pointer:最后一个待发送包链的第一个待发送数据缓存区的包数据描述子指针。
CPU将需要发送的数据通过待发送包描述子和待发送队列描述子的形式写到片外主存中的待发送包数据描述子队列和待发送队列中,更新发送DMA模块22中的待发送队列描述子的指针,发送DMA模块22读取待发送队列描述子;发送DMA模块22根据待发送队列描述子及待发送包数据描述子的信息,修改待发送包数据描述子和配置RAM的信息,将CPU要发送的待发送包数据串链起来,根据待发送包数据所属通道的包数据发送情况,产生正确的状态信息放在配置RAM中,同时响应数据模块申请包数据的请求,从数据处理模块1传至相应的通道;
在发送DMA模块22中,如图10所示,串链数据的具体过程为:
1、在PENDING_FIFO存储器非空时从PENDING_FIFO存储器中读出待发送队列描述子,此时根据从配置RAM存储器读出的该通道的信职工息发现如果PENDST为“3’b000”,表示当前该通道没有要发送的数据包链,则用待发送队列描述子中的包数据描述子指针写配置RAM存储器的Start Descriptor域,并修改PENDST为3’b100,表示该通道有一个待发送包链。
2、如果紧接着再次从PENDING_FIFO存储器中读出该通道的待发送队列描述子,此时根据按通道从配置RAM存储器读出的信息中发现PENDST为“3’b100”,表示该通道有一个待发送包链,则将第二次读出的待发送队列描述子中的包数据描述子指针写入该通道在配置RAM存储器中的Next Pending Descriptor Pointer和LastPending Descriptor Pointer域,并置PENDST为3’b101,表示该通道至少有了两个待发送包链。
3、如果紧接着从PENDING_FIFO存储器中读出的待发送队列描述子还是属于该通道,则根据从配置RAM存储器中读出的该通道的PENDST值,发现其为“3’b101”,表示该通道目前至少有两个待发送包链,此时除了用这次读出的发送队列描述子更新该通道配置RAM存储器中的Last Pending Descriptor Pointer之外,并将其写到该通道在配置RAM存储器中Next Pending Descriptor Pointer指向的包数据描述子中的Next Pending Descriptor Pointer域,同时将包数据描述子中的PV置“1”。
4、如果该通道还有多个待发送包链,具体表现为在PENDING_FIFO存储器中读出该通道的多个待发送队列描述子,发送DMA模块22只要按照上面3所示的那样,就将该通道所有的发送包链,串了起来。
5、发送DMA模块22通过上面步骤1、步骤2、步骤3、步骤4所述的操作,把每个端口当前所有的待发送包链按端口串在一起,如图11所示,显示数据的串链结构。
当数据处理模块1向发送DMA模块22申请某个通道的数据时,发送DMA模块22根据数据处理模块1送过来的通道号从配置RAM存储器中读出数据处理模块1想要申请的通道的信息,从主存中读出相应的待发包数据描述子,根据其中的信息从主存中的数据缓冲区读出数据送给数据处理模块1,递减当前数据缓冲区的剩余数据量;
如果数据处理模块1还未等发送DMA模块22将当前正在读的数据缓冲区的数据全部读出送给数据处理模块1就因为内部原因而停止接收数据,要求停止当前传送,发送DMA模块22停止从数据缓存区读数据,将当前读数据缓冲区地址写到配置RAM存储器该通道部分的相应信息中;待数据处理模块1在其有能力接收该通道的数据的时候,向发送DMA模块22申请该通道的数据,发送DMA模块22从配置RAM存储器读出该通道的信息,发现向数据缓冲区读数据送给数据处理模块1、递减数据缓冲区的剩余数据量。
如图12所示,当数据处理模块1向发送DMA模块22申请某个通道的数据时:
1、如果PENDST为“3’b000”,表示该通道目前没有待发送包链,发送DMA模块22向数据处理模块1发结束数据传输信号,表示当前本次传输结束;
2、如果PENDST的最高位“1”,即PENDST的值为“3’b1xx”,表示不考虑PENDST低两位的值,且从配置RAM存储器中读出的Length Left为“0”,表示目前还没有发送过该通道的数据,则根据该通道在配置RAM存储器中的Start Descriptor Pointer的值从主存中读出Start Descriptor Pointer指向的包数据描述子,根据其中的Data Buffer Address,从主存中的数据缓冲区读出数据送给数据处理模块1,递减当前数据缓冲区的剩余数据量,同时如果Start Descriptor Pointer指向的包数据描述子中的EOF为“0”或则EOF和CV都为“1”,则将Start DescriptorPointer指向的包数据描述子中的Next Descriptor Pointer写到该通道在配置RAM存储器中的Next Descriptor Pointer域,同时将PENDST中的最高位和次高位置“1”,表示该通道配置RAM存储器中的Next Descriptor Pointer有效;
3、如果数据处理模块1还未等发送DMA模块22将当前正在读的数据缓冲区的数据全部读出送给数据处理模块1就因为内部原因而停止接收数据,要求停止当前传送,发送DMA模块22停止从数据缓存区读数据,将当前读数据缓冲区地址写到配置RAM存储器该通道部分的Current Data Buffer Address,将数据缓冲区剩余数据量写到配置RAM存储器该通道部分的Length Left域。
4、数据处理模块1在其有能力接收该通道的数据的时候,向发送DMA模块22申请该通道的数据,发送DMA模块22从配置RAM存储器读出该通道的信息,发现Length Left域不为“0”,表示还未发送完一个数据缓冲区的数据,根据配置RAM存储器中的Current Data Buffer Address向数据缓冲区读数据送给数据处理模块1、递减数据缓冲区的剩余数据量。
5、发送DMA模块22将数据缓冲区的数据全部送给数据处理模块1以后,数据缓冲区的剩余数据量为“0”,看配置RAM存储器中该通道的PENDST中的次高位是否为“1”,如果为“1”,发送DMA模块22根据配置RAM存储器中的Next Descriptor Pointer从主存读出对应的包数据描述子:
a、如果包数据描述子中的EOF为“0”或则EOF和CV都为“1”,用包数据描述子中的Next Descripotor Pointer更新配置RAM存储器中的Next Descriptor Pointer,置配置RAM存储器中的PENDST的最高位和次高位为“1”,3’b11X表示该待发送数据包链有至少两个数据缓冲区的数据组成;
b、如果包数据描述子中的EOF为“1”且CV为“0”,置配置RAM存储器中的次高位为“0”,3’b10X表示该数据缓冲区是待发送数据包链最后一个数据缓冲区的数据;
c、如果此时数据处理模块1可以继续接收该通道的数据,发送DMA模块22根据包数据描述子中的Data Buffer Address通过接口控制模块从外部主存中的数据缓冲区读数据送给数据处理模块1,递减数据缓冲区中的剩余数据量;
d、如果此时数据处理模块1不能继续接收该通道的数据,要求结束本次传输,发送DMA模块22用包数据描述子中的Data Buffer Address更新配置RAM存储器中的CurrentData Buffer Address;包数据描述子中的Length更新配置RAM存储器中的Length Left的值,这样的话,等到数据处理模块1下次再申请该通道数据的时候可以继续将待发送数据从数据缓冲区读出送给数据处理模块1;
6、发送DMA模块22在将一个待发送数据包链发完以后,即:该数据缓冲区的剩余数据量为零;且此时PENDST的次高位为“0”,如果PENDST中的最低位为“1”,表示该通道配置RAM存储器中的Next Pending Descriptor Pointer域有效,发送DMA模块22用配置RAM存储器中的Next Pending Descriptor Pointer更新配置RAM存储器中Start Descriptor的值,这样的话,如果此时数据处理模块1要求停止本次数据传输,等到数据处理模块1下次再申请该通道数据的时候还可完整地将该通道的待发送数据送给数据处理模块1,从主存中读出Next PendingDescripotr Pointer指向的包数据描述子:
a、如果包数据描述子中的PV为“1”,用包数据描述子中的Next Pending Descriptor Pointer代替配置RAM存储器中的Next Pending Descriptor Pointer,并将配置RAM存储器中的PENDST最高位和最低位置“1”,3’b1X1表示当前该通道至少有两个待发送包链的数据等待发送;
b、如果包数据描述子中的PV为“0”,置配置RAM存储器中的PENDST最低位为“0”,3’b1X0表示当前该发送包链是该通道的最后一个待发送包链;
c、如果包数据描述子中的EOF为“0”或则EOF和CV都为“1”,用包数据描述子中的Next Descripotor Pointer更新配置RAM存储器中的Next Descriptor Pointer,置配置RAM存储器中的PENDST的最高位和次高位为“1”,3’b11X表示该待发送数据包链有至少两个数据缓冲区的数据组成;
d、如果包数据描述子中的EOF为“1”且CV为“0”,置配置RAM存储器中的次高位为“0”,3’b10X表示该数据缓冲区是待发送数据包链最后一个数据缓冲区的数据;
7、发送DMA模块22按上面步骤2至步骤6所示描述地一样将该通道其他待发送包链所对应的数据送给数据处理模块1,直到发送DMA模块22将该通道的最后一个数据包链中最后一个包数据描述子对应的数据缓冲区的数据送给数据处理模块1以后,发现配置RAM存储器中的PENDST的次高位和最低为都为“0”,表示该通道的已经没有待发送包链的数据等待发送的了,则将配置RAM存储器中的PENDST清零,表示该通道所有待发送包链的数据都已被发送完毕,且将配置RAM存储器中的Length Left清零;
8、发送DMA模块22按照上面步骤1至步骤7所示的将各通道的待发送数据送给数据处理模块1处理,在向数据处理模块1送完一个数据缓冲区的数据后,根据配置RAM存储器中CPU设置的DQS值判断是否需要生成一个完成队列描述子;
9、如果DQS的值为“1”,发送DMA模块22用指向该数据缓存区的包数据描述子的包数据描述子指针,以及在发送数据缓冲区的数据过程中记录的状态生成一个发送完成队列描述子写入DONE_FIFO存储器中;
10、如果DQS的值为“0”,发送DMA模块22用配置RAM存储器中的Start Descriptor Pointer和在发送数据缓冲区的数据过程中记录的状态生成一个发送完成队列描述子写入DONE_FIFO存储器;
11、发送DMA模块22在DONE_FIFO存储器里有了一定数目的发送完成队列描述子时,根据其内部实时调整的写发送完成队列指针将DONE_FIFO存储器里的发送完成队列描述子按顺序写入主存中的发送完成队列:存放发送完成队列描述子的缓存空间,通知CPU各通道的哪些数据已经被发送了。