通信原理实验报告汉明编译码系统自行设计实验附加同步(编辑修改稿)内容摘要:

mp。 s_fir[0])。 //111 decode_out[1]=eh_out[4]+(s_fir[2]amp。 s_fir[1]amp。 (~s_fir[0]))。 //110 decode_out[0]=eh_out[3]+((~s_fir[2])amp。 s_fir[1]amp。 s_fir[0])。 //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_firamp。 s_sec)!=3’d0)所进行的判断。 遇到的问题及解决方法: 本来觉得遇到最大的问题会是什么时候开始译码的问题,但在这个问题上考虑的比较充分,所以并没有真的碰到什么问题。 反而是在输出部分遇到了问题。 我一开始写的输出部分的程序如下: always @(posedge clk_32k) begin decode_outer=decode_out1[3]。 decode_out1[3:1]=decode_out1[2:0]。 if(decode_t==239。 d3) begin decode_out1=decode_out。 decode_t=239。 d0。 end else decode_t=decode_t+239。 d1。 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_out[decode_t]。 if(decode_t==239。 d0) begin decode_t=239。 d3。 end else decode_t=decode_t239。 d1。 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(et_h==4’d13)中的 4’d13 改为了 4’d14。 仿真结果见下图: M 序列 m_outer 与译码输出 decode_outer 的对应关系如下图: 相同的由下图红框的对应关系能够看出汉明码前 4 位信息位与译 码完全相同: 上图中能够发现在第一个红框之前的汉明码是 1011000,而译码是 1010,是不正确的,是因为 不是一开始就能接收到能够正确译码的码流,而且接受到正确码流后译码还有一定的延时 ,所以在此之前的输出是不正确的。 另外, 从校正子 s_fir 一行中可以看到,改为 15 位 1 个错码之后,不在是 7 的整数倍,所以不像之前错码只固定出现在。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。