CN117592416A - 一种可实现块状数据访问的循环fifo的仿真方法 - Google Patents
一种可实现块状数据访问的循环fifo的仿真方法 Download PDFInfo
- Publication number
- CN117592416A CN117592416A CN202311425070.7A CN202311425070A CN117592416A CN 117592416 A CN117592416 A CN 117592416A CN 202311425070 A CN202311425070 A CN 202311425070A CN 117592416 A CN117592416 A CN 117592416A
- Authority
- CN
- China
- Prior art keywords
- fifo
- segment
- array
- redundant
- head
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 35
- 125000004122 cyclic group Chemical group 0.000 title claims abstract description 24
- 238000004088 simulation Methods 0.000 title claims abstract description 24
- 230000008569 process Effects 0.000 claims abstract description 9
- 238000006243 chemical reaction Methods 0.000 claims description 10
- 230000006870 function Effects 0.000 claims description 9
- 230000005540 biological transmission Effects 0.000 claims description 7
- 230000009471 action Effects 0.000 claims description 6
- 230000001360 synchronised effect Effects 0.000 claims description 6
- 230000002093 peripheral effect Effects 0.000 claims description 5
- 230000003993 interaction Effects 0.000 abstract description 3
- 230000001502 supplementing effect Effects 0.000 abstract description 3
- 238000010586 diagram Methods 0.000 description 3
- MHABMANUFPZXEB-UHFFFAOYSA-N O-demethyl-aloesaponarin I Natural products O=C1C2=CC=CC(O)=C2C(=O)C2=C1C=C(O)C(C(O)=O)=C2C MHABMANUFPZXEB-UHFFFAOYSA-N 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- UJKWLAZYSLJTKA-UHFFFAOYSA-N edma Chemical compound O1CCOC2=CC(CC(C)NC)=CC=C21 UJKWLAZYSLJTKA-UHFFFAOYSA-N 0.000 description 1
- 239000013589 supplement Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/30—Circuit design
- G06F30/39—Circuit design at the physical level
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F5/00—Methods or arrangements for data conversion without changing the order or content of the data handled
- G06F5/06—Methods or arrangements for data conversion without changing the order or content of the data handled for changing the speed of data flow, i.e. speed regularising or timing, e.g. delay lines, FIFO buffers; over- or underrun control therefor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2111/00—Details relating to CAD techniques
- G06F2111/20—Configuration CAD, e.g. designing by assembling or positioning modules selected from libraries of predesigned modules
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2115/00—Details relating to the type of the circuit
- G06F2115/10—Processors
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Evolutionary Computation (AREA)
- Geometry (AREA)
- Information Transfer Systems (AREA)
Abstract
本发明公开了一种可实现块状数据访问的循环FIFO的仿真方法,包括以下步骤:步骤一,定义数组;步骤二,定义逻辑;步骤三,设定最大字节;步骤四,起始段定义;步骤五,首尾结构定义;本发明,通过为FIFO分配一个长度加长的数组作为缓冲区,当循环FIFO头部或尾部指向数组原始段的末尾元素时,使其读取冗余段,通过对冗余段的补充,实现了对FIFO缓冲区中字长大于1的连续性读取访问,使FIFO缓冲区在运行过程中占用的内存更小、使得连续性内存拷贝成为了现实,缩短对与FIFO结构进行数据交互中消耗的机器时间,提高运行过效率,降低应用难度,大大提高了运行速度,在DMA数据搬运中,省去了数据拼接的时间,增加了仿真度并提高仿真速度。
Description
技术领域
本发明涉及FIFO结构技术领域,具体为一种可实现块状数据访问的循环FIFO的仿真方法。
背景技术
在FT的C6678型DSP研发过程中,需要大量的用到FIFO结构,包括EDMA、rapidio、串行口和GMAC,这些外设的操作在硬件环境中均由DMAC控制,DMAC两侧的外设其拷贝操作并不同步,对FIFO的读写访问是随机的,因此必须对FIFO结构进行仿真;
常见的FIFO结构仿真均采用链表形式,采用循环链表的思路实现循环FIFO结果,对于访问粒度为1字节的情况,上述方法已经解决了所有的问题,而实际情况下,FIFO的操作粒度是可变的,在这种情况下,由于数组的首末元素的物理地址是不连续的的,当FIFO头部指向数组的最后一个元素时,这时进行字长大于1的数据访问时就不能进行批量操作了,即不能采用客诉memcpy的函数了,该形式在搬运大数据量时,不得不考虑链表的寻址时间,且链表中的元素均为单字节,在进行多字节字长拷贝时需要进行数据拼接,且真实情况就是一次性拷贝多字节,也降低了仿真度,因此设计一种可实现块状数据访问的循环FIFO的仿真方法是很有必要的。
发明内容
本发明的目的在于提供一种可实现块状数据访问的循环FIFO的仿真方法,以解决上述背景技术中提出的问题。
为实现上述目的,本发明提供如下技术方案:一种可实现块状数据访问的循环FIFO的仿真方法,包括以下步骤:步骤一,定义数组;步骤二,定义逻辑;步骤三,设定最大字节;步骤四,起始段定义;步骤五,首尾结构定义;
其中上述步骤一中,定义一个超过原始FIFO深度的一维字节类型的数组作为仿真FIFO结构的数据缓冲区;
其中上述步骤二中,将步骤一中定义的数组分为两个逻辑部分;
其中上述步骤三中,设定冗余段的长度为单次对FIFO进行读写访问的最大字节数减1;
其中上述步骤四中,定义数组原始段中开始部分的与冗余段相等长度的部分称为起始段;
其中上述步骤五中,定义两个变量head和tail为FIFO结构的头和尾,其内部记录的为数组的某个元素的角标。
优选的,所述步骤二中,两个逻辑部分分别为原始段和冗余段。
优选的,所述步骤三中,对FIFO的写访问,是指将数据拷贝至数组中被tai l指向的元素及其后续一定数量元素。
优选的,所述步骤三中,对FIFO的读访问,是指将数组中head指向的元素及其后续一定数量元素拷贝至目标位置。
优选的,所述步骤三中,对FIFO进行写访问时,需判断写入范围是否包含冗余段和起始段的元素,如包含则起始段和冗余段内的对应元素也要被同步修改为对应值。
优选的,所述步骤三中,对FIFO进行读访问时,可直接使用memcpy函数,将head位置作为源地址,或直接对head位置的地址进行强制类型转换后进行解引用作为右值使用。
优选的,所述步骤三中,使用memcpy函数进行仿真的过程为:首先进行memcpy(&array_FIFO(head),ptr_src,size);的操作,实现数据赋值(其中的ptr_src为源段设备(内存或外设)中的地址空间,size为传输总字节数),或采用数据类型强制转换,强制array_FIFO当前head位置角标元素的地址转换为源总线字长的如数类型,如传输位宽为32位,则采用(uint32_t*)p=(uint32_t*)(&array_FIFO[head])的方式获取一个32位的指针指向数组元素,再采用*p=value;的方式进行赋值,其中第二种方式,无法应对超过仿真宿主机最大位宽的传输方式,如果操作方法使用了头部段,则要对对应的冗余段的数据进行同步;同理,如果使用了冗余段需要对对应的头部短进行同步。
优选的,所述步骤三中,冗余段的长度与FIFO深度相同的数组长度L扩展为L+n-1,在FIFO头或尾部指向数组末尾元素时,且读取访问的元素角标超过L-1的元素时,冗余段数组元素将全部参与数据读写访问动作;同理,当FIFO结构的头、尾指向的为非最后一个元素时,冗余段将有部分或无元素参与操作,因此,在对FIFO数据进行数据追加操作时,需要判断缓冲数组的起始段或冗余段是否参与,如果起始段的元素参与,则冗余段的相应元素做数值同步动作;如果有冗余段元素参与,则起始段的相应元素做数值同步动作,其同步逻辑的表达式为:
优选的,所述步骤三中,冗余段的补充,实现了对FIFO缓冲区中字长大于1的连续性读取访问,向FIFO结构尾部传入数据时,原本当FIFO尾部变量指向位置至原始段末尾元素的区间无法容纳传入的所有数据,需要将传入数据的前半部分分部存入缓冲数组的后半段,再超出原始段范围的部分存入缓冲数组的起始段,而现在由于冗余段的加入,可将传入的数据一次性传入原始段的后半段以及冗余段,再将冗余段的数据同步到起始段即可。
优选的,所述步骤四中,起始段与冗余段的对应关系为“头部段元素角标”+“原始FIFO深度”=“冗余段元素角标”。
与现有技术相比,本发明的有益效果是:该一种可实现块状数据访问的循环FIFO的仿真方法,通过为FIFO分配一个长度加长的数组作为缓冲区,当循环FIFO头部或尾部指向数组原始段的末尾元素时,使其读取冗余段,通过对冗余段的补充,实现了对FIFO缓冲区中字长大于1的连续性读取访问,使FIFO缓冲区在运行过程中占用的内存更小、使得连续性内存拷贝成为了现实,缩短对与FIFO结构进行数据交互中消耗的机器时间,可采用常规C函数或强制类型转换进行数据拷贝,能够简化应用时的程序结构,提高运行过效率,降低应用难度,大大提高了运行速度,在DMA数据搬运中,省去了数据拼接的时间,增加了仿真度并提高仿真速度。
附图说明
图1为本发明的方法流程图;
图2为本发明中缓冲数组的逻辑分段示意图;
图3为本发明中增加冗余段数据追加操作的变化对比图;
图4为本发明中带冗余段的数组作为缓冲数组的建议FIFO类图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1-4,本发明提供的一种实施例:一种可实现块状数据访问的循环FIFO的仿真方法,包括以下步骤:步骤一,定义数组;步骤二,定义逻辑;步骤三,设定最大字节;步骤四,起始段定义;步骤五,首尾结构定义;
其中上述步骤一中,定义一个超过原始FIFO深度的一维字节类型的数组作为仿真FIFO结构的数据缓冲区;
其中上述步骤二中,将步骤一中定义的数组分为两个逻辑部分,两个逻辑部分分别为原始段和冗余段;
其中上述步骤三中,设定冗余段的长度为单次对FIFO进行读写访问的最大字节数减1;对FIFO的写访问,是指将数据拷贝至数组中被tail指向的元素及其后续一定数量元素;对FIFO的读访问,是指将数组中head指向的元素及其后续一定数量元素拷贝至目标位置;对FIFO进行写访问时,需判断写入范围是否包含冗余段和起始段的元素,如包含则起始段和冗余段内的对应元素也要被同步修改为对应值;对FIFO进行读访问时,可直接使用memcpy函数,将head位置作为源地址,或直接对head位置的地址进行强制类型转换后进行解引用作为右值使用;使用memcpy函数进行仿真的过程为:首先进行memcpy(&array_FIFO(head),ptr_src,size);的操作,实现数据赋值(其中的ptr_src为源段设备(内存或外设)中的地址空间,size为传输总字节数),或采用数据类型强制转换,强制array_FIFO当前head位置角标元素的地址转换为源总线字长的如数类型,如传输位宽为32位,则采用(uint32_t*)p=(uint32_t*)(&array_FIFO[head])的方式获取一个32位的指针指向数组元素,再采用*p=value;的方式进行赋值,其中第二种方式,无法应对超过仿真宿主机最大位宽的传输方式,如果操作方法使用了头部段,则要对对应的冗余段的数据进行同步;同理,如果使用了冗余段需要对对应的头部短进行同步;冗余段的长度与FIFO深度相同的数组长度L扩展为L+n-1,在FIFO头或尾部指向数组末尾元素时,且读取访问的元素角标超过L-1的元素时,冗余段数组元素将全部参与数据读写访问动作;同理,当FIFO结构的头、尾指向的为非最后一个元素时,冗余段将有部分或无元素参与操作,因此,在对FIFO数据进行数据追加操作时,需要判断缓冲数组的起始段或冗余段是否参与,如果起始段的元素参与,则冗余段的相应元素做数值同步动作;如果有冗余段元素参与,则起始段的相应元素做数值同步动作,其同步逻辑的表达式为:冗余段的补充,实现了对FIFO缓冲区中字长大于1的连续性读取访问,向FIFO结构尾部传入数据时,原本当FIFO尾部变量指向位置至原始段末尾元素的区间无法容纳传入的所有数据,需要将传入数据的前半部分分部存入缓冲数组的后半段,再超出原始段范围的部分存入缓冲数组的起始段,而现在由于冗余段的加入,可将传入的数据一次性传入原始段的后半段以及冗余段,再将冗余段的数据同步到起始段即可;
其中上述步骤四中,定义数组原始段中开始部分的与冗余段相等长度的部分称为起始段,起始段与冗余段的对应关系为“头部段元素角标”+“原始FIFO深度”=“冗余段元素角标”;
其中上述步骤五中,定义两个变量head和tail为FIFO结构的头和尾,其内部记录的为数组的某个元素的角标。
基于上述,本发明的优点在于,本发明,通过为FIFO分配一个长度加长的数组作为缓冲区,当循环FIFO头部或尾部指向数组原始段的末尾元素时,使其读取冗余段,通过对冗余段的补充,实现了对FIFO缓冲区中字长大于1的连续性读取访问,使FIFO缓冲区在运行过程中占用的内存更小、使得连续性内存拷贝成为了现实,缩短对与FIFO结构进行数据交互中消耗的机器时间,可采用常规C函数或强制类型转换进行数据拷贝,能够简化应用时的程序结构,提高运行过效率,降低应用难度,大大提高了运行速度,在DMA数据搬运中,省去了数据拼接的时间,增加了仿真度并提高仿真速度。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
Claims (10)
1.一种可实现块状数据访问的循环FIFO的仿真方法,包括以下步骤:步骤一,定义数组;步骤二,定义逻辑;步骤三,设定最大字节;步骤四,起始段定义;步骤五,首尾结构定义;其特征在于:
其中上述步骤一中,定义一个超过原始FIFO深度的一维字节类型的数组作为仿真FIFO结构的数据缓冲区;
其中上述步骤二中,将步骤一中定义的数组分为两个逻辑部分;
其中上述步骤三中,设定冗余段的长度为单次对FIFO进行读写访问的最大字节数减1;
其中上述步骤四中,定义数组原始段中开始部分的与冗余段相等长度的部分称为起始段;
其中上述步骤五中,定义两个变量head和tail为FIFO结构的头和尾,其内部记录的为数组的某个元素的角标。
2.根据权利要求1所述的一种可实现块状数据访问的循环FIFO的仿真方法,其特征在于:所述步骤二中,两个逻辑部分分别为原始段和冗余段。
3.根据权利要求1所述的一种可实现块状数据访问的循环FIFO的仿真方法,其特征在于:所述步骤三中,对FIFO的写访问,是指将数据拷贝至数组中被tail指向的元素及其后续一定数量元素。
4.根据权利要求1所述的一种可实现块状数据访问的循环FIFO的仿真方法,其特征在于:所述步骤三中,对FIFO的读访问,是指将数组中head指向的元素及其后续一定数量元素拷贝至目标位置。
5.根据权利要求1所述的一种可实现块状数据访问的循环FIFO的仿真方法,其特征在于:所述步骤三中,对FIFO进行写访问时,需判断写入范围是否包含冗余段和起始段的元素,如包含则起始段和冗余段内的对应元素也要被同步修改为对应值。
6.根据权利要求1所述的一种可实现块状数据访问的循环FIFO的仿真方法,其特征在于:所述步骤三中,对FIFO进行读访问时,可直接使用memcpy函数,将head位置作为源地址,或直接对head位置的地址进行强制类型转换后进行解引用作为右值使用。
7.根据权利要求1所述的一种可实现块状数据访问的循环FIFO的仿真方法,其特征在于:所述步骤三中,使用memcpy函数进行仿真的过程为:首先进行memcpy(&array_FIFO(head),ptr_src,size);的操作,实现数据赋值(其中的ptr_src为源段设备(内存或外设)中的地址空间,size为传输总字节数),或采用数据类型强制转换,强制array_FIFO当前head位置角标元素的地址转换为源总线字长的如数类型,如传输位宽为32位,则采用(uint32_t*)p=(uint32_t*)(&array_FIFO[head])的方式获取一个32位的指针指向数组元素,再采用*p=value;的方式进行赋值,其中第二种方式,无法应对超过仿真宿主机最大位宽的传输方式,如果操作方法使用了头部段,则要对对应的冗余段的数据进行同步;同理,如果使用了冗余段需要对对应的头部短进行同步。
8.根据权利要求1所述的一种可实现块状数据访问的循环FIFO的仿真方法,其特征在于:所述步骤三中,冗余段的长度与FIFO深度相同的数组长度L扩展为L+n-1,在FIFO头或尾部指向数组末尾元素时,且读取访问的元素角标超过L-1的元素时,冗余段数组元素将全部参与数据读写访问动作;同理,当FIFO结构的头、尾指向的为非最后一个元素时,冗余段将有部分或无元素参与操作,因此,在对FIFO数据进行数据追加操作时,需要判断缓冲数组的起始段或冗余段是否参与,如果起始段的元素参与,则冗余段的相应元素做数值同步动作;如果有冗余段元素参与,则起始段的相应元素做数值同步动作,其同步逻辑的表达式为:
9.根据权利要求1所述的一种可实现块状数据访问的循环FIFO的仿真方法,其特征在于:所述步骤三中,冗余段的补充,实现了对FIFO缓冲区中字长大于1的连续性读取访问,向FIFO结构尾部传入数据时,原本当FIFO尾部变量指向位置至原始段末尾元素的区间无法容纳传入的所有数据,需要将传入数据的前半部分分部存入缓冲数组的后半段,再超出原始段范围的部分存入缓冲数组的起始段,而现在由于冗余段的加入,可将传入的数据一次性传入原始段的后半段以及冗余段,再将冗余段的数据同步到起始段即可。
10.根据权利要求1所述的一种可实现块状数据访问的循环FIFO的仿真方法,其特征在于:所述步骤四中,起始段与冗余段的对应关系为“头部段元素角标”+“原始FIFO深度”=“冗余段元素角标”。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311425070.7A CN117592416A (zh) | 2023-10-31 | 2023-10-31 | 一种可实现块状数据访问的循环fifo的仿真方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311425070.7A CN117592416A (zh) | 2023-10-31 | 2023-10-31 | 一种可实现块状数据访问的循环fifo的仿真方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117592416A true CN117592416A (zh) | 2024-02-23 |
Family
ID=89915748
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311425070.7A Pending CN117592416A (zh) | 2023-10-31 | 2023-10-31 | 一种可实现块状数据访问的循环fifo的仿真方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117592416A (zh) |
-
2023
- 2023-10-31 CN CN202311425070.7A patent/CN117592416A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10540250B2 (en) | Reducing storage requirements for storing memory addresses and values | |
CN113254368B (zh) | 从axi总线到opb总线的数据写入方法及读取方法 | |
CN112199040B (zh) | 存储访问方法及智能处理装置 | |
WO2020257748A1 (en) | Dma-scatter and gather operations for non-contiguous memory | |
CN102789424B (zh) | 基于fpga的外扩ddr2的读写方法及基于fpga的外扩ddr2颗粒存储器 | |
CN110737607A (zh) | 管理hmb内存的方法、装置、计算机设备及存储介质 | |
CN112153054B (zh) | 一种任意字节长度拼接缓存的实现方法和系统 | |
CN112256331B (zh) | 虚拟机指令解析加速方法、装置和计算机存储介质 | |
CN116700795B (zh) | 一种位操作控制系统及控制方法 | |
CN117592416A (zh) | 一种可实现块状数据访问的循环fifo的仿真方法 | |
CN110968538B (zh) | 一种数据缓冲方法和装置 | |
CN100359491C (zh) | 基于mcs-51架构的16m字节数据存储器寻址空间扩充方法 | |
CN117667789A (zh) | 用于离散dma数据访问的数据处理系统 | |
CN206975631U (zh) | 一种通用输入输出时序处理器 | |
JPH0390942A (ja) | 主記憶装置の制御方式 | |
CN105701060A (zh) | 基于fpga的高速实时数据记录系统 | |
CN111966608A (zh) | 一种外存储器的直接内存储器访问方法和装置 | |
CN110134629A (zh) | 一种基于FPGA的NVMe SSD PCIe数据包解析方法 | |
TWI743611B (zh) | 處理裝置與其資料存取方法 | |
JP2000137674A (ja) | バースト転送メモリマップトレジスタ | |
CN117827725B (zh) | 一种基于fpga的emc接口扩展模块、系统及方法 | |
CN117056263A (zh) | Spi控制器、控制方法、系统级芯片以及蓝牙设备 | |
CN114911568A (zh) | 基于Linux操作系统的数据传输方法、装置及设备 | |
CN118200410A (zh) | 一种基于光纤反射内存的虚幻引擎通信方法 | |
JPH04171542A (ja) | デバッグ機能内蔵マイクロプロセッサ |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |