一种FFFS编码报文的解码方法转让专利

申请号 : CN201310247311.3

文献号 : CN103368884B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 詹惠琴王帅周权金恒古天祥张鑫鑫

申请人 : 电子科技大学

摘要 :

本发明提供了一种FFFS编码报文的解码方法,在计算报文帧头偏移量S的基础上,通过对报文帧头偏移量S的值做分类讨论,找到控制位和扰码位地址,直接读取控制位和扰码位数据,因而不需要将报文重新排序存贮,这样不但可以节省资源,最重要的是可以提高解码速度,缩短解码时间。同时,基于控制位和扰码位是连续的,在本发明中,对于它们的查找在一个步骤完成,也节省了查询时间。

权利要求 :

1.一种FFFS编码报文的解码方法,其特征在于,包括以下步骤:(1)、FFFS长报文编码数据的接收与保存

FFFS长报文编码数据送来以后先缓存在RAM中,当达到1023bits时,启动报文解析;

(2)、通过数据窗,在RAM中取1023bits编码数据,进行循环冗余校验和报文同步计算的并行处理,当通过循环冗余校验,则进行步骤(3),如果未通过循环冗余校验,则数据窗向后移动一位,在RAM中取1023bits编码数据再进行循环冗余校验和报文同步计算的并行处理;

(3)、1023bits编码数据进行CR校验;

(4)、根据报文同步计算得到的同步码,查表得到报文帧头偏移量;

(5)、首先根据报文帧头偏移量在RAM中找到控制位和扰码位地址并读取控制位和扰码位地址的数据:

5.1)、当报文帧头偏移量S小于等于913时,控制位区和扰码位区的15bits数据是连续的,取一个变量t,t取值为0到14的整数,其数据在RAM中的地址是:AddrCb-B=Addrshift+913-S+t;

其中,AddrCb-B是控制位区和扰码位区数据在RAM中的地址,Addrshift是当前数据窗的移位值即在RAM中的累计地址偏移量,S是报文帧头偏移量;t为一个变量,取值范围是0到

14,当t大于等于0小于等于2时得到的依次是数据位b109、b108和b107在RAM中的地址,当t大于等于3小于等于14时得到的依次是数据b106,…,b95在RAM中的地址;

5.2)、当报文帧头偏移量为914≤S≤927时,控制位区和扰码位区的15bits数据是不连续的,设两个整数变量分别为是m和n,则有:a1)、变量m从0开始取值到S-914,得到从数据位b109的RAM地址开始的S-913个数据的地址:AddrCb-B=Addrshift+1936-S+m;

a2)、变量n从0开始取值到927-S,获得中剩余的控制扰码位区段直到数据位b95的数据在RAM地址:AddrCb-B=Addrshift+n;

5.3)、当报文帧头偏移量为928≤S≤1022,控制位区和扰码位区的15bits数据是连续的,其数据在RAM中的地址是:AddrCb-B=Addrshift+1936-S+x;

x是一个变量,取值范围是0到14,当x大于等于0小于等于2时得到的依次是数据位b109、b108和b107在RAM中的地址,当x大于等于3小于等于14时得到的依次是数据位b106,…,b95在RAM中的地址;

在RAM中读取控制位和扰码位地址的数据,并将其中的12bits扰码位数据保存;

(6)、在读取的控制位和扰码位地址的数据中,检查控制位b108b107的数据值是否合法,如果不合法则数据窗向后移动一位,返回步骤(2);如果合法,则检查控制位中的b109的数据值,如果为1,则用户数据位数据需要反转,如果为0则不需要反转;

(7)、首先根据报文帧头偏移量在RAM中找到用户数据位地址:

7.1)、当报文帧头偏移量S=0时:

Addr1022…Addrshift+i;

其中,i从0取值到912,分别对应着用户数据位b1022,…,b110的在RAM中的地址Addr1022;

7.2)、当S≠0,且1≤S≤912时,设两个整数变量j,k;

b.1)、变量j从0开始取值到S-1,获得用户数据位b1022,b1021,…,b1022-S+1在RAM地址:Addr1022=Addrshift+1023-S+j;

b.2)、变量k从0开始取值到913-S-1,获得用户数据位b1022-S,b1022-S-1,…,b110在RAM地址:Addr1022=Addrshift+k;

7.3)、当S≠0,且913≤S时,

Addr1022=Addrshift+1023-S+l;

其中,l从0取值到912,分别对应着用户数据位b1022,…,b110的在RAM中的地址Addr1022;

依据上述用户数据位地址,依次读取出83组11位用户数据,如果需要反转,则进行反转;然后,依次对83组11位用户数据进行有效字检查和转换,依次得到10位的用户数据,如果在有效字检查中,有一组没有通过检查,则数据窗向后移动一位,返回步骤(2);最后,用扰码位数据计算出解扰器初态值依次对转换得到的10位的用户数据进行解扰,得到用户报文信息。

2.根据权利要求1所述的FFFS编码报文的解码方法,其特征在于,步骤(7)中所述的有效字检查和转换为:依次将83组11位用户数据作为地址送到11位-10位有效字ROM表的地址线上进行查表,在11位-10位有效字ROM表每个单元中储存的是一个11位数据,如果11位用户数据是有效字,则查表得到的11位数据最高位都是0,低10位为其对应的10位的用户数据,

11位用户数据是无效字,则查表得到的11位数据最高位都是1;

有效字检查模块对查表得到的11位数据最高位进行检查,如果为1,则将其送到解扰模块,在解扰模块中将最高位丢弃,只留下低10位作为有效字转换的结果参与解扰运算,得到用户报文信息,;如果为0,则数据窗向后移动一位,返回步骤(2)。

说明书 :

一种FFFS编码报文的解码方法

技术领域

[0001] 本发明属于查询应答技术领域,更为具体地讲,涉及一种FFFS编码报文的解码方法。

背景技术

[0002] FFFS编码策略(Form Fit Function Specification Coding Strategy)是由EUROSIG(欧洲信号公司联盟)为欧洲铁路信息化统一而制定的一种报文编码标准,这种编码标准被应用在查询应答系统中,是一种应答器报文的生成规范。
[0003] 应答器内的报文是提前编好的,FFFS编码工作可以通过编写程序完成。将已经固化的报文保存的在应答器的ROM中,当列车经过时,应答器接收到车载查询器的功率载波,进入工作状态。然后,将事先存好的FFFS报文以FSK调制信号发送出去。FSK信号被解调以后得到FFFS报文,FFFS报文送入解码器进行解码。
[0004] 现有FFFS编码报文的解码方法在查找控制位、扰码位时需要将报文重新排序存储,需要资源消耗,解码时间较长。

发明内容

[0005] 本发明的目的在于克服现有技术的不足,提供一种FFFS编码报文的解码方法,以提高解码速度,缩短解码时间。
[0006] 为实现以上目的,本发明FFFS编码报文的解码方法,包括以下步骤:
[0007] (1)、FFFS长报文编码数据的接收与保存
[0008] FFFS长报文编码数据送来以后先缓存在RAM中,当达到1023bits时,启动报文解析;
[0009] (2)、通过数据窗,在RAM中取1023bits编码数据,进行循环冗余校验和报文同步计算的并行处理,当通过循环冗余校验,则进行步骤(3),如果未通过循环冗余校验,则数据窗向后移动一位,在RAM中取1023bits编码数据再进行循环冗余校验和报文同步计算的并行处理;
[0010] (3)、1023bits编码数据进行CR校验;
[0011] (4)、根据报文同步计算得到的同步码,查表得到报文帧头偏移量;
[0012] (5)、首先根据报文帧头偏移量在RAM中找到控制位和扰码位地址并读取控制位和扰码位地址的数据:
[0013] 5.1)、当报文帧头偏移量S小于等于913时,控制位区和扰码位区的15bits数据是连续的,取一个变量t,t取值为0到14的整数,其数据在RAM中的地址是:
[0014] AddrCb-B=Addrshift+913-S+t;
[0015] 其中,AddrCb-B是控制位区和扰码位区数据在RAM中的地址,Addrshift是当前数据窗的移位值即在RAM中的累计地址偏移量,S是报文帧头偏移量;t为一个变量,取值范围是0到14,当t大于等于0小于等于2时得到的依次是数据位b109、b108和b107在RAM中的地址,当t大于等于3小于等于14时得到的依次是数据b106,...,b95在RAM中的地址;
[0016] 5.2)、当报文帧头偏移量为914≤S≤927时,控制位区和扰码位区的15bits数据是不连续的,设两个整数变量分别为是m和n,则有:
[0017] a1)、变量m从0开始取值到S-914,得到从数据位b109的RAM地址开始的S-913个数据的地址:
[0018] AddrCb-B=Addrshift+1936-S+m;
[0019] a2)、变量n从0开始取值到927-S,获得中剩余的控制扰码位区段直到数据位b95的数据在RAM地址:
[0020] AddrCb-B=Addrshift+n;
[0021] 5.3)、当报文帧头偏移量为928≤S≤1022,控制位区和扰码位区的15bits数据是连续的,其数据在RAM中的地址是:
[0022] AddrCb-B=Addrshift+1936-S+x;
[0023] x是一个变量,取值范围是0到14,当x大于等于0小于等于2时得到的依次是数据位b109、b108和b107在RAM中的地址,当x大于等于3小于等于14时得到的依次是数据位b106,...,b95在RAM中的地址;
[0024] 在RAM中读取控制位和扰码位地址的数据,并将其中的12bits扰码位数据保存;
[0025] (6)、在读取的控制位和扰码位地址的数据中,检查控制位b108b107的数据值是否合法,如果不合法则数据窗向后移动一位,返回步骤(2);如果合法,则检查控制位中的b109的数据值,如果为1,则用户数据位数据是否需要翻转,如果为0则不需要反转;
[0026] (7)、首先根据报文帧头偏移量在RAM中找到用户数据位地址:
[0027] 7.1)、当报文帧头偏移量S=0时:
[0028] Addr1022=Addrshift+i;
[0029] 其中,i从0取值到912,分别对应着用户数据位b1022,…,b110的在RAM中的地址Addr1022;
[0030] 7.2)、当S≠0,且1≤S≤912时,设两个整数变量j,k;
[0031] b.1)、变量j从0开始取值到S-1,获得用户数据位b1022,b1021,...,b1022-S+1在RAM地址:
[0032] Addr1022=Addrshift+1023-S+j;
[0033] b.2)、变量k从0开始取值到913-S-1,获得用户数据位b1022-S,b1022-S-1,...,b110在RAM地址:
[0034] Addr1022=Addrshift+k;
[0035] 7.3)、当S≠0,且913≤S时,
[0036] Addr1022=Addrshift+1023-S+l;
[0037] 其中,l从0取值到912,分别对应着用户数据位b1022,…,b110的在RAM中的地址Addr1022;
[0038] 依据上述用户数据位地址,依次读取出83组11位用户数据,如果需要反转,则进行反转;然后,依次对83组11位用户数据进行有效字检查和转换,依次得到10位的用户数据,如果在有效字检查中,有一组没有通过检查,则数据窗向后移动一位,返回步骤(2);最后,用扰码位数据计算出解扰器初态值依次对转换得到的10位的用户数据进行解扰,得到用户报文信息。
[0039] 作为本发明的进一步改进,步骤(7)中所述的有效字检查和转换为:
[0040] 依次将83组11位用户数据作为地址送到11位-10位有效字ROM表的地址线上进行查表,在11位-10位有效字ROM表每个单元中储存的是一个11位数据,如果11位用户数据是有效字,则查表得到的11位数据最高位都是0,低10位为其对应的10位的用户数据,11位用户数据是无效字,则查表得到的11位数据最高位都是1;
[0041] 有效字检查模块对查表得到的11位数据最高位进行检查,如果为1,则将其送到解扰模块,在解扰模块中将最高位丢弃,只留下低10位作为有效字转换的结果参与解扰运算,得到用户报文信息,;如果为0,则数据窗向后移动一位,返回步骤(2)。
[0042] 这样将有效字的检查和转换结合在一起进行,有效提高了解码的速度。
[0043] 本发明的目的是这样实现的:
[0044] 本发明FFFS编码报文的解码方法,在计算报文帧头偏移量S的基础上,通过对报文帧头偏移量S的值做分类讨论,找到控制位和扰码位地址,直接读取控制位和扰码位数据,因而不需要将报文重新排序存贮,这样不但可以节省资源,最重要的是可以提高解码速度,缩短解码时间。同时,基于控制位和扰码位是连续的,在本发明中,对于它们的查找在一个步骤完成,也节省了查询时间。

附图说明

[0045] 图1是实现本发明FFFS编码报文的解码方法的状态机原理图;
[0046] 图2是长报文循环冗余校验器原理图;
[0047] 图3是同步码计算原理图;
[0048] 图4是CR校验原理图;
[0049] 图5是S值为0到913时报文数据图;
[0050] 图6是S值为914到927时报文数据图;
[0051] 图7是S值为928到1022时报文数据图;
[0052] 图8是解扰器的结构图;
[0053] 图9是循环冗余校验和同步码计算仿真波形图;
[0054] 图10是同步码值仿真图;
[0055] 图11是控制位和扰码位验证仿真图;
[0056] 图12是用户数据转换仿真图;
[0057] 图13是解码结果仿真图;
[0058] 图14是串口调试结果图。

具体实施方式

[0059] 下面结合附图对本发明的具体实施方式进行描述,以便本领域的技术人员更好地理解本发明。需要特别提醒注意的是,在以下的描述中,当已知功能和设计的详细描述也许会淡化本发明的主要内容时,这些描述在这里将被忽略。
[0060] 1.、FFFS报文格式
[0061] FFFS报文分为两种,长报文与短报文,它们的格式如表1、2所示,其中表1为长报文格式、表2为短报文格式。
[0062]
[0063] 表1
[0064]
[0065] 表2
[0066] 如表1、表2所示,长报文共1023bits,其中,用户数据位包括83组11位字,即b1022,b1021,…,b111,b110共913bits,还原成用户报文信息后为830bits。而短报文共341bits,用户数据位所占的比特数为21组11位字,即b340,b339,…,b111,b110共231bits,还原成用户报文信息后为210bits,长报文比短报文要多出62组11位字。在帧结构上、解码原理和流程上两者基本相同,只是具体每个区段(比如扰码位、附加形成位)的值并不相同,因此,两者的解码流程完全相同(部分转换表除外),本发FFFS编码报文的解码方法尽管是以长报文进行说明的,但也可以适用于短报文,只需要修改其中的具体数值即可。
[0067] 2.、解码总体步骤
[0068] 为了使得解码器能够安全、高效的工作,本发明设计了一种报文位的位置查找办法,减少了RAM的使用和报文重排序所需要的时间。解码的主要步骤如下:
[0069] ①、FFFS长报文编码数据的接收与保存;
[0070] ②、启动解码流程,开始循环冗余校验和报文同步计算得到同步码;
[0071] ③、对1023bits编码数据进行CR校验;
[0072] ④、用同步码查表,转换成报文帧头偏移量;
[0073] ⑤、根据帧头偏移量找到控制位和扰码位地址并读取控制位和扰码位数据;
[0074] ⑥、检查b109的值,判断用户数据位数据是否需要翻转;检查b108b107的值是否合法;
[0075] ⑦、根据帧头偏移量找到用户数据位,读取用户数据;用扰码位数据计算解扰器初态,将用户数据解扰。
[0076] 在上述过程中,如果校验不合格,则数据窗向后移动一位,在RAM中取1023bits编码数据开始解码工作。
[0077] 在本实施例中,上述步骤的调配由一个状态机来完成,对应上述步骤,状态机图如图1所示:
[0078] 如图1所示,当报文数据未送来的时候状态机处于初始化和复位的状态。当检测到接收了报文数据后,开始同时进行循环冗余校验和求解同步码。若报文未能通过循环冗余校验,则返回初始化状态,移动数据窗,完成报文取数据移位操作;若通过了循环冗余校验,则进行CR位检查。若未通过CR位检查,同样返回初始化状态,并移动数据窗;若通过了CR位检查,根据同步码找转化而来的报文帧头偏移量,找到控制位,做控制位检查;若控制位b108b107非法,则返回;如果通过控制位检查,则进行找到用户数据位,做有效字检查,如果未通过有效字检查,则返回。通过,则进行解扰,完成解码工作。
[0079] 下面对各个部分要做详细说明:
[0080] 2.1、报文接收与保存
[0081] FFFS编码报文是循环发送的,接收FFFS编码报文的起始点不一定是报文帧头。FFFS编码报文送来以后先保存在RAM中,当达到1023bits时,开始解析报文。解析报文的就是循环冗余校验和报文同步计算的并行处理过程。报文数据接收速率564kbps。
[0082] 2.2、循环冗余校验
[0083] 以长报文为例,所谓循环冗余校验就是报文做被除数,编码方和解码放事先约定好的对应的生成多项式g(x)做除数,如果它们的余数为零,则表示报文通过了循环冗余校验,否则表示报文出错。
[0084] 在本实施例中,利用硬件作取余运算可以用线性反馈移位寄存器来实现。如图2示,报文从最高位开始由校验器左侧的输入端输入,线性反馈移位寄存器共有75个存储单元,即r0…r74。图中76个反馈路径上有76个开关,即g0…g75。由于生成多项式g(x)被规定最高位和最低位的系数必须非零,所以g0和g75必定为1,即这两个开关必定闭合。其他的74个开关分别对应g1…g74的值,值为1的开关闭合,值为0的开关断开。圆圈十字符号表示异或逻辑。r74反馈回来与开关闭合的异或门作异或运算。长报文的g(x)如下式所示:
[0085] g(x)=x75+x73+x72+x71+x67+x62+x61+x60+x57+x56
[0086] +x55+x52+x51+x49+x46+x45+x44+x43+x41+x37
[0087] +x35+x34+x33+x31+x30+x28+x26+x24+x21+x17
[0088] +x16+x15+x13+x12+x11+x9+x4+x1+1
[0089] 报文进入线性反馈移位寄存器后,需要和报文位数相同多个的工作时钟来完成取余运算。如果r1,…,r75中的值全部为0,则表示余数为0,报文校验正确;反之,r1,…,r75中存在若干个1,则表示余数非0,报文有错。
[0090] 循环冗余校验属于现有技术,在此不再赘述。
[0091] 2.3同步码计算
[0092] 具体来讲,查找报文帧头需要两个步骤。首先将f(x)作除数,报文作被除数进行取余,得到的余数便是同步码,然后将这个同步码转换为帧头偏移值。如图3示,[0093] 这个是一个10bits的线性反馈移位寄存器,它有10个存储单元r0…r9,在反馈路径上有11个开关,即f0…f10。同步多项式f(x)被规定最高位和最低位的系数必须非零,所以f0和f10必定为1,即这两个开关必定闭合。其他的9个开关分别对应f1…f9的值,值为1的开关闭合,值为0的开关断开。圆圈十字符号表示异或逻辑。报文按照先高位后低位的顺序进入线性反馈移位寄存器。其中,同步多项式f(x)为:
[0094] f(x)=x10+x9+x7+x6+x4+x3+x2+x+1。
[0095] r9通过联通的反馈路径与参与异或门运算。经过1023个clk完成报文的取余运算,存留在r0…r9中的数据便是求得的同步码。同步码并不是报文帧头的偏移量,若要得到报文帧头的偏移量还需要将同步码进行查表转换,得到偏移量S。
[0096] 2.4、报文位数的CR校验
[0097] 所谓的CR校验其实就是比较两帧长度均为C比特的报文相同位置区段的值是否相等,如图4所示,取第一帧的前r位和第二帧的前r位,对应位一一对应,逐位作比较。如果报文没有丢位、插位等错误,那么应该有:
[0098] bs=bs+c
[0099] bs+1=bs+c+1
[0100] …
[0101] bs+r=bs+c+r;
[0102] bs是报文的起始位,它可能是报文中的任意某位;bs+c下面紧接着的另一帧报文的相同位置。
[0103] 2.5、控制位、扰码位查找与报文翻转
[0104] 对于长报文,若要得到控制位cb以及扰码位sb值,就需要知道它们在这一帧中的位置。在已知报文帧头偏移量S的情况下,就可以根据报文帧头偏移量S的值做分类讨论找到控制位cb以及扰码位sb值,不需要将报文重新排序存贮,这样不但可以节约解码资源,最重要的是可以减少译码时间,这是本发明的亮点。控制位cb以及扰码位sb值的处理可以放在同一个模块中,它们的查找可以在中心控制单元中一个步骤完成。这是因为控制位cb有3bits以及扰码位sb值有12bits,并且它们是连续的15bits,所以可以一个模块和同一个步骤完成查找。
[0105] 对于长报文,对S值进行分类讨论:
[0106] ⑴、首先,第一种情况0≤S≤913,如图5示:
[0107] 当S小于等于913时,控制位cb以及扰码位sb的15bits数据是连续的。因此,只要分一种情况即可。取一个变量t,t取值为0到14的整数,其数据在RAM中的地址是:
[0108] AddrCb-B=Addrshift+913-S+t。
[0109] 其中,AddrCb-B是控制位区和扰码位区数据在RAM中的地址,Addrshift是当前数据窗的移位值即在RAM中的累计地址偏移量,S是报文帧头偏移量;t为一个变量,取值范围是0到14,当t大于等于0小于等于2时得到的依次是数据位b109、b108和b107在RAM中的地址,当t大于等于3小于等于14时得到的依次是数据b106,...,b95在RAM中的地址。
[0110] ⑵、第2种情况是914≤S≤927,如图6示:在这种情况下,控制位cb以及扰码位sb的15bits数据是不连续的。因此,要分成两部分来计算。设两个整数变量分别为是m和n,则有:
[0111] a1)、变量m从0开始取值到S-914,得到从数据位b109的RAM地址开始的S-913个数据的地址:
[0112] AddrCb-B=Addrshift+1936-S+m;
[0113] a2)、变量n从0开始取值到927-S,获得中剩余的控制扰码位区段直到数据位b95的数据在RAM地址:
[0114] AddrCb-B=Addrshift+n;
[0115] ⑶、第3种情况是928≤S≤1022,如图7示,当报文帧头偏移量为928≤S≤1022,控制位区和扰码位区的15bits数据是连续的,其数据在RAM中的地址是:
[0116] AddrCb-B=Addrshift+1936-S+x;
[0117] x是一个变量,取值范围是0到14,当x大于等于0小于等于2时得到的依次是数据位b109、b108和b107在RAM中的地址,当x大于等于3小于等于14时得到的依次是数据位b106,...,b95在RAM中的地址;
[0118] 总之,当中心控制单元收到报文帧头偏移量S后,就会判断报文帧头偏移量S的值进入合适的处理分支。上述地址的计算和发送都是在中心控制单元中进行的。
[0119] 控制位检查模块接收RAM发来的15bits数据,并将其中12bits的B值保存下来供解扰模块调用。
[0120] 在读取控制位和扰码位地址数据中,检查控制位b108b107的数据值是否合法,如果不合法则数据窗向后移动一位,返回;如果合法,则检查控制位中的b109的数据值,如果为1,则用户数据位数据是否需要翻转,如果为0则不需要反转。
[0121] 2.6.有效字检查、转换和解扰
[0122] 在本小节中主要体现在11位有效字检查、转换和解扰三个步骤并行处理。虽然严格来说,它们三者并不是完全并行设计的,对于同一段数据的处理他们之间可能要相差几十个时钟。但是,即使是不完全并行,这样的并行处理还是能大约减少三个步骤串行处理时间的三分之二。
[0123] 其中,有效字的检查种是一种更加快速简洁的检查办法。
[0124] 针对长报文为要找到每一个11位有效字,就需要知道报文的帧头。当我们得到帧头偏移量S后,就可以对S进行分类讨论,找到所有的11位字。分类的依据主要是S等于零或是不等于零:
[0125] 首先根据报文帧头偏移量在RAM中找到用户数据位地址:
[0126] (1)、当报文帧头偏移量S=0时:
[0127] Addr1022=Addrshift+i;
[0128] 其中,i从0取值到912,分别对应着用户数据位b1022,…,b110的在RAM中的地址Addr1022;
[0129] (2)、当S≠0,且1≤S≤912时,设两个整数变量j,k;
[0130] b.1)、变量j从0开始取值到S-1,获得用户数据位b1022,b1021,...,b1022-S+1在RAM地址:
[0131] Addr1022=Addrshift+1023-S+j;
[0132] b.2)、变量k从0开始取值到913-S-1,获得用户数据位b1022-S,b1022-S-1,...,b110在RAM地址:
[0133] Addr1022=Addrshift+k;
[0134] (3)、当S≠0,且913≤S时,
[0135] Addr1022=Addrshift+1023-S+l;
[0136] 其中,l从0取值到912,分别对应着用户数据位b1022,…,b110的在RAM中的地址Addr1022;
[0137] 依据上述用户数据位地址,依次读取出83组11位用户数据,如果需要反转,则进行反转;然后,依次对83组11位用户数据进行有效字检查和转换,依次得到10位的用户数据,如果,在有效字检查中,有一组没有通过检查,则数据窗向后移动一位,返回;最后,用扰码位数据计算出解扰器初态值依次对转换得到的10位的用户数据进行解扰,得到用户报文信息。其中,
[0138] 依次将83组11位用户数据作为地址送到11位-10位有效字ROM表的地址线上进行查表,在11位-10位有效字ROM表每个单元中储存的是一个11位数据,如果11位用户数据是有效字,则查表得到的11位数据最高位都是0,低10位为其对应的10位的用户数据,11位用户数据是无效字,则查表得到的11位数据最高位都是1;
[0139] 有效字检查模块对查表得到的11位数据最高位进行检查,如果为1,则将其送到解扰模块,在解扰模块中将最高位丢弃,只留下低10位作为有效字转换的结果参与解扰运算,得到用户报文信息,;如果为0,则数据窗向后移动一位,返回。
[0140] 要对报文进行解扰,首先需要本段报文的解扰码是多少。利用Cb校验模块发来的B值求解解扰码T:
[0141] T=(2801775573×B)mod232;T是解扰器的初态值,一个32bits的二进制数。解扰器其实也是一个32位的线性反馈移位寄存器。其多项式为:
[0142] T(x)=x32+x31+x30+x29+x27+x25+1;
[0143] 解扰器的结构如图8所示,这个线性反馈移位寄存器和前面用到的线性反馈寄存器是一样的。其多项式和前面几个的意义是相同的,此处不再赘述。需要说明的是解扰出来的830bits数据的最高10bits并不是真正的原报文。设解扰出来报文的10bits字分别是U'K-1…U'0等。以长报文为例,K=83,则除了U'82外其他的10bits字均是原用户信息中的字,但是U'82不是。U'82的求解还要按照下面这个公式3-15来计算:
[0144]
[0145] 最后,用这个新得到的UK-1替换掉U'K-1,得到的830bits数据就是原用户报文信息。至此,报文译码顺利结束。
[0146] 在整个译码器中,还有一个时钟终止模块,让先译码成功的通道终止另一条通道工作。因为长短报文两条译码通道不能都译码成功,最先译码成功的便是正确的结果。
[0147] 三、硬件测试
[0148] 1、选取待测报文
[0149] 首先,在本实施例中,提供一帧长报文编码,并以此为例来进行说明。报文编码是一段1023bits的二进制编码。
[0150] 报文编码(二进制,按顺序依次从MSB到LSB):
[0151] 11110000010010100101110101101001110000100000101011111111001110100001011010100011010111010000001111001011000010011011000011011011001000010011110011
10011011111001010111110110100111101111001011011110011011001111000101111011011
01111101111000110011000101001011100010101100110001011010111100101110010101110
11100110110001110011100111101011101011011111101100000100010111001000011101111
01011010001111100101000000110101101100111101110101111011001100010101111001000
00011001111101101000101010101011101011010001111011101010101111101101101011101
01000110100100111101111111011010010111110011110110011110110110110110001010000
11001001111110100110000000111101101111010100101101110111111000111001111110100
11000110111011111101010011011000011100001101101111110111111011110111100110010
00011001001101000010010010110001110011001110110111011001010110100001110000111
00001001101001110011101101100100100101101011100000111111110001001000011001000
00001000111001101101010010111110110111111101001010110000011110110111101011111
010010111101000010111101100101。
[0152] 下面是此段报文的译码结果,它是一段830bits的用户信息。校验位、控制位等等已被丢弃。译码结果如下:
[0153] 报文译码结果(十六进制,按顺序依次从MSB到LSB):
[0154] 8020011E04000287588BD6489CD89951D4558D495A1853D4D34BD75A9C1C0D8CD45491CDDA3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC。
[0155] 报文译码结果(二进制,按顺序依次从MSB到LSB):
[0156] 10000000001000000000000100011110000001000000000000000010100001110101100010001011110101100100100010011100110110001001100101010001110101000101010110
00110101001001010110100001100001010011110101001101001101001011110101110101101
01001110000011100000011011000110011010100010101001001000111001101110110100011
11111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111。
[0157] 2.验证循环冗余校验和同步值
[0158] 首先,使用上节中给出的待测报文在Quartus下进行时序仿真,观察时序关系是否符合要求,还有得到的校验结果、同步码值、有效字值等是否与理论值相等。上文中曾经讲过,循环冗余校验和同步值计算两个过程是同时进行的,这个过程在100MHz时约用时10us。按照译码流程,先来观察各个值,仿真波形如图9所示:
[0159] 在上图中,Q_L是报文的二进制编码;OE_check_s是循环冗余校验校验成功信号,高电平有效;Sx是同步码值。图中OE_check_s出现了一个时钟周期的高电平,这是一个循环冗余校验成功信号(同样还有一个OE_check_f信号,发出高电平脉冲表示校验报文有错)。这个信号产生的时刻也是同步码计算得到的时刻。Sx的值如图10所示,Sx的值为868,查找同步码置换表得到报文帧头偏移量(工程中存在Sync.mif文件中),如表3所示:
[0160]Addr +0 +1 +2 +3 +4 +5 +6 +7
864 611 542 605 917 3 234 187 976
872 353 403 942 1005 382 753 130 530
[0161] 表3
[0162] 由表3可以得到,868地址内存储的数据为3。即得到报文帧头偏移量为3,这段报文开始的位置是b1019。这样报文循环左移3位就得到了从帧头至帧尾的正常顺序的长报文:
[0163] (十六进制,按顺序依次从MSB到LSB):
[0164] BE094BAD38415FE742D46BA07961361B64279CDF2BED3DE5BCD9E2F6DF78CC52E2B316BCB95DCD8E73D75BF608B90EF5A3E5035B3DD7B315E40CFB4555D68F755F6D751A4F7F697CF6
7B6D8A193F4C07B7A96EFC73F4C6EFD4D870DBF7EF7990C9A1258E676ECAD0E1C269CED925AE0FF1219011CDA97D BFA560F6F5F4BD0BD8。
[0165] (二进制,按顺序依次从MSB到LSB):
[0166] 10111110000010010100101110101101001110000100000101011111111001110100001011010100011010111010000001111001011000010011011000011011011001000010011110
01110011011111001010111110110100111101111001011011110011011001111000101111011
01101111101111000110011000101001011100010101100110001011010111100101110010101
11011100110110001110011100111101011101011011111101100000100010111001000011101
11101011010001111100101000000110101101100111101110101111011001100010101111001
00000011001111101101000101010101011101011010001111011101010101111101101101011
10101000110100100111101111111011010010111110011110110011110110110110110001010
00011001001111110100110000000111101101111010100101101110111111000111001111110
10011000110111011111101010011011000011100001101101111110111111011110111100110
01000011001001101000010010010110001110011001110110111011001010110100001110000
11100001001101001110011101101100100100101101011100000111111110001001000011001
00000001000111001101101010010111110110111111101001010110000011110110111101011
111010010111101000010111101100。
[0167] 3.验证控制位、扰码值
[0168] 虽然上文中我们得到报文帧头偏移量后写出了正确顺序的长报文,但是上文中已经讲过在实际的译码器中我们是不会对报文进行重排序再保存的。而是按照代数运算求得控制位等等信息位的RAM地址。接下来下一步就要验证查到的cb位校验、sb值是否正确,如图11示,首先是CR校验正确(NR_s发出一个高电平脉冲),表示报文的可能没有丢位插位的情况发生。然后,Cb控制位校验均产生了一个校验成功的宽度为1个时钟的脉冲,这个信号的产生说明b107b108=10,报文的格式有效。Cb_check_s脉冲将会发送给中心控制单元。从图11中可以看到,扰码值为000000010001,即十进制17。这个扰码值将参与解扰器初值的运算。
[0169] 通过公式计算:
[0170] (17×2801775573)mod232=385544485。
[0171] 将385544485(十进制)化为00010110111110101111000100100101(二进制),这个32位二进制数就是解扰器的初态。
[0172] 4.验证有效字检查和转换
[0173] 每11个时钟产生一个11位字,这个字是串并转换得来的。其实,这种10位字扩位11位字,然后接收方再按照事先约定好的反转换表将11位字还原为10位字的编码方式称之为BCH码,此处不再赘述。下面看测试过程,由于11位字一共有83个,一一列举势必占据大量篇幅。所以随机截取一段有效字检查和转换在波形仿真中的截图,通过这个段截图12来说明和验证这个转换的过程。
[0174] 可以从上图中看到,rdclk作为11位-10位字转换表的读时钟。rdclk的上升沿读取了10100000011这个11位字。然后,这个二进制数将被当做11位-10位有效字转换表的读地址,读取ROM表中该地址的数据。将10100000011转化为十进制,即1283,在转换表中查找,如表4示:
[0175]Addr +0 +1 +2 +3 +4 +5 +6 +7
1272 629 630 2047 2047 631 2047 632 2047
1280 2047 633 2047 634 635 636 637 638
1288 2047 2047 639 640 2047 2047 641 642
[0176] 表4
[0177] 表4中,地址1283里存贮的数值是634,将634转化为二进制数是01001111010。对照图4-6中的ten_bits的值也是01001111010,二者完全相同,证明了有效字转换的正确性,并且转换出来的10位有效字为低10位1001111010。并且01001111010的最高位为
0,说明它是个有效的11位字转换而来的。从图4-6中我们还可以看到,在存储单元中有若干个‘2047’(作者自己定义为二进制数11111111111,即十进制2047,其实只要是二进制数
1xxxxxxxxxx都满足本设计方案的11位字是否有效的检查条件),这个值(2047)对应的所有地址值均是无效的11位字。
[0178] 5.验证解扰和输出
[0179] 这帧报文在Quartus时序仿真中的解码结果如图13,这个过程在100MHz时大约用时10us。保留用户信息串行输出data信号,并在FPGA内部将串行的830bits用户数据转换为4bits的并行输出,便于观察。由于结果译码较长,所以采取了分段截图。
[0180] 在图13中data_h的数据依次从左到右按顺序读下来是:
[0181] 8020011E04000287588BD6489CD89951D4558D495A1853D4D34BD75A9C1C0D8CD45491CDDA3FFF···。
[0182] data的数据依次读出是:
[0183] 10000000001000000000000100011110000001000000000000000010100001110101100010001011110101100100100010011100110110001001100101010001110101000101010110
00110101001001010110100001100001010011110101001101001101001011110101110101101
01001110000011100000011011000110011010100010101001001000111001101110110100011
1111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111···
[0184] data_h和data的结果都与给出的标准译码结果完全相符合,证明了译码器逻辑的正确性。下面要测试在实际的硬件上能否正确运行。
[0185] 6.硬件测试
[0186] 图14中,串口采用传输速度为115200bps,8bits数据位,无奇偶校验位传输。由报文解析结果的低位开始向上位机传输,所以解析结果应从图中最后位开始读。又由于串口采取8bits数据帧格式传输,所以每两个十六进制数为一组。按顺序读应为:80、20、01、1E、04、···、FF、FC,所以报文就是:8020011E04000287588BD6489CD89951D4558D495A185
3D4D34BD75A9C1C0D8CD45491CDDA3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC,译码结果正确。
[0187] 如图8所示,由于对于长报文来说用户信息有830bits,而串口数据帧中每帧有8位数据位,所以串口至少要发送832bits数据。在报文发送之初,需要先发送两个空信号,在空信号这里定义为0。这就有了报文末位的‘C’,即‘1100’,最后两个0无意义,非本译码结果中的有效位。
[0188] 至此完成了整个解码器的设计与验证。
[0189] 尽管上面对本发明说明性的具体实施方式进行了描述,以便于本技术领域的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。