计算机组成原理汉字编码与校验设计实验报告(汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码)_汉字国标码转区位码实验logisim_张2公子的博客-程序员秘密

技术标签: 硬件工程  计算机组成原理开卷!  大学冲!!!  嵌入式硬件  每日一个小进步  

实验一 汉字编码与校验设计实验

这次实验利用logisim进行设计,进行了以下这四个实验,其中分为汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码,实验报告分为四个部分,在这四个部分中依次对四个实验的方案设计,设计思路进行了介绍

1 汉字国标码转区位码实验

1.1设计要求

这个实验基于logisim软件进行设计,实验要求在对应电路中完成国标码转区位码的子电路设计,当汉字显示能够正确显示“华”,说明实验正确。

1.2方案设计

1.2.1 设计思路

国标码GB2312采用了94×94=8836的二维矩阵对字符中的所有汉字字符进行编码,,采用十进制表示,所有字符都在矩阵中有唯一位置,这个位置可以用区号和位号组合表示,称为汉字的区位码,他们可以互相转换:区位码+A0A0H=GB2312,所以区位码=GB2312-A0A0H,由此可以得出设计思路,实验要求用加法器实现,并且输出区号和位号,因此对于输入端的另一个输入应该为A0A0H变补后的字节。

1.2.2 设计原理

通过上面的设计思路,我们可以完成下面电路的设计,输入端的另一个输入为A0A0H变补后的字节,可以直接用DEF0来作为A0A0H通过求补器送到输入端的字节,因为A0A0变补后是5F60H,两个字节最高位都+1,就是DFE0。但最高位在取区位码的时候没有使用(区号和位号最高位永远是0)区号位号最大都是94,7位二进制编码即可,最高位无用,因此效果一样。并且直接填def0的话,实验设计较将A0A0H求补相比,更为简单

1.2.3 实验图片

使用上面的设计思路与设计原理来进行电路的连接,这题连接其实较为简单
在这里插入图片描述

图1.1 2020051041 初始图片
在这里插入图片描述

图 1.2 2020051041 总体结构图

1.3实验步骤

  1. 实验文件data.circ与GB2312ROM.circ需要先放在同一个目录下,因为实验中调用了B2312ROM.circ的电路,不放在一起的话,会出现测评错误:系统提示找不到GB2312ROM.CIRC
  2. 将实验初始的元器件进行正确的连接,位号与区号,连接在输出端,GB2312连接在输入端
  3. 在输入端连接一个常量def0,常量不能输入十六进制数,因为常量默认输入十进制,所以需要增加0x开头
    在这里插入图片描述

图1.3 2020051041 常量改后的值

1.4故障与调试

1.4.1接口位宽不匹配

故障现象:数据位宽不匹配

在这里插入图片描述

图 1.4 错误处截图
原因分析:,开始直接在输入端连的常量,数据位宽为1,和接口数据不匹配,需要进行修改
解决方案:将此常量的数据位宽改为16,并且值改为0xdef

1.5 测评结果

在这里插入图片描述

图1.5 代码与电路在头歌平台进行测评,结果正确

2 汉字机内码获取实验

2.1设计要求

使用logisim软件,在电路中的ROM存储器中存入题目所给的指定句子,该电路中计数器用于自动生成存放汉字 GB2312 编码的 ROM 组件的地址序列,启用时钟自动仿真后,右侧的 LED 矩阵区域会依次显示ROM中的事先预存的汉字内容

2.2方案设计

2.2.1 设计思路

这题的要求是,将“12345ABCDEFGabcdefg轻轻的我走了,正如我轻轻的来;我轻轻的招手,作别西天的云彩。那河畔的金柳,是夕阳中的新娘;波光里的艳影,在我的心头荡漾”的汉字转为机内码,这一块可以用网上在线的工具进行转码,然后对只读存储器进行编辑,其他部分都不需要进行改动,实验还是较为简单的

2.2.2 设计原理

有时汉字信息如果不进行特别标识,会与单字节的ASCII码混淆,因此解决方法之一是将一个汉字会被看成两个括展的ASCII码,使表示GB2312汉字的两个字节最高位都为1,这种高位为1的双字节汉字编码即为机内码。因此其实GB2312的汉字可以直接被机内码表示,使得这题的实验其实最重要的就在于汉字转为机内码的那一步,而并且有一关键点为每一个时钟,要正确实现一个汉字,原理还包括将数据存入ROM存储器中

2.2.3 实验图片

在这里插入图片描述

图2.1 2020051041 初始图片
在这里插入图片描述

图2.2 2020051041 转码
在这里插入图片描述

图2.3 2020051041 存储位置

在这里插入图片描述

图2.4 2020051041 在存储器中存储的机内码
在这里插入图片描述

图2.5 2020051041 成功运行

2.3实验步骤

1)先确认上一个实验正确完成,因为两个实验环环相扣,汉字机内码获取实验,是基于汉字国标码转区位码的实验进行的
2)将题目要求转换的字码复制,通过在线编译软件进行转码
3)复制第二步所获得阶码,将其粘贴到可读存储器中,并进行保存
4)保存成功后,点击时钟按钮进行测评

2.4故障与调试

2.4.1 结果输出不正确

故障现象:在对可读存储器中进行数据编辑后,点击时间按钮进行仿真,右侧LED矩阵无法正确显示实验结果
在这里插入图片描述

图2.6 2020051041 右侧LED矩阵没有正确输出

原因分析:再次检查本次实验页面,发现并没有问题出现,由此可得,问题可能出现在之前的实验当中,后面发现的确是第一个实验当中,存在问题,使得基于第一个实验的本次实验无法正常运行
解决方案:将第一题问题解决(问题为:接口数据不匹配),改正完之后,实验正确

2.4.2 数据结果输出太快

故障现象:不需要点击时钟信号,LED矩阵自己会跳动,输出正确结果,但输出频率太快
在这里插入图片描述

图2.7 2020051041 调为时间连续后,矩阵变化太快
在这里插入图片描述

图2.8 2020051041 如何调节时间频率大小

原因分析:当时自己调节电路仿真模块为时钟连续,可能频率调节过于大,使得输出速度过快
解决方案:其实采用电路自动仿真,将时钟调为连续的话,的确会比较方便,因为这样就不需要自己点击时钟信号了,可以直接看到LED矩阵的变化,但是需要将时间频率调好

2.5 测评结果

在进行改进后,系统能够正常运行,并且LED矩阵自动改变不会过于快,速度适中。
在这里插入图片描述

图2.9 2020051041 正常运行
在这里插入图片描述

图2.10 2020051041 头歌测评通过

3 海明编码电路设计

3.1设计要求

要求掌握海明编码的原理与设计,了解如何其编码的原理,以及如何进行分组,还需要认识到校验位的逻辑思路,完成最终电路的设计与运行

3.2方案设计

3.2.1 设计思路

首先先要了解到实验的原理,了解其是如何分组的,设计出22位的海明编码(16位原始数据+5位海明检验位+1位总的奇偶校验位),然后对题目所给出的海明码进行分组,之后对于分组完成的电路进行连接,连接完成后便可以进行运行

3.2.2 设计原理

1) 编码原理

实验要求设计出22位的海明编码(16位原始数据+5位海明检验位+1位总的奇偶校验位),但其只给出了16位的原始数据,因此只需要设计出五位海明校验位的电路与总奇偶校验位的电路,便可以实现编码这个过程

2) 分组原理

那么五位海明校验码是如何实现的呢,首先就要了解如何计算五位海明校验位
K+n<=2t-1,此时k=16,r=5(有五位校验位),因此总的数据位数有16+5+1=22位。设此时校验位为Pi(i=1,2,3,4,5),分别位于22位数据的第2(i-1)的位置上,故分别位于第1,2,4,8,16位上。
而对于这个校验码分完后的答案是什么呢
B1:P1,P2(3=1+2)
B2:P1,P3(5=1+4)
B3:P2,P3
B4:P1,P2,P4
B5:P1,P4
B6:P2,P4
B7:P1,P2,P4
B8:P3,P4
B9:P1,P3,P4
B10:P2,P3,P4
B11:P1,P2,P3,P4
B12:P1,P5
B13:P2,P5
B14:P1,P2,P5
B15:P3,P5
B16:P1,P3,P5
在这里插入图片描述

图3.1 2020051041 自己做的记录
在这里插入图片描述

图3.2 2020051041 全22位海明码

3) 校验位逻辑与电路设计

在这里插入图片描述

图3.3 2020051041 分组后结果

3.2.3 实验图片

在这里插入图片描述

图3.4 2020051041 实验引脚设计

在这里插入图片描述

图3.4 2020051041 实验画图

3.3实验步骤

1)先对16位原始数据进行分组,设置五位的海明校验位和1位总的奇偶校验位,之后进行集合
2)对其进行分组集合后的P1-P5进行连接,然后再对所有的数据进行连接,获得总奇偶校验码
3)连接完成后,运行电路

3.4故障与调试

3.4.1 结果输出不正确

故障现象:输出极其奇怪,就不只什么0,1;还有E这种输出

在这里插入图片描述

图3.5 2020051041 输出结果

原因分析:再次检查本次实验页面,发现并没有问题出现,再和老师交流之后,发现可能是输出引脚在编辑时,一不小心改装了引脚,使得结果输出变得奇怪,此错误和电路连接设计那一块没有相关问题
解决方案:全部重装一次,等于重做,之后答案输出正确

3.5 测评结果

改正问题后,实验输出正确,并且能够在头歌网上正确运行

在这里插入图片描述

图3.5 2020051041 头歌评测结果

4 海明解码电路设计

4.1设计要求

实验要求我们对22位海明编码进行解码成原来的16位,且判断是否出错,有一位错,两位错,还有无错。对于发生错误的地方,我们需要对其要进行纠正。使得最后输出结果正确

4.2方案设计

4.2.1 设计思路

对于此题,我们需要先了解海明码的解码原理,例如检错码是如何设计并且进行分组的,而检错码又有什么作用,错误逻辑和纠错原理是什么,我们在了解到上面的原理之后,还需要运用上述原理,然后对于电路进行设计,使得可以完成题目要求的内容,通过头歌网的测试

4.2.2 设计原理

  1. 检错码原理与作用
    检错码:一种编码。指在传输过程中发生错误后,在接收端能自动检查并发现错误的编码。
    海明码的检错、纠错基本思想是将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,并从中得出具体的出错位置,最后通过对错误位取反(也是原来是1就变成0,原来是0就变成1)来将其纠正。
    要采用海明码纠错,需要按以下步骤来进行:
    计算校验位数,确定校验码位置,确定校验码,实现校验和纠错
    而对于这道题来说,我们在上一个实验,也就是编码实验中已经标注好了数据位与检错位,因此只需要分组就ok
    在这里插入图片描述

图4.1 2020051041 分组成果

  1. 错误逻辑原理与设计
    根据刚检错码的设计原理,当G1G2G3G4G5=0,G6=0时,表示数据没有出错
    当G5G4G3G2G1!=0,G6=1时,表示发生一位数据出错
    当G5G4G3G2G1=0,G6=1,表示该奇偶校验位出错,即发生一位出错
    当G5G4G3G2G1!=0,G6=0,表示发生两位数据出错

4.2.3 实验图片

在这里插入图片描述

图4.2 2020051041 题目要求输出输入引脚
在这里插入图片描述

图4.3 2020051041 题目要求提示

在这里插入图片描述

图4.4 2020051041 电路连接
在这里插入图片描述

图4.5 2020051041 电路连接

4.3实验步骤

1)根据上一个实验的基础,将G21G2G3G4G5G6进行分组,检查分组正确后,对其电路进行连接
2)连接完成后,进行测评,不只是分组电路需要连接,其实更为重要的是检错电路
3)检查完成后,用头歌网进行测评

4.4故障与调试

4.4.1 结果输出不正确

故障现象:输出结构及其奇怪,类似于上题的错误
原因分析:再次检查本次实验页面,发现并没有问题出现,再和老师交流之后,发现可能是输出引脚在编辑时,一不小心改装了引脚,使得结果输出变得奇怪,此错误和电路连接设计那一块没有相关问题,错误原因也和上题一样
解决方案:全部重装一次,等于重做,之后答案输出正确

4.4.1 位宽不匹配

故障现象: 位宽不匹配,无法正常运行
在这里插入图片描述

图4.5 2020051041 错误图片

原因分析:位宽可能设定错误,重新再设一遍
解决方案:将连线出数据位改完后,答案正确
4.5 测评结果
改正问题后,实验输出正确,并且能够在头歌网上正确运行

在这里插入图片描述

图4.6 2020051041 头歌测评结果

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhang2gongzi/article/details/124491022

智能推荐

开通这个博客,记录一些学习笔记!!开始学习点javascript_布衣沙加的博客-程序员秘密

2013-10-15  开通程序员秘密,,学习下 javascript   学习这个,主要是用来,进行网页全自动脚本操作。。。。。以前编写ME脚本,,

auto_ptr实现_夜行歌的博客-程序员秘密

//参考《More Effective C++》#include using namespace std;templateclass autoptr{ private: T* r; public: autoptr(T* a=nullptr):r(a){} //不能使用默认拷贝构造函数 autoptr(autopt

IDEA 报java.lang.classNotFoundException: com.mysql.jdbc.Driver异常_幻梦虚拟的博客-程序员秘密

java.lang.classNotFoundException: com.mysql.jdbc.Driver1、项目结构(Structure)–&gt;problom–&gt;fix2、项目结构(Structure)–&gt;Artfacts–&gt;修改Web Application Explored–&gt;左侧删除全部–&gt;右侧Put into Output Root3、项目结构(Structure)–&gt;Artfacts–&gt;删除Web Application Explore

leetcode 977. 有序数组的平方(双指针)_Gogo-2020的博客-程序员秘密

给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例 1:输入:[-4,-1,0,3,10]输出:[0,1,9,16,100]示例 2:输入:[-7,-3,2,3,11]输出:[4,9,9,49,121]代码class Solution { public int[] sortedSquares(int[] A) { int n=A.length,l=0,r=n-1;//指向头尾 int[] res=ne

Unity & SteamVR Plugin安装中OpenVR缺失以及路径问题_unity openvr_映月潜的博客-程序员秘密

项目下来突然要搞个眼睛,没想到Unity不知道从哪个版本起就默认不支持VR了,一个OPenVR 的问题,折腾了一下午,记录一下,给需要的人。unity version: 2018.2.3F1SteamVR Plugin: 2.6.1 (当前最新版)有人说用steam老版就好了,可是我没老版,只能自己抹黑试着解决。首先去unity asset store 上搜steamVR这个插件安装。装好之后,console就会报错。这其实是一个问题,就是找不到unity.XR.OpenVR这货了。具体解决

BZOJ[4399]魔法少女LJJ 线段树合并_Duan2baka的博客-程序员秘密

题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=4399c<=7!!c<=7!!c<=7!!每新建一个节点,就开一个权值线段树,在连接时将两个线段树合并即可,对于操作3,4,直接查找比k大/小的数有多少个,查找时顺便将范围内的点删除,再全放在k上即可 操作五像平衡树那样随便搞一搞就可以了.. 对于操作六,根据对数的运算性质log(a∗b)=

随便推点

i2c sub system __i2c_board_list/klist_devices/klist_drivers 相互关系_angle_birds的博客-程序员秘密

kernel/drivers/i2c/i2c-boardinfo.cstruct i2c_client 中的name/addr/irq 等信息是从 struct i2c_board_info得来的,关于如何得到见下文。所有的i2c_board_info 都要添加到全局链表 __i2c_board_list 中,而且应该在硬件i2c控制器模块加载前添加,以便控制器模块加载时生成 i2c_cl

Linux vim编辑器练习小游戏PacVim_流氓的世界的博客-程序员秘密

新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;全新的 KaTeX数学公式 语法;增加了支持甘特图的mermaid语法1 功能;增加了 多屏幕编辑 Markdown文章功能;增加了 焦点写作

一次***+社工利用的过程_weixin_34381687的博客-程序员秘密

一次***+社工利用的过程上帝之爱 S.S.F(团队原创)    很多朋友玩社工都很厉害,社工是***中的一种特殊应用,***+社工的***模式如果利用的好,可以所向披靡,本次的安全检测就是一次简单的尝试。话说某日我在网上胡乱搜索的时候,突然看见有一个php的连接,就忍俊不住的进去看了看,一看不要紧,事情就随之而来了,于是就有了此文!(一)安全检测1.操刀上阵——我的“三板斧”当我看到了链接地址[...

hdu 1159 LCS最大公共子序列_HZXPH的博客-程序员秘密

有点那个了…………本来呢保存两行容易写很多,钻牛尖了,不过其实写完之后觉得都很简单,也就这样罢了就是记录下每一次比较有可能被覆盖的两个点[i-1][j-1] 与 [i-1][j]就可以了由递推式:       dp[i][j] = dp[i-1

二叉树的遍历和线索二叉树 p126 3-18_设一棵二叉树的结点结构为_云淡风轻__的博客-程序员秘密

3.编写后序遍历二叉树非递归算法后序非递归遍历二叉树的顺序是先访问左子树,再访问右子树,最后访问根节点,当用堆栈来存储节点时必须分清返回根节点时是从左子树返回的还是从右子树返回的。所以使用辅助指针r,其指向最近访问过的结点。也可在节点中增加一个标志域,记录是否已经被访问过。void PostOrder(BiTree T){ InitStack(S); Bnode *p=T,*r=NULL; while(p||!IsEmpty){ if(p){ push(S,p); p=p

编译android ICS错误解决办法_黑豆黑豆的博客-程序员秘密

环境:Ubuntu 12.04.2 LTS编译:ICS./mk-ics.sh 4make hisdk#########################make: *** [out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/noproguard.classes-with-local.dex]

推荐文章

热门文章

相关标签