通信应用实战:汉明码纠错典型程序设计Verilog代码设计
[复制链接]
内容:
- 理解检纠错原理与拆包;
- 设计编写检纠错与拆包的程序,恢复原始信息数据程序;
4.1检纠错
在通信过程种对信息惊醒信道编码,保证可靠性,其中检纠错是可靠性的主要的体现,检纠错包括2方面,一方面检查接收数据是否正确,两一方面也可以对错误数据按照一定的算法进行纠错,因此检纠错在通信系统种是非常有必要的。
4.1.1汉明码检纠错算法
汉明码是一种典型的信道编码,是分组码一种,它具有对每个码的检错能力(每接收到一个汉明码,可以判断该码是否正确),除此之外还具备1bit纠错能力。
假如定义S1,S2,S3
S1 = D6 ^ D5 ^ D4^D2 如果S1==0则说明D6 ,D5,D4,D2数据都是对的,否则说明,该组数据有错误,错误的数据个数不可控。
S2 = D6 ^ D5 ^ D3^D1 如果S2==0则说明D6 ,D5,D3,D1数据都是对的,否则说明,该组数据有错误,错误的数据个数不可控。
S3 = D6 ^ D4 ^ D3^D0 如果S3==0则说明D6 ,D4,D3,D0数据都是对的,否则说明,该组数据有错误,错误的数据个数不可控。
通过以上分析可以看出,当S1=0,S2=0,S3=0,说明汉明码全是对的。
- 如何纠错?
所有纠错都是限定在错误1bit的情况,如果错误2bit以及以上,汉明码是无能无力
习惯上,S1,S2,S3叫做矫正子,通过它可以对接收到的汉明码进行纠错。
4.1.2汉明纠错典型程序设计
4.1.2.1设计框图
设计框图
4.1.2.2 hmm_crt实现
- 恢复汉明码
代码设计程序
///////////////////////////////////////////////////////////////////////////////////////////////
always @(posedge clk_d )
if( (cnt ==5)&& (flag_seq_rec) )
D1<= seq_rec;
always @(posedge clk_d )
if( (cnt ==6)&& (flag_seq_rec) )
hmm<= {D6,D5,D4,D3 ,seq_rec ,D1,D0};C
/////////////////////////////////////////////////////////////////////////////////////////////
- 纠错输出
always @(posedge clk_d )
case( {S1,S2,S3})
3’b011 : data<={ hmm[6:4] ,~hmm [3]};
3’b101 : data<={ hmm[6:5] ,~hmm [4], hmm [3]};
3’b110 : data<={ hmm[6] ,~hmm [5], hmm [4:3]};
3’b111 : data<={ ~hmm[6] , hmm [5:3]};
default : data<=hmm[6:3];
endcase
reg flag_hmm;
always @(posedge clk_d or negedge rst_n)
if(~rst_n)flag_hmm <=0;
else if( (cnt ==6) && (flag_seq_rec) ) flag_hmm <=1;else flag_hmm <=0;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4.1.2.3unpack程序实现
unpack程序实现
|