掌桥专利:专业的专利平台
掌桥专利
首页

实现不同层面之间数据交互的方法

文献发布时间:2023-06-19 10:24:22


实现不同层面之间数据交互的方法

技术领域

本发明涉及数据交互领域,尤其涉及一种实现不同层面之间数据交互的方法。

背景技术

在软件开发过程中,不同的层面之间经常需要进行数据交互,而实现数据交互的接口方式一般可以分为JESD204b、DDR、SPI、PCIE、MII、GMII、RGMII、CPRI、ECPRI等等,实现不同层面之间的数据交互也有多种类型,例如用于不间断数据传输的、用于数据包交换的、用于专门命令设置读取的等等,但是上述接口通常需要有相应的硬件配合才能完成数据交互,因此数据交互往往受到硬件设计的约束,导致在软件开发过程中经常遇到接口不够用的情况。

发明内容

针对上述技术中存在的不足之处,本发明提供一种实现不同层面之间数据交互的方法,通过使用命令设置读取接口这种方式来实现一些速率较慢且间断性的数据包传输,能够很好的解决硬件接口预留不足导致开发难以继续的问题。

为实现上述目的,本发明提供一种实现不同层面之间数据交互的方法,包括包括以下步骤:

步骤S1:判断寄存器是否处于读写忙碌状态,如果是,则等待,如果否,则进入步骤S2;

步骤S2:进入读写,向寄存器写入数据包,数据包写完后,向接口发送数据包并置位为读写忙碌状态。

步骤S3:检测接口是否收到数据包,如果收到,则进入步骤S4;

步骤S4:接口读取数据包。

作为优选,在步骤S1前,对寄存器进行复位。

作为优选,在步骤S1中,寄存器处于读写忙碌状态时,判断寄存器接口是否被锁定,如果是,则对寄存器自动清零。

作为优选,在步骤S1中,寄存器处于读写忙碌状态时输出高电平,不处于读写忙碌状态时输出低电平。

作为优选,在步骤S2中,向寄存器写入数据包的过程包括:向寄存器写入多个地址,并对所述多个地址的每个地址进行唯一编号。

作为优选,在步骤S2中,置位为读写忙碌状态后,向寄存机写入地址为零。

作为优选,在步骤S2中,向寄存器写入数据包前,寄存器的bit值为31时,则认为允许向寄存器写入数据包,寄存器的bit值为30时,则认为写入数据包结束。

作为优选,在步骤S3中,检测接口是否收到数据包时,如果寄存器检测到不允许向寄存器写入数据包,则认为数据包丢失和/或丢失数据包。

作为优选,在步骤S4中,读取数据包之前,寄存器的bit值为31时,则认为允许读取数据包,寄存器的bit值为30时,则认为读取数据包结束。

作为优选,在步骤S4中,读取数据包的过程中,如果接口输出低电平,则表示数据包不完整和/或丢失数据包。

本发明的有益效果是:与现有技术相比,本发明提供的一种实现不同层面之间数据交互的方法,包括以下步骤:S1:判断寄存器是否处于读写忙碌状态,如果是,则等待,如果否,则进入步骤S2;S2:进入读写,向寄存器写入数据包,数据包写完后,向接口发送数据包并置位为读写忙碌状态;S3:检测接口是否收到数据包,如果收到,则进入步骤S4;S4:接口读取数据包;当寄存器不处于忙碌状态时,可认为寄存器此时处于空闲状态,因此,在寄存器处于空闲状态时,可以向其写入其他接口的数据包以便于不同层面之间能够数据交互,从而不必再增设新的数据传输接口,或者在传输接口不够用的情况下通过写入数据包能够实现其他接口也同时读取到数据信息的功能,加快了工作效率,通过使用命令设置读取接口这种方式来实现一些速率较慢且间断性的数据包传输,能够很好的解决硬件接口预留不足导致开发难以继续的问题。

附图说明

图1为本发明的方法原理示意图;

图2为本发明写入数据包的时序图;

图3为本发明读取数据包的时序图;

图4为命令操作寄存器划分图。

具体实施方式

为了更清楚地表述本发明,下面结合附图对本发明作进一步地描述。

请参阅图1-4,本发明的一种实现不同层面之间数据交互的方法,包括以下步骤:

步骤S1:判断寄存器是否处于读写忙碌状态,如果是,则等待,如果否,则进入步骤S2;

步骤S2:进入读写,向寄存器写入数据包,数据包写完后,向接口发送数据包并置位为读写忙碌状态。

步骤S3:检测接口是否收到数据包,如果收到,则进入步骤S4;

步骤S4:接口读取数据包。

请参阅图1-图2,图1为写入数据包的时序图。图2为读取数据包时序图,首先,判断指令PACKET_WR_BUSY是否处于忙写状态,如果输出为高电平,即PACKET_WR_BUSY=1,此时判断寄存器是处于忙碌状态,如果输出为低电平,即PACKET_WR_BUSY=0,则表示寄存器不处于忙碌状态,当不处于忙碌状态时,可认为寄存器此时处于空闲状态,因此,在寄存器处于空闲状态时,可以向其写入其他接口的数据包以便于不同层面之间能够数据交互,从而不必再增设新的数据传输接口,或者在传输接口不够用的情况下通过写入数据包能够实现其他接口也同时读取到数据信息的功能,加快了工作效率。

具体的,请参阅图2与图4,写入数据包时,有4个指令,本实施例中,定义为“PACKET_WR_EN”的指令为写入使能指令,作用是当寄存器想要写入数据包时,允许其写入,为了更好的检测此指令是否运行,可以查看寄存器的地址,当寄存器的地址为0*01且bit值为31时,则代表允许写入数据包;定义为“PACKET_WR_ADDR”的指令为写入地址,定义为“PACKET_WR_DATA”的指令为写入数据,在本实施例中,“PACKET_WR_ADDR”与“PACKET_WR_DATA”是同时进行,即“PACKET_WR_ADDR”写入地址指令的同时“PACKET_WR_DATA”对写入的地址进行唯一的数据编写,以确保每一个写入的地址有唯一的数据作为标记,例如,当地址为0时,标记为D0,地址为1时,标记为D1,地址为2时,标记为D2,地址为n时,标记为Dn,地址为n+1时,标记为D(n+1),以此类推;定义为“PACKET_WR_EOP”的指令为写入结束指令,此时寄存器的地址为0*01,但是bit值为30,此时表示写入的是最后一个地址和数据,且写入最后一个数据时,“PACKET_WR_EOP”开始输出高电平,以表示数据完成,可以向接口发送数据包。

读取数据包之前,先检测是否收到数据包,请参阅图3与图4,如果输出为高电平,即PACKET_RD_OWN=1,此时判断接口有接收到数据包,如果输出为低电平,即PACKET_RD_OWN=0,则表示接口没有接收到数据包,读取数据包时,也有4个指令,本实施例中,定义为“PACKET_RD_EN”的指令为读取使能,作用是当接口想要读取数据包时,允许其读取,为了更好的检测此指令是否运行,可以查看寄存器的地址,当寄存器的地址为0*02且bit值为31时,则代表允许读取数据包;定义为“PACKET_RD_ADDR”的指令为读取地址,定义为“PACKET_RD_DATA”的指令为读取数据,在本实施例中,“PACKET_RD_ADDR”与“PACKET_RD_DATA”是异步进行读取,即“PACKET_RD_ADDR”读取的地址为0时,“PACKET_RD_DATA”此时不读取,“PACKET_RD_ADDR”读取的地址为1时,“PACKET_RD_DATA”读取的数据为D0,“PACKET_RD_ADDR”读取的地址为2时,“PACKET_RD_DATA”读取的数据为D1,“PACKET_RD_ADDR”读取的地址为n时,“PACKET_RD_DATA”读取的数据为D(n-1),“PACKET_RD_ADDR”读取的地址为n+1时,“PACKET_RD_DATA”读取的数据为Dn,以此类推;定义为“PACKET_RD_EOP”的指令为读取结束指令,此时寄存器的地址为0*03,bit值为30,当“PACKET_RD_EOP”输出低电平时,表示数据包未读取完成,此时“PACKET_RD_ADDR”与“PACKET_RD_DATA”继续向后依次读取数据包,当“PACKET_RD_EOP”输出高电平时,代表数据包读取完成。

在本实施例中,在步骤S1前,需要对寄存器进行复位,即对寄存器进行初始化操作,复位时会产生一个一定宽度的复位脉冲去复位整个电路,使其工作与预设的状态,这样可以保证整个电路从一个预先设定好的状态开始后续的工作,从而避免程序运行到一半的情况出现卡死或无响应的情况发生。

在本实施例中,在步骤S1中,寄存器处于读写忙碌状态时,判断寄存器接口是否被锁定,如果是,则对寄存器自动清零,由于寄存器接口被锁定,因此可以判定寄存器已经存在了多个功能的标志位,若不清零直接对其赋予新值,则寄存器读取到的值仍然是原来的值,即之前的配置与新的配置之间会产生冲突,因此,本实施例中在判断寄存器处于读写忙碌状态时,同时判断寄存器接口是否被锁定,如果是,则对寄存器自动清零,这样能够避免已经存在的标志位与新的配置之间发生冲突。

在本实施例中,置位为读写忙碌状态后,向寄存机写入地址为零。复位与置位通常是成对出现,置位是对一个位写1(有输出),复位就是写0(没有输出),当置位为读写忙碌状态后,即表示为高电平,则此时无法向寄存器写入数据包,因此,向寄存器写入的地址可以默认为0或者写入0。

在本实施例中,在步骤S3中,检测接口是否收到数据包时,如果寄存器检测到不允许向寄存器写入数据包,即“PACKET_WR_EN=0”,则认为数据包丢失和/或丢失数据包,此时不向接口发送数据包;具体的,当FPGA还没有接收到PACKET_WR_EOP=1的状态,而检测到PACKET_WR_EN=0时,则表示此数据包不完整,丢失数据包,这样可以避免读取端接收到不完整的数据包,避免寄存器发生损坏。

在本实施例中,在步骤S4中,读取数据包的过程中,如果接口输出低电平,则表示数据包不完整和/或丢失数据包,具体的,当接口没有读取到PACKET_RD_EOP=1的状态,却读取到PACKET_RD_OWN=0时,表示此数据包不完整,丢失数据包。

下面通过操作寄存器的防止来实现上层对下层的cpri接口中的GMII数据:

写数据包操作:

步骤1、首先起始时刻,对FPGA进行复位,此时PACKET_WR_BUSY=1,输出高电平,对FPGA进行检测,当有CPRI口锁定后,对FPGA进行自动清零;

步骤2、当要发数据包时,读取PACKET_WR_BUSY允许发数据包标志:即

当PACKET_WR_BUSY=1时,输出高电平,表示忙碌状态,不允许写数据包,进入等待。

当PACKET_WR_BUSY=0时,输出低电平,表示不忙碌状态,允许写数据包,进入下一步;

步骤3、向FPGA写入{PACKET_WR_EN,PACKET_WR_EOP,PACKET_WR_ADDR,PACKET_WR_DATA}={1,0,wadr,data};

其中wadr从0开始写入,每次加1,data从D0开始写入,每次加1。

步骤4、当写入的数据包到最后一个数据时:

向FPGA写入{PACKET_WR_EN,PACKET_WR_EOP,PACKET_WR_ADDR,PACKET_WR_DATA}={1,1,wadr,data};表示数据包写入完成;

此时,FPGA接收到最后一个数据后,开始往GMII接口发送数据包,同时,置位“PACKET_WR_BUSY=1”(忙碌状态)直到此数据包发送完成。

当FPGA还没有接收PACKET_WR_EOP=1的状态,而检测到PACKET_WR_EN=0时,表示此数据包不完整,丢失数据包,此时不再向GMII接口发送此数据包。

步骤5、写完数据包后,

写{PACKET_WR_EN,PACKET_WR_EOP,PACKET_WR_ADDR,PACKET_WR_DATA}={0,0,0,0};

准备下一次写数据包。当有数据包要发送时,返回步骤2。

读数据包操作:

步骤1、检测PACKET_RD_OWN的状态,当PACKET_RD_OWN=1时,表示有接收到数据包,进入下一步;

步骤2、写{PACKET_RD_EN,PACKET_RD_ADDR}={1,radr};其中radr从0开始读取;

步骤3、读取PACKET_RD_EOP,PACKET_RD_DATA值;

当PACKET_RD_EOP=0时,radr+1返回步骤2;

当PACKET_RD_EOP=1时,表示数据包读取完成,进入下一步;

当接口没有读取到PACKET_RD_EOP=1的状态,却读取到PACKET_RD_OWN=0时,表示此数据包不完整,丢失数据包,此时不再进行读取;

步骤4、写{PACKET_RD_EN,PACKET_RD_ADDR}={0,0},结束一个数据包的读取,准备下一个数据包读取。

若要读取其他接口例如C&M接口的数据时,可以在FPGA在PACKET_RD_EN从1切到0时,把PACKET_RD_OWN清零,准备接收C&M接口数据包。当从GMII接口接收完一个数据包后,PACKET_RD_OWN=1。

本发明的优势在于:

1、在寄存器处于空闲状态时,可以向其写入其他接口的数据包以便于不同层面之间能够数据交互,从而不必再增设新的数据传输接口,或者在传输接口不够用的情况下通过写入数据包能够实现其他接口也同时读取到数据信息的功能,加快了工作效率。

2、检测接口是否收到数据包时,如果寄存器检测到不允许向寄存器写入数据包,即“PACKET_WR_EN=0”,则认为数据包丢失和/或丢失数据包,此时不向接口发送数据包;具体的,当FPGA还没有接收到PACKET_WR_EOP=1的状态,而检测到PACKET_WR_EN=0时,则表示此数据包不完整,丢失数据包,这样可以避免读取端接收到不完整的数据包,避免寄存器发生损坏。

3、在步骤S1中,寄存器处于读写忙碌状态时,判断寄存器接口是否被锁定,如果是,则对寄存器自动清零,由于寄存器接口被锁定,因此可以判定寄存器已经存在了多个功能的标志位,若不清零直接对其赋予新值,则寄存器读取到的值仍然是原来的值,即之前的配置与新的配置之间会产生冲突,因此,本实施例中在判断寄存器处于读写忙碌状态时,同时判断寄存器接口是否被锁定,如果是,则对寄存器自动清零,这样能够避免已经存在的标志位与新的配置之间发生冲突。

以上公开的仅为本发明的几个具体实施例,但是本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。

相关技术
  • 实现不同层面之间数据交互的方法
  • 实现不同系统之间数据交互的方法
技术分类

06120112533846