基于FPGA的Hamming编译码verilog开发实现,包括testbench测试程序

发布时间 2023-05-19 23:52:51作者: 我爱C编程

1.算法仿真效果

vivado2019.2仿真结果如下:

 

 

 

 

2.算法涉及理论知识概要

        汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。

 

       人们在汉明码出现之前使用过多种检查错误的编码方式,但是没有一个可以在和汉明码在相同空间消耗的情况下,得到相等的效果。

 

       1940年,汉明于贝尔实验室(Bell Labs)工作,运用贝尔模型VBell Model V)电脑,一个周期时间在几秒钟内的机电继电器机器。输入端是依靠打孔卡(Punched Card),这不免有些读取错误。在平日,特殊代码将发现错误并闪灯(flash lights),使得操作者能够纠正这个错误。在周末和下班期间,在没有操作者的情况下,机器只会简单地转移到下一个工作。汉明在周末工作,他对于不可靠的读卡机发生错误后,总是必须重新开始项目变得愈来愈沮丧。在接下来的几年中,他为了解决调试的问题,开发了功能日益强大的调试算法。在1950年,他发表了今日所称的汉明码。现在汉明码有着广泛的应用。

 

        在接收端通过纠错译码自动纠正传输中的差错来实现码纠错功能,称为前向纠错FEC。在数据链路中存在大量噪音时,FEC可以增加数据吞吐量。通过在传输码列中加入冗余位(也称纠错位)可以实现前向纠错。但这种方法比简单重传协议的成本要高。汉明码利用奇偶块机制降低了前向纠错的成本。

 

       如果一条信息中包含更多用于纠错的位,且通过妥善安排这些纠错位使得不同的出错位产生不同的错误结果,那么我们就可以找出出错位了。在一个7位的信息中,单个位出错有7种可能,因此3个错误控制位就足以确定是否出错及哪一位出错了。

      汉明码SECDEDsingle error correction, double error detection)版本另外加入一检测比特,可以侦测两个或以下同时发生的比特错误,并能够更正单一比特的错误。因此,当发送端与接收端的比特样式的汉明距离(Hamming distance)小于或等于1时(仅有1 bit发生错误),可实现可靠的通信。相对的,简单的奇偶检验码除了不能纠正错误之外,也只能侦测出奇数个的错误。

下列通用算法可以为任意位数字产生一个可以纠错一位的汉明码:

1.1开始给数字的数据位(从左向右)标上序号, 12345...

2.将这些数据位的位置序号转换为二进制,1, 10, 11, 100, 101,等。

3.数据位的位置序号中所有为二的幂次方的位(编号1248,等,即数据位位置序号的二进制表示中只有一个1)是校验位

4.所有其它位置的数据位(数据位位置序号的二进制表示中至少2个是1)是数据位

5.每一位的数据包含在特定的两个或两个以上的校验位中,这些校验位取决于这些数据位的位置数值的二进制表示

(1) 校验位1覆盖了所有数据位位置序号的二进制表示倒数第一位是1的数据:1(校验位自身,这里都是二进制,下同),111011111001,等

(2) 校验位2覆盖了所有数据位位置序号的二进制表示倒数第二位是1的数据:10(校验位自身),1111011110101011,等

(3) 校验位4覆盖了所有数据位位置序号的二进制表示倒数第三位是1的数据:100(校验位自身),1011101111100110111101111,等

(4) 校验位8覆盖了所有数据位位置序号的二进制表示倒数第四位是1的数据:1000(校验位自身),1001101010111100110111101111,等

(5) 简而言之,所有校验位覆盖了数据位置和该校验位位置的二进制与的值不为0的数。

 

 

 

 

3.verilog核心程序

 

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// Design Name: 
// Module Name: tops
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
module tops(
input[7:0]    encode_in,
output [11:0] encode_out,
output [7:0] decode_out
);
    
HammingEncoder HammingEncoderU(
.datain(encode_in), 
.dataout(encode_out)
);
 
HammingDecoder HammingDecoderU(
.datain(encode_out), 
.dataout(decode_out)
);
    
endmodule