通信报告 汉明编译码.docx
- 文档编号:24067453
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:16
- 大小:294.79KB
通信报告 汉明编译码.docx
《通信报告 汉明编译码.docx》由会员分享,可在线阅读,更多相关《通信报告 汉明编译码.docx(16页珍藏版)》请在冰豆网上搜索。
通信报告汉明编译码
汉明编译码实验
一、实验目的
1、通过实验,进一步了解差错控制的概念;
2、通过纠错编解码实验,加深对纠错编解码理论的理解;
3、加深对hanming码的产生、加错、纠错、译码的过程。
二、实验仪器
1、JH5001通信原理综合实验系统一台
2、20MHz双踪示波器一台
3、JH9001型误码测试仪(或GZ9001型)一台
三、实验原理
差错控制编码的基本作法是:
在发送端被传输的信息序列上附加一些监督码元,这些多余的码元与信息之间以某种确定的规则建立校验关系。
接收端按照既定的规则检验信息码元与监督码元之间的关系,一旦传输过程中发生差错,则信息码元与监督码元之间的校验关系将受到破坏,从而可以发现错误,乃至纠正错误。
通信原理综合实验系统中的纠错码系统采用汉明码(7,4)。
所谓汉明码是能纠正单个错误的线性分组码。
它有以下特点:
码长n=2m-1最小码距d=3
信息码位k=2n-m-1纠错能力t=1
监督码位r=n-k
这里m位≥2的正整数,给定m后,既可构造出具体的汉明码(n,k)。
用a6、a5、a4、a3代表4个信息元,a2、a1、a0三个监督码元可表示为:
a2=a6+a5+a4
a1=a6+a5+a3
a0=a6+a4+a3
汉明译码的方法,可以采用计算校正子,然后确定错误图样并加以纠正的方法。
校正子可表示为:
s1=a6+a5+a4+a2;
s2=a6+a5+a3+a1
s3=a6+a4+a3+a0
S的值与错码位置对应关系为:
S
错码位置
S
错码位置
001
a0
101
a4
010
a1
110
a5
100
a2
111
a6
011
a3
000
无错
表一
图9.1和图9.2给出汉明编码器和译码器电原理图。
表9.1(7,4)汉明编码输入数据与监督码元生成表
4位信息位
a6,a5,a4,a3
3位监督码元
a2,a1,a0
4位信息位
a6,a5,a4,a3
3位监督码元
a2,a1,a0
0000
000
1000
101
0001
011
1001
110
0010
110
1010
011
0011
101
1011
000
0100
111
1100
010
0101
100
1101
001
0110
001
1110
100
0111
010
1111
111
表9.1为(7,4)汉明编码输入数据与监督码元生成表。
编码输出数据最先输出是a6bit,其次是a5、a4……,最后输出a0位。
四、程序设计
1、设计分析
首先根据实验要求绘制出框图。
如下:
56kHz时钟
图1时钟产生框图
实验的输入时钟为14.336MHz,编码输入的码元速率为32kbps,生成的4位m序列码元信息,再经编码器后变成7位汉明码发送,码元速率为32*7/4=56kbps。
故需要将14.336MHz时钟进行448和256分别分频得到32kHz和56KHz时钟。
输
出
32kHz32kHz56kHz56kHz32kHz
图2汉明编译码过程框图
2、程序清单
声明部分
modulett(clk,m_out,h_out,im_out);
inputclk;
outputregm_out;
outputregh_out;
outputregim_out;
regm_clk;
regh_clk;
reg[3:
0]m_reg;
reg[6:
0]h_reg;
reg[6:
0]h_reg2;
reg[3:
0]m;
reg[7:
0]cnt1;
reg[7:
0]cnt2;
reg[1:
0]m_cnt;
reg[2:
0]h_cnt;
reg[1:
0]im_cnt;
reg[2:
0]ih_cnt;
reg[6:
0]ih_reg;
reg[3:
0]im_reg;
reg[3:
0]im_reg2;
reg[2:
0]s1;
reg[2:
0]s2;
reg[7:
0]e_cnt;
(1)、时钟产生模块
//224分频,32kHz时钟
always@(posedgeclk)
begin
if(cnt1==8'd223)
begin
m_clk<=~m_clk;
cnt1<=8'd0;
end
else
cnt1<=cnt1+8'd1;
end
//128分频,56kHz时钟
always@(posedgeclk)
begin
if(cnt2==8'd127)
begin
h_clk<=~h_clk;
cnt2<=8'd0;
end
else
cnt2<=cnt2+8'd1;
end
分析:
本模块将原本的14.336MHz时钟,分别经过224和128分频产生32kHz时钟和56kHz时钟。
通过对时钟上升沿的计数来将寄存器值翻转实现分频。
(2)、m序列产生模块
always@(posedgem_clk)
begin
if(m==4'b0000)
m=4'b1111;
else
begin
m[0]<=m[0]^m[3];
m[1]<=m[0];
m[2]<=m[1];
m[3]<=m[2];
m_out<=m[3];
end
end
分析:
如图三所示是用四位移位寄存器来产生m序列,其中最高位a3由上周期最高位与最末位异或求得,M序列输出取最末位a0。
图三四位移位寄存器
根据移位寄存器的值如下:
取末尾为m序列,则输出的m序列为000111101011001…循环。
(3)、汉明编码模块
//汉明编码
always@(posedgem_clk)
begin
m_reg[3:
1]<=m_reg[2:
0];
m_reg[0]<=m_out;
if(m_cnt==2'd2)
begin
h_reg[6:
3]<=m_reg[3:
0];
h_reg[2]<=m_reg[3]^m_reg[2]^m_reg[1];
h_reg[1]<=m_reg[3]^m_reg[2]^m_reg[0];
h_reg[0]<=m_reg[3]^m_reg[1]^m_reg[0];
m_cnt<=2'd3;
end
else
m_cnt<=m_cnt+2'd1;
end
//编码后输出
always@(posedgeh_clk)
begin
h_out<=h_reg2[6];
h_reg2[6:
1]<=h_reg2[5:
0];
if(h_cnt==3'd6)
begin
h_reg2<=h_reg;
h_cnt<=3'd0;
end
else
h_cnt<=h_cnt+3'd1;
end
分析:
在hanming编码的过程中用到了许多寄存器,由于输入和输出采用不同的时钟,所以需要用固定的寄存器进行中间存储和编码转换。
h_out
图四编码及输出过程中寄存器转换
将m序列串行输出先放入m_reg四位并行寄存器,变成并行状态,当m_reg四位装满时,移入h_reg七位并行状态并且进行编码,七位编码完成后再移入h_reg2寄存器,用56kHz时钟串行输出,每次都输出最高位,形成hanming序列。
如下是hanming编码表:
4位信息位
a6,a5,a4,a3
3位监督码元
a2,a1,a0
4位信息位
a6,a5,a4,a3
3位监督码元
a2,a1,a0
0000
000
1000
101
0001
011
1001
110
0010
110
1010
011
0011
101
1011
000
0100
111
1100
010
0101
100
1101
001
0110
001
1110
100
(7,4)汉明编码输入数据与监督码元生成表
0111
010
1111
111
(4)、人工加错模块
always@(posedgeh_clk)
begin
ih_reg[6:
1]<=ih_reg[5:
0];
if(e_cnt==8'd13)
begin
e_cnt<=8'd0;
ih_reg[0]<=~h_out;
end
else
begin
e_cnt<=e_cnt+8'd1;
ih_reg[0]<=h_out;
end
end
分析:
本模块其实很简单,就是在原本正确的hanming序列上,将其中一位取反,就形成了错误的序列。
“if(e_cnt==8'd13)”改变这个数值可以改变加错密度。
实际实验时我们会发现,如果加错太频繁就会出现译码错误的现象,因此实验时必须选择一个合适的数值。
(5)、译码及输出模块
//确定一个码组的首位
always@(posedgeh_clk)
begin
if(ih_cnt==3'd6)
begin
if((s1&s2)!
=3'd0)
ih_cnt<=3'd6;
else
ih_cnt<=3'd0;
end
else
ih_cnt<=ih_cnt+3'd1;
end
//hanming译码过程
always@(posedgeh_clk)
begin
if(ih_cnt==3'd6)
begin
s1[2]<=ih_reg[6]^ih_reg[5]^ih_reg[4]^ih_reg[2];
s1[1]<=ih_reg[6]^ih_reg[5]^ih_reg[3]^ih_reg[1];
s1[0]<=ih_reg[6]^ih_reg[4]^ih_reg[3]^ih_reg[0];
s2<=s1;
im_reg[3]<=ih_reg[6]^((ih_reg[6]^ih_reg[5]^ih_reg[4]^ih_reg[2])&(ih_reg[6]^ih_reg[5]^ih_reg[3]^ih_reg[1])&(ih_reg[6]^ih_reg[4]^ih_reg[3]^ih_reg[0]));
im_reg[2]<=ih_reg[5]^((ih_reg[6]^ih_reg[5]^ih_reg[4]^ih_reg[2])&(ih_reg[6]^ih_reg[5]^ih_reg[3]^ih_reg[1])&(~(ih_reg[6]^ih_reg[4]^ih_reg[3]^ih_reg[0])));
im_reg[1]<=ih_reg[4]^((ih_reg[6]^ih_reg[5]^ih_reg[4]^ih_reg[2])&(~(ih_reg[6]^ih_reg[5]^ih_reg[3]^ih_reg[1]))&(ih_reg[6]^ih_reg[4]^ih_reg[3]^ih_reg[0]));
im_reg[0]<=ih_reg[3]^((~(ih_reg[6]^ih_reg[5]^ih_reg[4]^ih_reg[2]))&(ih_reg[6]^ih_reg[5]^ih_reg[3]^ih_reg[1])&(ih_reg[6]^ih_reg[4]^ih_reg[3]^ih_reg[0]));
end
end
//译码输出
always@(posedgem_clk)
begin
im_out<=im_reg2[3];
im_reg2[3:
1]<=im_reg2[2:
0];
if(im_cnt==2'd3)
begin
im_reg2<=im_reg;
im_cnt<=2'd0;
end
else
im_cnt<=im_cnt+2'd1;
end
endmodule
分析:
首先明确监督位和信息位之间的对应关系
S2
S1
S0
有错的码位
1
1
1
a6
1
1
0
a5
1
0
1
a4
0
1
1
a3
因此只要找到了一组七位的码组,要进行监督位的计算和m序列的还原译码就较为简单了,只要根据上面的对应关系式和表格进行编程即可。
但是,本模块的难点就在于在不断输出的hanming码序列中找到模块3中编码好的对应的七位码组。
我采用的方法是每当一个h_clk时判断一次s1和s2的值,if((s1&s2)!
=3'd0),如果s1和s2当中至少有一个是0,说明没有错码,或者说我们找到了对应的码组。
而且,s1是s2的前一次的值,这样就保证这是连续的两组,很方便。
s2
s1
最大误码率分析:
根据程序设计,若每2个周期中只有1个错码,达到同步之前S1、S2存在全1几率,故判断为失步,起始接收位置右移,最终达到同步;同步以后,S1、S2一个为0,另一个为1,故同步位置将保持不变,并能够实现纠错。
若每2个周期中可能存在2个错码,假设已经达到同步,由于S1、S2依然存在几率为全1,会导致误判为失步,从而不能维持同步,不能实现纠错。
综上分析,最大误码率是2个周期(14个码元)只能出现1个误码,最大误码率为1/14。
程序中加错模块的ih_cnt=13就是因此而来。
五、现象记录与分析
软件实现:
以下两幅图分别是(图a)m序列仿真和(图b)编译码整体仿真图
图am序列仿真图
图b编码译码整体仿真图
图a是m序列的仿真图,易读出是000111101011001…循环,与理论分析相同。
3.图b中的标识分别是,m序列输出m_out,hanming码的输出h_out,译码序列输出im_out。
重点关注m_out和im_out,可以看到,最初阶段二者并不相同,大致到900us左右二者开始同步了。
之所以会出现码元损失,是因为在译码之前先要寻找到完整的码组的首位,如果一开始没找对位置,很容易丢到因此丢掉一些码元。
硬件实现:
选择芯片:
CycloneII系列的EP2C8Q208;
引脚设置:
由于14.336MHz时钟信号由23号管脚接入,故Clk设为23号管脚,m序列输出m_out设为197号管脚,hanming码的输出h_out设为176号管脚,译码输出序列im_out设为193号管脚。
运行结果如下图:
图chanming码输出序列
图c中黄色的是m序列,蓝色的是hanming码。
从图中可以明显看出hanming码的时钟比m序列的快一些。
由于前后存在时延,上下波形并不对应。
图d译码输出序列
图d中黄色的是m序列,蓝色的是hanming码译码后输出的序列。
从图中不仅仅可以得出二者时钟同步的讯息,还能观察出二者几乎是完全同步的。
可见程序进行了很好的自动的检错和纠错,输出的序列与原始序列值相同。
六、思考与感悟
本次实验让我熟悉了hanming码的产生、加错、纠错、译码的过程,并且进
一步了解差错控制的概念,通过纠错编解码实验,加深对纠错编解码理论的理解。
在实验中有一些碰壁的地方,将其收集如下,以便在下次实验时避免。
(1)、仿真clk必须是10ns以上,调到1ns可能会出现1000warning甚至更多。
(2)、在不同的always模块里,即在不同的时序下,不能让同一个寄存器被重复赋值。
(3)、移位输出首位时有几种写法是不对的。
如:
m_reg[0]<=m_out;
m_reg<=m_reg<<1;
这种写法容易出现stuckwiththevalueVCCorGND的状况。
如果反过来写,如:
m_reg<=m_reg<<1;
m_reg[0]<=m_out;
这样写虽然仿真没有问题,但事实上没有解决根本问题。
对于always模块来讲,语句是同时执行的,m_reg<=m_reg<<1时,末位m_reg[0]会补0,而m_reg[0]<=m_out又同时将m_out的值赋给m_reg[0]。
所以,存在着队同一个值同时赋值的问题。
这样才是正确的写法:
m_reg[3:
1]<=m_reg[2:
0];
m_reg[0]<=m_out;
以上大致是对本次实验的总结和整理。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通信报告 汉明编译码 通信 报告 汉明编 译码