通信原理实验报告汉明编译码系统自行设计实验附加同步.doc_第1页
通信原理实验报告汉明编译码系统自行设计实验附加同步.doc_第2页
通信原理实验报告汉明编译码系统自行设计实验附加同步.doc_第3页
通信原理实验报告汉明编译码系统自行设计实验附加同步.doc_第4页
通信原理实验报告汉明编译码系统自行设计实验附加同步.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汉明编译码系统自行设计实验一、 实验原理差错控制编码的基本作法是:在发送端被传输的信息序列上附加一些监督码元,这些多余的码元与信息之间以某种确定的规则建立校验关系。汉明码(7,4)是一种纠错码,是能纠正单个错误的线性分组码。它有以下特点:码长n=2m-1最小码距d=3信息码位k=2n-m-1纠错能力t=1监督码位r=n-k这里m位2的正整数,给定m后,既可构造出具体的汉明码(n,k)。汉明码的监督矩阵有n列m行,它的n列分别由除了全0之外的m位码组构成,每个码组只在某列中出现一次。系统中的监督矩阵如下图所示:其相应的生成矩阵为:汉明译码的方法,可以采用计算校正子,然后确定错误图样并加以纠正的方法。图9.1和图9.2给出汉明编码器和译码器电原理图。表1.1 (7,4)汉明编码输入数据与监督码元生成表4位信息位a6, a5, a4, a33位监督码元a2, a1, a04位信息位a6, a5, a4, a33位监督码元a2, a1, a00000000100010100010111001110001011010100110011101101100001001111100010010110011010010110001111010001110101111111表1.1为(7,4)汉明编码输入数据与监督码元生成表。编码输出数据最先输出是a6bit,其次是a5、a4,最后输出a0位。2、 实验内容1 编写分频和m序列verilog程序思路:分频:晶振为14.336MHz,要分频得到32kHz,采用计数的方法。14336/(32*2)=224。其中32*2是因为每半个周期电平翻转一次。所以如下图程序中第16行,count1以224为周期计数(即从0数到223),每到数223则clk_32k翻转实现分频。其他频率的分频改变计数值大小即可得到。M序列:M序列又叫做伪随机序列,是不能预先确定但可以重复产生的序列。程序上通过移位寄存器实现。逻辑图如下: 程序: 程序中要注意的是,如第10行处给m_out赋初值,否则0000状态下移位寄存器是无法得到其他值的,会一直处于全0状态。遇到的问题及解决方法:1.编译时出现如下错误:后来发现是由于模块名称的命名问题,注意项目下主模块使用与项目名称相同的命名即可解决。2. 仿真时各个寄存器都没有值。后来发现是仿真文件(.vwf)文件没有保存,必须保存之后才能够得到正确的仿真。M序列仿真现象如下图: 从仿真截图的m_outer一行(最下方一行)可以看出,输出的M序列为:000111101011001,之后又是重复的。对应的寄存器中m_out1中为(倒数第二行从第2个开始):0010、0100、1000、0001、0011、0111、1111、1110、1101、1010、0101、1011、0110、1100、1001。可见生成的M序列各4位码依次符合左移关系,且每15个为一周期,符合M序列为2n-1的规律,n为4时2n-1=15。每个4位码的第4位按顺序即是m_outer中输出的M序列。可见生成的M序列符合相关要求,是成功的。2 以M序列作为输入信号编写(7,4)汉明编码程序,将M序列和汉明码序列输出到测试孔观察和记录。思路: 编码:由编码原理图可以的到编码方程,高4位直接由M序列的4位平移得到,而低3位可由高4位计算得到,如a0=a6+a5+a3。同理可写出整套编码方程如下:h_out6:3=m_out13:0;h_out0=m_out13+m_out12+m_out10;h_out1=m_out12+m_out11+m_out10;h_out2=m_out13+m_out12+m_out11; 输出:因为M序列的时钟是32k的,而4位的M序列对应编码得到的汉明码是7位的,所以由4:7比例关系得到相应的汉明编码输出的时钟应该是56k。仿照上面32k的分频可以的到56k分频程序如下:always(posedge clk)begin if(count2=8d127)/14336/(56*2)=128 count2=8b0; else count2=count2+8b1;endalways(negedge count26)begin clk_56k=clk_56k+1d1;end编码时根据32k时钟每数4个编码一次,同理输出时根据56k时钟每数7个输出一次。程序: 程序中56行以前为定义分频和产生M序列部分,不再重复贴出,57到71行为汉明码编码部分,73到84行为汉明码输出部分。需要注意的是编码的时候数4个编码一次( ),而输出的时候数7个编码一次( )。这样才能保证M序列的4位码与输出7位汉明码之间是匹配的。 遇到的问题及解决方法:一开始我写这段程序的时候没有h_out1,从h_out的4个编码方程把汉明码算出来之后就直接h_out6:1=h_out5:0;移位,然后就输出h_outer=h_out6;一仿真发现输出的汉明码根本找不到规律。后来我发现,在编码和输出之间需要一个缓冲,如果没有缓冲的话,有可能的上面的编码方程里h_out这在按对应位编码,下面输出部分的程序就把h_out给移位输出了,于是此时h_out里各位的值可能在编码还没完成的时候就发生了改变。所以我后来就加入了h_out1作为缓冲,h_out编码完之后先送给h_out1,再由h_out1进行移位之后输出。这样仿真的时候就得到了正确的汉明码输出。汉明码输出仿真现象如下图: 仿真中第4行h_out为编码得到为汉明编码,下方倒数第2行m_out1为M序列。由下图可以明显看出它们的对应关系:(1)汉明码的前4位与M序列完全相同,并且是连续的4个M序列中有1个是与汉明码对应的,而不是每一个都对应。因为M序列移位4次之后才是一个全新的码,才进行一次新的汉明码编码。(2)从上方时钟信号可以看出,每个M序列对应1个32k时钟周期。每个汉明码对应7个56k时钟周期和4个32k时钟周期。(3)汉明码与其相对应的M序列之间有1个32k时钟周期的延时,因为经过了编码过程。所以第一个输出的汉明码0111010之前的输出为0000000.(4)仿真输出的汉明码都符合上文实验原理部分表1.1中信息位与监督码元的关系,输出的都是正确的汉明码。 从仿真来看,M序列和汉明码的输出都是正确的成功的。下载到实验箱观察并记录实验现象:上图为把分频信号送到测试孔从示波器上观察到的波形。上方CH1黄色波形为56k时钟信号,图片右边测量值为55.99kHz。下方CH2蓝色波形为32kHz时钟信号,右边测量值为32.00kHz。可见32k和56k分频得到的实际结果都是很准的。上图中上方黄色波形为32k时钟信号,下方蓝色波形为输出的M序列波形。图中蓝色波形读数为100100011110 仿真波形 实测波形从上方仿真的M序列仿真波形中可以找到完全相同的一段,读数也为10010001110把两者的时钟轴调整为相同宽度时可以看到,仿真与实测波形完全相同。上图中上方黄色波形为56k时钟信号波形,下方蓝色波形为汉明码输出。由两个光标间卡住的7个时钟周期可以读出下方对应的汉明码输出为0001011,如果继续往下读可以读得连续输出为000101111101把时间轴右移一点到如下图:继续把下面的读下去是0010110,连起来即是0001011111010010110其中可以看出0001011后面跟着的下一个七位汉明码是1110100,由上图中两个光标之间卡住的7个时钟信号可以读出下方对应的汉明码输出为1110100,然后在仿真中找到了相应的汉明码输出部分如下图: 由上图仿真中第4行h_out可以找到连续的一段汉明码输出为0001011111010010110与之前上面示波器中实测读得的序列0001011111010010110完全相同。可见实验箱实际观察测得的汉明编码输出与仿真完全一致,符合汉明编码的相关性质。3.将汉明编码序列加错,模拟信道误码。注意加错频率。思路:因为(7,4)汉明码最多只能纠错1位,所以能够正确译码的情况下每7位最多只能错1位。对输出的汉明码序列采取每14位就有1位取反的方法,也就是输出一个7位无错码的汉明码,然后输出一个7位有1位错码的汉明码,并且交替重复。来模拟信道误码。程序: 程序中通过第113行的eh_out0=h_outer;将正常编码得到的汉明码输出h_outer复制到eh_out中。通过第105行的if(ecnt_h=4d13)来判断计数,每14位输出就把最后1位取反,即eh_out0=h_outer;以此实现模拟信道误码。遇到的问题及仿真: 遇到的问题及仿真部分将在下面译码部分中一并叙述。4. 汉明译码程序编写。将m序列和汉明译码数据输出到测试孔观察和记录。加大误码率,观察译码性能。思路:译码:译码首先要计算校正子。根据校正子计算公式可写出3位校正子计算方程如下:s_fir2=eh_out6+eh_out5+eh_out4+eh_out2;s_fir1=eh_out5+eh_out4+eh_out3+eh_out1;s_fir0=eh_out6+eh_out5+eh_out3+eh_out0;若校正子为000,则没有错码,无需纠错,可根据译码方程直接译码。若校正子不为000,在1个7位汉明码只有1位错码的情况下,由校正子可以计算出错码位置,将该位译码结果取反,则得到正确的译码。结合译码公式写出译码方程如下:decode_out3=eh_out6+(s_fir2&(s_fir1)&s_fir0);/101decode_out2=eh_out5+(s_fir2&s_fir1&s_fir0);/111decode_out1=eh_out4+(s_fir2&s_fir1&(s_fir0);/110decode_out0=eh_out3+(s_fir2)&s_fir1&s_fir0);/011若在1个7位汉明码中错码位数多于1位,则不能得到正确的译码。输出:因为汉明码是56kHz时钟下的7位码,译码之后要转变为32kHz的4位码输出。所以要在56k时钟下触发译码,数7个译码一次。而输出时在32k时钟下4个输出一次。程序: 程序中127到126行为译码部分,147到156为转换输出部分。该段程序需要注意的问题是汉明码码流接收到了之后从什么时候开始译码。我是设置两个校正子的寄存器s_fir和s_sec来解决这个问题。接收到的7位汉明码计算的校正子存放在s_fir中,计算完成后,移动到s_sec中保存,将s_fir腾出用以存放下一个7位汉明码的校正子。则s_fir和s_sec中保存着连续的两个7位汉明码的校正子。如果收到的连续2个校正子中至少有1个校正子是000的无错码校正子,则认为以收到了符合译码条件的汉明码,可以开始译码,否则继续等待下面的码流。即程序中第135行if(s_fir&s_sec)!=3d0)所进行的判断。遇到的问题及解决方法: 本来觉得遇到最大的问题会是什么时候开始译码的问题,但在这个问题上考虑的比较充分,所以并没有真的碰到什么问题。反而是在输出部分遇到了问题。我一开始写的输出部分的程序如下:always (posedge clk_32k) begin decode_outer=decode_out13; decode_out13:1=decode_out12:0; if(decode_cnt=2d3) begin decode_out1=decode_out; decode_cnt=2d0; end else decode_cnt=decode_cnt+2d1; end逻辑上完全是仿照的M序列输出的方式,把decode_out的码流送进decode_out1中进行缓冲,decode_out1每数4位将最高位送到decode_outer进行输出。我觉得逻辑上是没有问题的,但是仿真得到的译码输出则不太好,有一小段和M序列相同,但也有很多和M序列不同。后来和老师一起反复检查之后终于发现,逻辑上的问题在于开始译码的时候已经数7位译码一次得到4位了,这里输出时又进行一次数4位输出1位,则相当于缓冲了两次才输出了一次,正常的输出顺序被打乱了,本来译码得到的4位变换为32k时钟就可以直接输出了。然后重新写了转换输出部分的程序如下:always (posedge clk_32k) begin decode_outer=decode_outdecode_cnt; if(decode_cnt=2d0) begin decode_cnt=2d3; end else decode_cnt=decode_cnt-2d1; end新程序中每位的decode_out都不用再经过decode_out1缓冲,而是直接从decode_outer中输出了。编码加错及译码输出仿真现象如下图: 由上图中可以看出,第4行(3)译码输出decode_outer的波形与第5行(4)M序列输出m_outer的波形是一样的,只不过译码输出有一定的延时。见下图: 标着相同红色数字的高电平是相互对应的,下面是M序列,上面是译码输出,明显可以看出两者波形完全相同,只是译码输出比输入的M序列延时了11个32k时钟周期。另外,第8行(14)7位汉明码输出h_out的前4位与倒数第5行(31)4位译码输出decode_out完全相同,只是后者比前者延迟了9个56k时钟周期(具体延时周期个数的得到在后面会展示)。见下图:由上图红框中可以明显看出汉明码前4位(即信息位)与译码输出的4位是完全相同的。而由下方的校正子可以看出,绿线上的000表示接受到的没有误码,010(非000)表示有误码,可以看到s_fir中000与010是交替出现的,这与程序中模拟信道误码时每14个输出的汉明码元取反一个是一致的,即7位无错汉明码与7位中有1位错的汉明码交替出现。另外上图中由绿线和蓝色箭头组成的关系可以看出校正子从s_fir移动到s_sec的过程。 另外,具体的延时周期的得到可以由下图看出:可见除了正常的时延外,译码输出即使在接收到校正子不为000(有1位误码)时,也能够自行纠错,输出正确的译码,与输入M序列完全相同,该程序编写和仿真都是成功的。 改变误码律的译码输出仿真:(1) 每15个错1位仿真程序改为:其实就是对第112行中原来是if(ecnt_h=4d13)中的4d13改为了4d14。仿真结果见下图:M序列m_outer与译码输出decode_outer的对应关系如下图: 相同的由下图红框的对应关系能够看出汉明码前4位信息位与译码完全相同: 上图中能够发现在第一个红框之前的汉明码是1011000,而译码是1010,是不正确的,是因为不是一开始就能接收到能够正确译码的码流,而且接受到正确码流后译码还有一定的延时,所以在此之前的输出是不正确的。另外,从校正子s_fir一行中可以看到,改为15位1个错码之后,不在是7的整数倍,所以不像之前错码只固定出现在a1位上,对照下表能够读出接收到的错码出现的位置,以用红字标明在上图中s_fir一行中。 可见,在误码率为1/15时,在找到起始点开始正确译码之后,对于误码出现在不同位置上的汉明编码,该程序都能正确译码。(2) 每13个错1位仿真程序改为: 即汉明码输出每13位取反1位仿真结果见下图:可以发现当误码率为1/13的时候,找到同步开始译码,正确译码了2个之后,下面的译码就出现了错码得不到纠正的情况。可是仔细看校正子s_fir和s_sec,并没有同时出现均不为000的情况,所以理论上应该是能够正常译码。一定是程序不够完善,导致误码率在1/13就不能正确输出了。我仔细观察仿真中每一位的逻辑关系,发现在误码律达到1/13的时候由于各寄存器之间有延时,导致纠错的时候有时对应输出位会发生变化。于是我在译码纠错之前增加了一个对接收汉明码进行缓冲的寄存器eh_out1,并以此作为基准译码,仿真得到了正确的输出!译码部分修改程序如下:always (posedge clk_56k) begin if(decodecnt_h=3d6) begin eh_out1=eh_out;/缓冲 s_fir2=eh_out6+eh_out5+eh_out4+eh_out2;/计算监督位 s_fir1=eh_out5+eh_out4+eh_out3+eh_out1; s_fir0=eh_out6+eh_out5+eh_out3+eh_out0; s_sec=s_fir; if(s_fir&s_sec)!=3d0)/连续两组监督位出错时保持此状态等待新信息计算 decodecnt_h=3d6; else decodecnt_h=3d0; decode_out3=eh_out16+(s_fir2&(s_fir1)&s_fir0);/101 decode_out2=eh_out15+(s_fir2&s_fir1&s_fir0);/111 decode_out1=eh_out14+(s_fir2&s_fir1&(s_fir0);/110 decode_out0=eh_out13+(s_fir2)&s_fir1&s_fir0);/011 end else decodecnt_h=decodecnt_h+3d1; end仿真结果见下图:修改了程序之后,在误码率为1/13的情况下,仿真如上图,在实现同步之后能够连续无误地纠错译码输出。对应的倒数第二行红字标出的为相应的错码出现的位置。注意到错码位置为a3、a4、a5情况下能够正确译码,这才是纠错能力的直接体现。因为a2、a1、a0位置上的错码,即使纠错失败,但是由于不是信息位,不会输出到译码输出,所以看不出来能否正确纠错。因为增加了一个缓冲寄存器,现在译码输出decode_out与收到的汉明码eh_out之间的延时变为大约9.5个32k时钟周期。 下载到实验箱观察并记录实验现象:(1)加错上图中,CH1黄色波形为56k时钟波形,CH2蓝色波形为eh_out即汉明码以1/13的错码率加错之后的输出波形。中读数为1010001,是加错在a1上的,即所对应正确的汉明码应为1010011。中读数为1100010因为误码率为1/13,所以紧接着 的中,是没有错码的,即1100010就是正确的汉明码输出。中读数1000001,加错在a2上,即所对应正确的汉明码为1000101。并且错码位置从a1移动到a2上,呈递增移动的关系,符合误码率1/13的情况。因为误码率为1/14时,每隔一个输出有误码,且误码位置不变,所以误码率为1/13时,每隔一个输出有误码,且误码位置呈增移动关系。 上图为仿真中汉明码输出的顺序,中为1010011,中为1000101,中为1000101,与示波器上看到的加错汉明码输出所对应的正确码组顺序完全一致。并且由仿真中前面红线上的读数为1010,而由上面加错的示波器波形上可读出前面读数也为1010,仿真中后面红线上读数为1111,由示波器波形上也可读出后面都是高电平,可见实验箱上的结果与仿真完全对应!(2)译码上图中CH1黄色波形为decode_outer译码输出,CH2蓝色波形为m_outer即M序列输出。CH1与CH2波形中标为相同数码的高电平相互对应(红线相连的也是相互对应),可见上方译码输出与下方M序列输出间除了有一定的延时外,波形完全对应,即成功译码。对应的可以从仿真中找到译码输出decode_outer波形完全相同的一段,见下图:因为两者时间轴比例不同,所以对上图进行横向压缩,得到下图:可见实验箱上实测结果与仿真结果完全相同。上图中实验箱与仿真对应部分(即与下方仿真对比那段)的译码波形读数为00111101011001而从上文中M序列编程部分已知M序列输出为000111101011001的循环,可见实验箱译码波形为M序列输出的一部分。3、 实验中遇到的问题1. 编程中遇到问题及解决方法在上文每段程序下方已有说明,在此不再赘述。2. 我使用的实验室的电脑的Quartus每次实验都弹出试用版的窗口,我每次实验都需要重复一遍破解工作。后来我发现,如果只是进行编程和仿真的话,用30天试用版好像也没有什么问题。但是下载到实验箱的时候会失败,必须使用破解版才能够成功下载。3. 通过USB线把程序下载到实验箱上的方法我完全用不起来,前置USB接口驱动电压较低,但是即使我用主机后端的USB接口也仍然连接了之后识别不到硬件。只能用数据线实现,而且数据线好像十分脆弱,不是每一根都能用,我是从老师那里拿了一大把,一根一根的试了好多条才试到一条能用的。4. 下载时要记得打开实验箱的电源,否则会失败。5. 实验箱上能够用于外接示波器的测量端口有限,一定要注意设置准确。6.附加实验同步位提取实验见下方。位同步提取实验(附加)一、实验要求及内容1 将PCM编译码时钟TP503(256KHz)做为码元速率为512Kbps的1010码流数据。2 用导线将TP503连接到TPM03作为FPGA的数据输入。(此步骤必须在往FPGA下载了程序之后才能操作!)3 用FPGA的输入时钟14.336MHz直接分频得到512KHz的时钟输出到TPM05。4 用示波器同时观察TPM03和TPM05,可见两者并不能同步。5 现要求从输入数据中提取位同步信息得到可以与输入数据同步的时钟信号。二、实验程序及记录与分析思路:由PCM编译码时钟可以得到一个256kHz信号。对14.336MHz时钟信号直接进行分频,14336/(256*2)=28,可以得到另一个256kHz信号。对时钟信号进行分频得到分频结果进行滞后或者超前的判断,即进行位同步提取,然后根据滞后或者超前的判断信号,对分频模块里的分频系数进行修正,再次将分频结果送至位同步提取模块里头进行判断,如此反复可以得到相对稳定的同步信号。程序:module tbw(in_pcm,clk_fpga,out_fpga,out_fpga_no);input in_pcm,clk_fpga;output reg out_fpga,out_fpga_no;reg 5:0count,count_tb;reg 5:0count_set;/计数初值reg 5:0count_no;initial begin count_set=6d55; endalways(posedge clk_fpga) /此处计数为递减计数 begin if(count=6d0) count=count_set; /计数到0时重新装入计数初值 else count=count-1b1;/递减计数 if(count27) /分频,计数到27翻转,即14336/(256*2)=28 out_fpga=1b1; else out_fpga=1b0; count_tb=count; /取出计数值,判断超前或者滞后 endalways(posedge in_pcm) /对计数初值进行更改 begin if(count_tb27) /超前 count_set27) /滞后 count_set=6d54; else /同步 count_set=6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论