第10章编码与译码第10章编码与译码10.1伪随机序列10.2帧同步检出10.3RS码10.4Viterbi译码第10章编码与译码10.1伪随机序列对于数字信号传输系统,传送的数字基带信号(一般是一个数字序列)由于载有的信息,在时间上往往是不平均的(比如数字化的语音信号),对应的数字序列编码的特性不利于数字信号的传输。我们可以通过对数字基带信号预先进行“随机化”(加扰)处理,使得信号频谱在通带内平均化,改善数字信号的传输;在接收端进行解扰操作,恢复到原来的信号。第10章编码与译码伪随机序列广泛应用于这类加扰、解扰操作中。下面以一类伪随机序列——m序列为例,用DSPBuilder构建一个伪随机序列发生器。10.1.1m序列m序列即最长线性反馈移位寄存器序列,是一种比较常见的伪随机序列发生器,可由线性反馈寄存器(LinearFeedbackShiftRegisters,LFSR)来产生。如图10-1所示。第10章编码与译码z-1z-1z-1z-1z-1输出Cn=1Cn-2C2C1Cn-1图10-1线性反馈移位寄存器的构成第10章编码与译码图10-1中涉及的乘法和加法都是指模二运算中的乘法和加法,即逻辑与和逻辑异或。要产生最长的线性反馈移位寄存器序列的n级移位寄存器,其特征多项式必须是n次本原多项式。比如,可以生成m序列的5级LFSR的特征多项式为m序列的特征多项式可表示为niiixCxF0)(125xx上式可生成的m序列的周期为。125第10章编码与译码10.1.2m序列发生器模型以为例,利用DSPBuilder构建一个伪随机序列发生器。图10-2显示了上式的DSPBuilder模型表示。这里采用相连的延时单元组作为移位寄存器,用异或(XOR)完成模二加运算,输出为mout。125xx第10章编码与译码图10-2m序列发生器模型第10章编码与译码不过图10-2所示的电路可能无法正常工作,这是由于DSPBuilder默认的延时单元在开始工作时存储内容为0,而对于m序列来说,起始序列为全0,那么根据多项式,输出序列将为全0,全0序列不是正常的m序列。因此只要起始时寄存器中有一个为1,m序列就可以正常输出。为此,对图10-2的模型进行修改,修改后的模型见图10-3所示。对图10-3的模型进行仿真,可得到一个伪随机序列,如图10-4所示。第10章编码与译码图10-3修改后的m序列发生器模型第10章编码与译码图10-4m序列发生器的Simulink仿真结果第10章编码与译码10.2帧同步检出在数字通信系统中,同步是非常关键的。由于信号的远距离传输,不可避免地存在信号延时、干扰、非线性失真、收发两端的时钟偏差等。为保证数字传输信号的有效性,必须进行同步。根据同步作用可以分为:载波同步、位同步、帧同步、网同步。本节以帧同步设计为例进行介绍。第10章编码与译码在数字通信中,信号流的最小单元是码元,若干码元构成一个帧,若干个帧再构成一个复帧,……。在接收端,必须分辨出每个帧的起始和接收,否则将无法正确恢复信息。这种同步被称为帧同步(又称群同步)。帧同步有很多实现方法,在此列举一种:连贯插入法。即在每一帧的开头连续插入一个特殊码组,比如巴克码。若在收端检测到该特殊码组的存在,就意味着帧开始了。第10章编码与译码10.2.1巴克码巴克码是一个有限长的数字序列。一个n位巴克码序列,其中1≤i≤n,取值为+1或者-1,其局部自相关函数满足:}{ixjnijiixxjR1)(n,j=00,±1,0<j<n0,j≥n第10章编码与译码即当j=0时,巴克码的局部自相关函数达到峰值;j为其它值时,在附近波动,可以用作帧同步的特殊码组。符合上述自相关特性的码组是存在的,比如{+1,+1,+1,-1,-1,+1,-1}就是7位巴克码序列。当j=0时,,达到峰值;当j=1时,R(i)=1;当j=3、5、7时,R(i)=0;当j=2、4、6时,R(i)=-1。7127)(iixjR第10章编码与译码10.2.2巴克码的检出模型根据10.2.1小节介绍的原理,若需要在数字信号流中检出巴克码组,只要检测序列的自相关函数即可。在Simulink环境中,建立一个DSPBuilder模型,检出7位巴克码,序列为{+1,+1,+1,-1,-1,+1,-1},如图10-5所示。第10章编码与译码图10-5帧同步检出模型第10章编码与译码由ShiftTaps模块完成输入序列存储,由bxp1m、bxn1m子系统模块完成运算。7输入加法器模块完成求和运算。注意,若要求帧同步输出脉冲没有延时,不能选择参数“Pipeline(流水线)”。由Comparator比较器模块和Constant常数模块构成判决电路,Constant模块的值设为6,即只要序列局部自相关函数输出大于6,就认为检出巴克码了。第10章编码与译码对于输入的数字序列值是0或者1,而对于巴克码则是+1和-1。我们在这里规定输入数字信号序列中的0对应于巴克码的-1。据此可以建立两个子系统模块bxp1m和bxn1m,分别完成、。子系统模块图见图10-6和图10-7。图中只用了一个选择器和几个常数模块就实现了要求的的功能。jix*1jix*1jix*1第10章编码与译码图10-6bxp1m子系统第10章编码与译码图10-7bxn1m子系统第10章编码与译码在Simulink中仿真时通过FromWorkspace1模块从MATLAB的工作区获得输入序列:11100101111010011011仿真结果检测到了用于帧同步的巴克码,请见图10-8。第10章编码与译码图10-8仿真结果第10章编码与译码10.3RS码在实际的数字通信传输信道上,信号发生错误是不可避免的。可以采用信道编码来尽可能地降低误码率。在信道编码中除了需要传送的信息之外,还加入了一些冗余信息,以便在收端检测出错误。第10章编码与译码对于检出错误的处理方式常用的有三种:检错重发(ARQ)、前向纠错(FEC)、混合纠错(HEC)。对于前向纠错是不需要反馈信道的,在信道编码中含有纠错信息,实时性较强。RS编码在前向纠错中的使用比较常见。第10章编码与译码10.3.1RS码简介RS码是ReedSolomon码的简称,是属于循环码BCH码的一种,对于突发错误,RS码具有很好的纠错能力。一个RS码,输入信号分成比特一组,每组包括个符号,每个符号由个比特构成。对于一个可以纠正个符号错误的RS码,其参数如表10-1所示。第10章编码与译码表10-1RS码的参数参数名称参数值单位码长符号信息段符号监督段符号最小码距符号符号比特12mnktkn212tm第10章编码与译码10.3.2使用IPCore设计RS编码器对于RS码的编码器,可以用带反馈的移位寄存器来实现,不过实现起来比较复杂。Altera为RS码提供了IPCore——RSCompiler来简化RS编码/译码器的设计。RSCompiler除了可在Quartus II中使用外,还可与DSPBuilder配合使用(见图10-9)。第10章编码与译码图10-9RSCompiler与DSPBuilder集成第10章编码与译码按照图10-9新建一个模型,放置一个ReedSolomon模块。 双击该模块,出现RSCompiler对话框,如图10-10所示。选择“Encode”编码器,然后点击“Next”按钮,进行RS编码器的参数设置(见图10-11)。设置完成后就可以在Simulink中,如其它DSPBuilder模块一样调用RS编码器来完成更大的设计了。第10章编码与译码图10-10选择类型为RS的编码器第10章编码与译码图10-11确定参数第10章编码与译码10.3.3使用IPCore设计RS译码器RSCompiler这个核也可以设计RS译码器。同设计RS编码器时一样调用RSCompiler,选择类型为“Decoder”的译码器,见图10-12所示。接着的参数设置与RS编码器相同,这里不再赘述。最后设计好的RS译码器见图10-13。第10章编码与译码图10-12选择类型为Decoder译码器第10章编码与译码图10-13RS译码器模块第10章编码与译码10.4Viterbi译码10.4.1卷积码的Viterbi译码卷积码与RS码不同,卷积码编码后的个码元不但与当前段的个信息相关,而且与前面段的信息相关,即编码后相互关联的码元为个。因而,在相同码元个数下,卷积码的纠错能力更强,但译码的复杂性也随之提高。第10章编码与译码在卷积码的三种译码方式:门限译码、Viterbi译码、序列译码中,Viterbi译码的性能最好。Viterbi译码基于最大似然译码原理,而且在译码时无须反馈操作。Viterbi译码器的实现比较复杂,具体的Viterbi译码原理请参见相关书籍。第10章编码与译码10.4.2用IPCore设计Viterbi译码器为了简化Viterbi译码器在FPGA上的实现,Altera提供了Viterbi译码器的IPCore——ViterbiCompiler,可在DSPBuilder上集成使用(见图10-14)。具体的ViterbiCompiler的使用方法请参考Altera的使用手册。第10章编码与译码图10-14Viterbi译码器IPCore第11章DSPBuilder设计规则第11章DSPBuilder设计规则11.1位宽设计规则11.2频率设计规则11.3DSPBuilder设计的取名规则11.4定点数据下标说明11.5在SBF中二进制小数点的位置11.6GoTo和From模块的支持特性第11章DSPBuilder设计规则11.1位宽设计规则在设计中,必须根据具体情况规定输入和输出数据口的位宽,即源端口与目标端口的数据位宽。一旦确定了输入端的数据位宽,SignalCompiler就会通过各中间模块把数据位宽从源端口向目标端口传递。在一定条件下,设计者也可以对所通过的各模块中的数据位宽作一定的设定。例如,在第三章中介绍的调幅设计中,Sinln和SinDelay模块的位宽是16,所以SignalCompiler就自动将这16位宽的数据类型赋予了中间模块Delay。第11章DSPBuilder设计规则应该注意,每一个DSPBuilder模块都有自身的设计规则。在每一模块的使用说明中都包含了其位宽增长的规则。DSPBuilder具有双位字类型,这种类型能支持的最大数据位宽是51位。如果希望位宽超过51位,则必须将数据总线分成多套,每套都不超过51位。如11-1所示的是一个60位加法器设计系统,分成了两个30位总线。第11章DSPBuilder设计规则图11-1两套总线方式的60位硬件加法器第11章DSPBuilder设计规则11.2频率设计规则11.2.1单时钟设计规则如果一项设计中不包含来自RateChange库的锁相环模块PLL,则在Simulink设计转换成硬件系统的过程中,DSPBuilder将使用同步设计规则,即在设计系统中的所有DSPBuilder时序模块,如Delay模块,都以单一时钟的上升沿同步工作,这个时钟频率即为整个系统的采样频率。第11章DSPBuilder设计规则然而需要注意的是,对于这些同步时序的模块,其时钟引脚都不会直接显示在Simulink设计图上,但当SignalCompiler将设计系统转化为VHDL文件时,才自动地把时序模块的时钟引脚都连在一起,并与系统的单一时钟相接。第11章DSPBuilder设计规则但是,如果设计者希望在Simulink图上显示相关的信号端,并能直接控制这些信号端口,可以在DSPBuilder时序模块的参数控制对话框中打开“UseControlInputs”参数表来实现。为了保持Simulink设计域至VHDL域的设置时钟周期的精确性,必须将“Solver”选项设定在“Fixed-step”和“discrete”状态上,并设模式为“SingleTasking”(如图11-2所示)。第11章DSPBuilder设计规则