一种Turbo码交织器
技术领域
本发明涉及移动通信中的交织技术,具体地说,涉及一种Turbo码交织器。
背景技术
Turbo码交织器是Turbo编译码器的重要组成部分,Turbo码具有的优异性能,其根本原因在于Turbo码的实现方案中,交织器实现了伪随机性。在发送端,其伪随机性通过编码器以及并行级联方式来实现;在译码端,则利用具有软输入/软输出特性的交织器的反馈迭代译码来实现。可见,交织器是非常重要的,其性能直接影响Turbo码的性能。3GPP(第三代移动通信伙伴计划)协议给出了一种不规则交织的算法,这种交织器算法非常复杂而且随交织块长度的不同其算法也不同。
按照3GPP规定,Turbo码的交织包括比特输入矩阵,矩阵的行内交换和行间交换,矩阵中的比特输出时将原来不存在的比特删除。以下说明协议中有关Turbo码的交织过程。
设Turbo码的交织输入比特记为x1,x2,x3,...,xK,K是输入的比特数机交织长度,并且40≤K≤5114。Turbo码交织的输入比特序列xk按如下步骤写入矩阵。
(1)确定矩阵的行数R:
矩阵的行数由上到下记为0,1,2,...,R-1。
(2)确定矩阵的列数C:
其中,p为素数。矩阵的列数从左到右记为0,1,2,...,C-1。
(3)将比特序列xk一行一行的写入R×C矩阵,比特x1在0行的0列上:
比特输入R×C矩阵后,矩阵的行间交换和行内交换按以下算法进行:
(1)从表1选择原根v
(2)构造行内交换基本序列s(i)
s(i)=[v×s(i-1)]modp,i=1,2,...,(p-2),ands(0)=1。
其中i为矩阵列序号。
(3)以q0=1为{qj}中的第一个素数,按下式选择连续的最小素数{qj}(j=1,2,...,R-1,为矩阵行序号):
g.c.d{qj,p-1}=1,qj>6,qj>q(j-1),其中g.c.d.是最大公约数。
(4)变换{qj}得到交换素数{rj}
rT(j)=qj,j=0,1,...,R-1,
其中T(j)(j=0,1,2,...,R-1)是行间交换模式,由下式确定的四种行间交换模式之一:Pat1,Pat2,Pat3和Pat4
Pat1,Pat2,Pat3和Pat4分别如下:
Pat1:{19,9,14,4,0,2,5,7,12,18,10,8,13,17,3,1,16,6,15,11}
Pat2:{19,9,14,4,0,2,5,7,12,18,16,13,17,15,3,1,6,11,8,10}
Pat3:{9,8,7,6,5,4,3,2,1,0}
Pat4:{4,3,2,1,0}
(5)第j个(j=0,1,2,...,R-1)行内交换如下:
a.如果C=p,那么
Uj(i)=s([i×rj]mod(p-1)),i=0,1,2,...,(p-2),andUj(p-1)=0,
其中Uj(i)是第j行经过行内变换后的第i个输出的输入比特的位置。
b.如果C=p+1,那么
Uj(i)=s([i×rj]mod(p-1)),i=0,1,2,...,(p-2),Uj(p-1)=0,andUj(p)=p,
其中Uj(i)是第j行经过行内变换后的第i个输出的输入比特的位置,并且如果K=C×R,那么交换UR-1(p)和UR-1(0)的位置。
c.如果C=p-1,那么
Uj(i)=s([i×rj]mod(p-1))-1,i=0,1,2,...,(p-2),
Uj(i)是第j行经过行内交换以后的第i个输出的输入比特的位置。
(6)基于模式T(j)(j=0,1,2,...,R-1)进行行间交换,T(j)是第j个交换行的原始位置。
p |
v |
p |
v |
p |
v |
p |
v |
p |
v |
7 |
3 |
47 |
5 |
101 |
2 |
157 |
5 |
223 |
3 |
11 |
2 |
53 |
2 |
103 |
5 |
163 |
2 |
227 |
2 |
13 |
2 |
59 |
2 |
107 |
2 |
167 |
5 |
229 |
6 |
17 |
3 |
61 |
2 |
109 |
6 |
173 |
2 |
233 |
3 |
19 |
2 |
67 |
2 |
113 |
3 |
179 |
2 |
239 |
7 |
23 |
5 |
71 |
7 |
127 |
3 |
181 |
2 |
241 |
7 |
29 |
2 |
73 |
5 |
131 |
2 |
191 |
19 |
251 |
6 |
31 |
3 |
79 |
3 |
137 |
3 |
193 |
5 |
257 |
3 |
37 |
2 |
83 |
2 |
139 |
2 |
197 |
2 |
|
|
41 |
6 |
89 |
3 |
149 |
2 |
199 |
3 |
|
|
43 |
3 |
97 |
5 |
151 |
6 |
211 |
2 |
|
|
表1:素数p和相关的原根v
经过行内和行间交换,矩阵的比特记为y′k:
Turbo码交织的输出比特是将经过行内和行间交换的矩阵R×C按列依次输出,起始比特y′1在0列的0行,结束比特y′CR在C-1列的R-1行。输出时,将输入序列中不存在的比特去掉,也就是说,对应于x′k的比特y′k,如果经过行内和行间交换矩阵中有k>K的比特y′k,则在输出时要去掉。交织后的输出记为x′1,x′2,...,x′K,x′1对应于经过整理的y′k,k是最小序号,x′2对应于经过整理的y′k,k是次小序号。交织的输出比特数为K,需要删除的比特数为R×C-K。
上述协议规定的交织算法,在实际的编译码应用中,通常预先根据交织算法生成交织表,通过查表获得用于交织的输入比特和输出比特位置的对应关系,以省去交织过程中复杂的算法。例如,一种方案是,按照协议中规定的所有交织长度,为某些交织长度特别值建立输入比特和输出比特位置的对应关系的位置表,即基本表或交织表,比如分别建立交织长度为40比特、50比特、55比特等的位置表,一般包括220个,进行交织时首先根据交织长度选择对应的位置表,然后根据位置表查找当前输入比特对应的输出比特的位置;另一种方案是,预先估计需要提供的业务类型和交织长度,根据交织长度建立位置表,以减少交织表的存储量,进行交织时直接根据位置表查找当前输入比特对应的输出比特的位置。
无论采用何种方式建立交织表,这种通过查表实现交织的方式在一定程度上可以减少交织算法的运算量,但当交织表的存储量很大,由此所需的查找运算量和查找时间也很大,并且非常不利于硬件的实现。
发明内容
有鉴于此,本发明的目的在于提供一种Turbo码交织器,以用硬件电路实现协议中规定的交织算法,避免现有技术中通过查表方式实现交织的缺点。
本发明的交织器通过以下技术方案实现:
一种Turbo码交织器,其特征在于,所述交织器包括初始化模块,计算模块,以及,包含有控制电路和用于存储有效交织地址的缓存器的缓存模块,来自外部的时钟信号分别送至上述模块,其中,
初始化模块接收到来自外部的初始化启动信号后,根据当前业务的交织长度从外部存储器读取比特输入矩阵的行数、列数、素数和原根,根据读取的上述参数计算当前业务的所有行内交换基本序列并存储,向外部输出初始化结束标志,且向计算模块输出包括交织长度、行数、列数以及素数的参数组和用于读取行内交换模式和交换素数的基地址;
计算模块接收到外部模块根据初始化模块输出的初始化结束标志而产生的启动信号后,根据当前行序号和初始化模块输出的基地址,计算用于读取存储于外部存储器的读取行内交换模式和交换素数的读地址,根据读地址读取行内交换模式和交换素数,并读取来自外部的正逆序标志以及存储于初始化模块中的行内交换基本序列,根据读取的行内交换模式、交换素数以及行内交换基本序列,按列数和素数的关系,选择以下公式计算比特输入矩阵的第j行第i列对应的交织地址:
如果列数和素数相等,则
如果列数等于素数与1之和,则将交织长度与比特输入矩阵的行数和列数之积进行比较,如果不相等,则按式(b)计算,如果相等,则按式(c)计算,
如果列数等于素数与1之差,则
intterleaver_address=T(j)*C+s((i*rT(j))mod(p-1))-1,[i=0,...,p-2;j=0,...,R-1](d)
其中,T(j)为行间交换模式,C为比特输入矩阵的列数,R为比特输入矩阵的行数,p为素数,s((i*rT(j)mod(p-1))为行内交换的基本序列,rT(j)为交换素数;
所述计算模块在计算交织地址后,将有效交织地址标志、计算出的交织地址以及开始存储控制信号输出至缓存模块中的控制电路;
缓存模块中的控制电路根据来自外部的所述启动信号、开始存储控制信号以及有效交织地址标志,向用于存储有效交织地址的缓存器输出写使能信号,并输出写地址和读地址至所述缓存器;缓存器受控制电路的控制,将来自计算模块输出的交织地址中的有效交织地址写入,并按照外部模块的读时序要求输出缓存于所述缓存器的交织地址。
本发明在对3GPP Turbo交织算法进行研究的基础上找出其中的规律,针对列数与素数、交织长度与列数与行数之积的关系的几类情况,给出交织前后地址的映射关系,极大地节省了存储空间,优化了交织算法。根据上述交织地址的计算规律以及Turbo编译码器的时序要求,从而对交织器的硬件电路进行了设计,提出了其硬件实现方案。相对于现有技术中以查表进行交织的方式而言,本发明提供的交织器,由于其参数可以通过设置以适应不同业务的需要,因此具有一定的灵活性,且占用的存储空间少;并且通过正逆序标志对交织器中计算模块的控制,使得交织地址的正序计算和逆序计算可共用同一个硬件结构,更适合于Turbo码编译码算法的硬件实现,尤其是ASIC实现。
附图说明
图1a和图1b为计算正序交织地址的流程图。
图2示出了Turbo码交织器的总体框图。
图3示出了计算模块硬件原理图。
图4为乘除法运算流水线示意图。
图5示出了缓存模块电路原理图。
图6为交织器输入输出的时序关系图。
图7为写时序和读时序相同时缓存模块电路原理图。
具体实施方式
本发明通过对3GPP协议规定的交织方法的总结和归纳,得到在不同交织长度下,比特输入矩阵中各比特在交织后所对应的输出比特序列中的位置,即,得到交织前后地址的映射关系。具体方法如下:
首先,根据当前比特输入矩阵中矩阵列数选择相应的计算式,计算矩阵中第j行第i列的输入比特对应的输出比特序列中的位置,即交织地址;
(1)当C=p时,
(2)当C=p+1时
a.若K≠C×R
b.若K=C×R
(3)当C=p-1时
intterleaver_address=T(j)*C+s((i*rT(j))mod(p-1))-1,[i=0,...,p-2;j=0,...,R-1]
然后,比较计算的交织地址与交织长度,如果交织地址大于交织长度,则去掉该交织地址。
图1a和图1b为计算正序交织地址的流程图。从流程图可见,计算以i作为外循环(i=0,...,C-1),以j作为内循环(j=0,...,R-1),对第(2)种情况,即C=p+1,当K=C×R时,是一种特殊情况,在3GPP协议中规定要将UR-1(p)和UR-1(0)的位置进行交换,而在本发明中通过计算公式可以得到。如果计算逆序交织地址,只需在初始化时将行序号和列序号分别设为R-1和C-1,流程中行序号和列序号按递减变化。
上述交织地址的计算方法可采用硬件电路实现。参见图2所示,图2示出了Turbo码交织器的总体框图,包括初始化模块、交织地址计算模块、以及用于进行输入输出速率转换的缓存模块,该缓存模块包含有控制电路和用于存储有效交织地址的缓存器。其中,
初始化模块收到初始化启动信号start_ini后,根据外部模块送来的当前交织长度、业务参数表索引地址,从交织器外部的第一ROM存储器中读取包括素数p、原根v、以及比特输入矩阵列数C、行数R的参数组,并送至计算模块;根据协议标准按读取的参数计算当前业务的所有行内交换基本序列s(i),并存入初始化模块中的RAM,其中,当C=p-1时,将计算得到的s(i)的值减1后存入初始化模块中的RAM;当行内交换基本序列计算完毕后,向交织器外部模块输出初始化结束标志flag;将基地址送至计算模块;
当外部模块收到初始化结束标志后,向计算模块和缓存模块中的控制电路发送启动信号start_cp,同时,计算模块读取来自外部的正逆序标志up_down,以确定是按正序还是按逆序计算交织地址;计算模块从交织器外部的第二ROM存储器中读取行间交换模式T(j)和交换素数rT(j),根据初始化模块中RAM存储的行内交换基本序列s(i)、读取的T(j)和rT(j)、以及来自初始化模块的参数组,按C与p的关系选择相应的计算公式计算输出序列的交织地址,并向缓存模块输出该交织地址以及控制信号,其中控制信号包括开始存储控制信号start_save以及有效交织地址标志valid_flag;
缓存模块的控制电路在来自外部的所述启动信号、开始存储控制信号以及有效交织地址标志的控制下,向用于存储有效交织地址的缓存器输出写使能信号,将计算出的交织地址中的有效地址写入缓存器,缓存器在读时序的控制下输出写入的交织地址;并在写时序和外部模块的读时序不相同时,如果写地址等于写地址阈值,则向计算模块输出停止计算信号stop_work有效以停止交织地址的计算,并停止写操作,如果读地址等于读地址阈值,则向计算模块输出停止计算信号stop_work无效,以启动交织地址的计算并启动写操作。
以下以Turbo码编译码器要求交织器每4个时钟周期输出一个交织地址为例,描述上述各模块的电路原理。
参见图3所示,图3示出了计算模块硬件原理图。来自缓存模块的停止计算信号stop_work以及外部的start_cp信号送至具有三个状态的第一状态机的使能端,所述状态机实质为3进制的计数器。当stop_work信号无效且start_cp信号有效时,第一状态机开始计数输出,以向计算模块中行计数器、列计数器、各锁存器、以及输出延迟单元提供时钟信号。地址计算单元根据来自初始化模块的基地址和行计数器输出的行序号j,计算行间交换模式T(j)和交换素数rT(j)对应的存储地址,向第二ROM存储器的读地址端输出该地址,第二存储器根据读地址查找对应的行间交换模式T(j)和交换素数rT(j),分别输出至第一乘法器和第二乘法器,其中第一乘法器计算列数C与行间交换模式T(j)的乘积后输出到第一锁存器,第二乘法器计算交换素数rT(j)与列计数器输出的列序号i的乘积后,输出到第二锁存器。第二锁存器输出至除法器,除法器将第二锁存器的输出与p-1进行模运算,以计算因式(i*rT(j))mod(p-1),除法器输出计算结果至第三锁存器。第三锁存器将该计算结果作为读地址输出至存储了行内交换基本序列s(i)的初始化模块中的RAM,该RAM根据读地址输出该地址对应的行内交换基本序列s(i)至复用器,复用器根据列数C与素数p的关系以及当C=p+1时K与C*R的关系,从复用器的0值、p值、s(i)或1值输入信号中选择满足交织地址计算式的输入信号进行选择性复用,复用后输出至加法器,加法器将来自第一锁存器的计算值与来自复用器的值进行叠加,然后输出至第四锁存器,此时加法器的输出值即为按交织计算公式计算的交织地址。比较器将第四锁存器的输出值和交织长度进行比较,如果第四锁存器的输出值小于等于交织长度,则比较器输出有效交织地址标志valid_flag的有效值至第五锁存器,通过第五锁存器输出,否则,比较器输出有效交织地址标志valid_flag的无效值至第五锁存器。同时,输出延迟单元将来自第四锁存器的交织地址延迟一个时钟周期后输出至缓存模块中的缓存器,即,向缓存模块输出信号cp_output,以使得交织地址的输出与有效交织地址标志valid_flag的输出的时序一致。
在上述计算模块中,各锁存器为了满足交织器的时序要求而引用;行计数器中可以具有分频器,以实现在计算的过程中,以i作为外循环(i=0,...,c-1),以j作为内循环(j=0,...,R-1)计算。来自外部的正逆序标志up_down信号分别输入至行计数器和列计数器的控制端,以控制当进行正序交织地址计算时,行计数器和列计数器采用递增方式计数,当进行逆序交织地址计算时,采用递减方式计数。行计数器和列计数器的输出信号还分别送至控制逻辑,该控制逻辑在计算出交织地址的时序中向缓存模块输出开始存储控制信号start_save。
最核心部分是乘除器的计算,它将决定交织器的工作速度,在本发明中,使用流水线的方法来完成乘除器的运算,一个乘法器和除法器计算一次(i*rT(j))mod(p-1),由于使用第一状态机的状态2来进行锁存、数据的读取,所以乘法和除法的计算都是各用3个时钟周期,乘除法运算的速度均可以满足要求。乘除法运算流水线见图4,这是一个2级流水。采用流水线的方式可以比无流水线方式的速度提高一倍。除法器可以采用EDA综合工具中的库直接生成,不需要自己写VHDL程序,不仅使用方便,而且面积小,功能齐全。
参见图5所示,图5示出了缓存模块电路原理图。其中,用于提供写操作地址控制的3进制第三状态机、用于提供读操作地址控制的4进制的第四状态机、写地址计数器、读地址计数器、与门以及停止计算信号产生模块组成了控制电路。来自外部的启动信号start_cp分别输入至第三状态机和第四状态机的计数使能端,时钟信号分别提供给第三状态机、第四状态机、以及用于缓存交织地址的RAM,来自计算模块的开始存储控制信号start_save、来自计算模块的有效交织地址标志valid_flag、以及第三状态机的输出信号输入至与门进行与逻辑运算后输出到缓存交织地址的缓存器的写使能端。第三状态机的输出信号还输出至写地址计数器,第四状态机的输出信号输出至读地址计数器,从而使得写操作每3个时钟执行一次,读操作每4个时钟执行一次。写地址计数器的输出分别输入到缓存交织地址的缓存器的写地址端和停止计算信号产生模块,读地址计数器的输出分别输入到缓存交织地址的缓存器的读地址端和停止计算信号产生模块。停止计算信号产生模块根据输入的写地址判断当前写地址是否等于设定的写地址阈值,如果是,则向计数模块中的第一状态机的计数使能端输出stop_work有效;根据输入的读地址判断当前读地址是否等于设定的读地址阈值,如果是,则向计数模块中的第一状态机的计数使能端输出stop_work无效。来自计数模块中的输出延迟单元的cp_output输出至缓存交织地址的缓存器的数据端。
从缓存模块的组成可以看出,每三时钟周期向缓存交织地址的缓存器写入一个交织地址,每四个时钟周期从缓存器中读出一个有效交织地址,由于写的速度快,读的速度慢,而存储空间是有限的,并且交织地址的计算是实时的,因此当读写进行到一定程度时,要将计算停下来,待再读出一部分数据后再启动计算,以免交织地址还没有读出来就被覆盖。上述停止计算信号产生模块通过输出stop_work信号来实现读写的控制。
参见图6所示,图6为交织器输入输出的时序关系图。当start_ini信号有效时,初始化模块开始工作,通过输入的参数组,选择当前业务下相应的参数(包括p,v,R,C),并实时计算行内交换基本序列s(i)的值,存贮到初始模块内的RAM中,在初始化结束以后,输出一个初始化结束标志flag,反馈给外部模块;当外部模块接收到flag信号后,向计算模块和缓存模块发出start_cp,同时交织器计算模块读外部送来的正逆序标志up_down,并锁入寄存器中,当up_down=’1’时表示正序,为’0’时表示逆序,于是开始进行交织地址的计算,在start_cp信号有效后的第23个时钟周期开始,每计算出一个交织地址,则输出一个开始存储控制信号start_save。
在计算模块中所计算出的交织地址包括有效交织地址和无效交织地址,每三个时钟周期输出一个交织地址。在缓存模块,每3个时钟周期写入一个有效交织地址,每4个时钟周期读出一个有效交织地址。由于无效地址都在比特输入矩阵的第一行,因此至少每隔20个交织地址才会有1个无效交织地址。
如果缓存模块中的控制电路在写时序和外部模块的读时序相同时,这时图2所示交织器中,将没有停止计算信号反馈至计算模块,而缓存模块的电路原理如图7所示。控制电路包括,写地址计数器、读地址计数器、与门以及第二状态机,其中,来自外部的所述启动信号输入至第二状态机的使能端,所述时钟信号输入至第二状态机的输入,第二状态机的输出分别连至写地址计数器和读地址计数器的输入,并还输入至与门的输入;来自计算模块的有效交织地址标志以及开始存储控制信号输入至与门的输入,与门的输出连至缓存器的写使能端;写地址计数器输出写地址至缓存器的写地址端,读地址计数器输出读地址至缓存器的读地址端。