16位海明解码电路设计(计算机数据表示实验)

首先了解实验大体的要求,该实验要求我们对22位海明编码进行解码成原来的16位,且判断是否出错,有一位错,两位错,还有无错。对于一位错,我们要进行纠正。

1.判断是否出错
设置有六位指错字,Gi(i=1,2,3,4,5,6),其中G5G4G3G2G1是进行判断是否数据出错,G6是总的奇偶校验位,可以用来检验数据是一位错,还是两位错。
已知有:
在这里插入图片描述
则可得Gi(i=1,2,3,4,5,6)

在这里插入图片描述
2.检错原理
当G5G4G3G2G1=0时,表示数据无传输错误,否则,表示出错。当发生一位数据错误时,G5G4G3G2G1所指示的数据,表示那位数据出错(例如G5G4G3G2G1=00101,则表示第5位数据出错)。若发生两位错时,G5G4G3G2G1仍不为0,由于只能纠正1位错误,故该海明编码是尽努力去纠正。
因此,增加一位总的奇偶校验位G6,进行判断是一位错,还是两位错。
①当G5G4G3G2G1=0,G6=0,表示数据无出错;
②G5G4G3G2G1 !=0,G6=1,表示发生一位数据出错;
③G5G4G3G2GG1=0,G6=1,表示该奇偶校验位出错,即发生一位出错;
④G5G4G3G2G1 !=0,G6=0,表示发生两位数据出错。

3.纠正数据
在纠正数据,得到原始16位数据这块设计上,可采用解码器对出错位进行输出,再与原来的数据进行异或,即可得纠正后的数据。
首先,我们来了解下解码器的功能。
在这里插入图片描述
左边箭头指向的为输入数据,是5位的二进制数据,第二个箭头是选择哪个输出为1,此时由于它连接了5位二进制数据,则该Decd解码器的输出端有2^5个输出端。此时数据为00000对应的十进制为0,则可从图中看出第0位输出是1,其他输出为0。

在这里插入图片描述
此时输入数据为00110对应十进制为6,则可从图中看出,第六位输出为1,其他输出为0。

因此如果输入数据为0的话,则第0位输出为1,否则第0位输出为0,因此我们可以将输入数据换成G5G4G3G2G1,用第0位输出判断G5G4G3G2G1是否为0(G5G4G3G2G1=0,则第0为输出为1),或者不为0(G5G4G3G2G1!=0,则第0位输出为0)。

纠正数据:将输入数据换成G5G4G3G2G1,将该解码器的第1位至23位用分离器连接起来,如上图的右边部分所示(此时,如果G5G4G3G2G1等于某个不为0的数据时,该数据将会输出为1)。将该22位数据与原来的海明码进行按位异或,则可得到原来无出错的数据,即进行纠正。
(提示:x异或0=x,x异或1=x的非)

4.电路图设计
由于一个电路图太大,就截两次图啦~
在这里插入图片描述
在这里插入图片描述
以下是完整的电路图,看不清楚的话,看上面两张的截图。在这里插入图片描述
这边说下,由于要获得纠正后的数据,即16位数据,由于该数据是从0开始的,故其检验位分别位于0,1,3,7,15,21上,因此要去掉这些位置的数据,即可得到原来的16位数据。因此采用分离器输出的时候,位宽仍然是22位,但是位0,位1,位3,位7,位15,位21,是无的。
在这里插入图片描述
5,进行测评
保存电路图,复制粘贴代码到EduCoder平台进行测试,即可通关。
在这里插入图片描述

### 16海明解码算法 #### 背景介绍 海明码是一种能够检测并纠正单比特错误的编码方式。其核心原理在于通过增加冗余校验,使得接收方可以定到具体的错误置并对该置上的比特值进行修正[^2]。 对于16的数据长度(假设原始数据为16),需要先计算所需的校验数量 \( r \),满足以下不等式: \[ 2^r - 1 \geq d + r \] 其中 \( d \) 是数据的数量,在本例中为16。经过简单推导可知,\( r = 6 \) 可以满足上述条件[^3]。因此,完整的海明码总长度为 \( d + r = 16 + 6 = 22 \) 。 --- #### 解码步骤解析 以下是针对16数据的海明解码过程的具体描述: 1. **提取校验和数据** 假设接收到的海明码序列为 `R`,它的结构如下所示: | 数据/校验 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | ... | |----------------|----|----|----|----|----|----|----|----|-----| | 序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... | 其中,P 表示校验,D 表示数据。按照规则,第 \( 2^i \)置上放置的是校验 (即 P1, P2, P3...),其余置则是数据[^4]。 2. **重新构建校验关系** 每个校验覆盖特定范围内的数据集合。具体来说: - 校验 \( P_1 \): 覆盖所有编号二进制表示中最低有效为1的置。 - 校验 \( P_2 \): 覆盖所有编号二进制表示中次低有效为1的置。 - 类似地定义其他校验的作用范围。 对于给定序列,可以通过异或运算验证这些校验是否一致。如果某一校验失败,则说明对应的子集存在错误。 3. **错误定与修复** 将各校验的结果组合成一个整数值 E,用来指示可能出错的置。例如,若三个校验分别对应十进制数 e1=1,e2=0,e3=1 则最终得出E=e1*4+e2*2+e3*1=9;意味着第九出现了差错需翻转之即可完成自动更正功能[^1]。 4. **恢复原始数据** 排除所有的校验之后剩下的就是最初的未加保护的信息串了。 --- #### 示例代码展示 下面是一个 Python 实现的例子,演示如何对接收的海明码执行解码操作: ```python def decode_hamming(code): n = len(code) # 初始化变量存储校验结果 error_position = 0 # 计算各个校验的状态 for i in range(1, int(n.bit_length()) + 1): parity_bit_index = 2**(i-1) - 1 if parity_bit_index >= n: break covered_bits = [ j for j in range(n) if ((j >> (i-1)) & 1) and not(j == parity_bit_index) ] parity_sum = sum([code[j] for j in covered_bits]) % 2 expected_parity = code[parity_bit_index] if parity_sum != expected_parity: error_position += 2**(i-1) # 如果有错误则修正 if error_position > 0 and error_position <= n: corrected_code = list(code) corrected_code[error_position - 1] ^= 1 code = tuple(corrected_code) # 提取实际数据部分 data_positions = [i for i in range(n) if not((i+1) & (-(i+1))) == (i+1)] decoded_data = ''.join(str(code[i]) for i in sorted(data_positions)) return decoded_data # 测试用例 received_code = '1101011010110101' # 输入接收到的海明码字符串形式 decoded_result = decode_hamming(tuple(int(bit) for bit in received_code)) print(f"Decoded Data: {decoded_result}") ``` --- #### 注意事项 以上程序假定了输入已经转换成了布尔元组的形式以便处理逻辑运算更加直观简洁一些。另外需要注意边界情况比如全零或者超出预设大小等情况下的行为表现可能会有所不同所以最好加入额外检查机制确保鲁棒性良好。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值