云南大学实验六运算器实验指导书剖析
实验报告_运算器实验

实验报告_运算器实验一、实验目的本次运算器实验的主要目的是深入了解运算器的工作原理和功能,通过实际操作和观察,掌握其基本运算逻辑和数据处理过程,培养对计算机硬件系统的理解和实践能力。
二、实验设备本次实验所使用的设备包括计算机一台、相关的实验软件以及连接线路等。
三、实验原理运算器是计算机的核心部件之一,它负责执行各种算术和逻辑运算。
其基本组成包括算术逻辑单元(ALU)、寄存器、数据总线等。
算术逻辑单元(ALU)是运算器的核心,能够进行加法、减法、乘法、除法等算术运算,以及与、或、非等逻辑运算。
寄存器用于暂时存储参与运算的数据和运算结果。
数据总线则用于在各个部件之间传输数据。
在运算过程中,数据从寄存器通过数据总线传输到ALU 进行运算,运算结果再通过数据总线存储回寄存器或传输到其他部件。
四、实验内容与步骤(一)实验内容1、进行简单的算术运算,如加法、减法、乘法和除法。
2、执行逻辑运算,包括与、或、非操作。
3、观察运算结果在寄存器和数据总线上的传输和存储过程。
(二)实验步骤1、打开实验软件,连接好实验设备。
2、选择要进行的运算类型,如加法运算。
3、在相应的输入框中输入两个操作数。
4、点击“计算”按钮,观察运算结果在寄存器中的显示。
5、重复上述步骤,进行其他类型的运算。
五、实验结果与分析(一)实验结果1、加法运算:当输入操作数分别为 5 和 3 时,运算结果为 8,准确无误。
2、减法运算:输入 8 和 3,结果为 5,符合预期。
3、乘法运算:输入 2 和 4,得到结果 8,正确。
4、除法运算:输入 10 和 2,结果为 5,无差错。
5、逻辑运算:与运算:输入 1010 和 1100,结果为 1000。
或运算:输入 0101 和 1010,结果为 1111。
非运算:输入 1010,结果为 0101。
(二)结果分析通过对实验结果的观察和分析,可以得出以下结论:1、运算器能够准确地执行各种算术和逻辑运算,结果符合预期。
云南大学信息学院 数字电子技术基础六()

《数字电子技术基础》实验报告姓名:学号:20081 专业:08级通信工程实验六、同步时序逻辑电路设计实验目的:1、掌握触发器组成的同步时序逻辑电路的一般设计方法;2、掌握MSI时序逻辑器件74LS160、74LS194的逻辑功能和使用方法;3、熟悉MSI时序逻辑器件的一般设计方法实验器材:直流稳压电源、数字逻辑电路实验箱、万用表、示波器TTLSSI逻辑门、74LS00、74LS74、74LS76、74LS160、74LS194实验内容和步骤:1、二进制计数器:用触发器设计一个模8的同步二进制加法计数器状态方程:01010101121020112Q Q Q Q Q Q Q Q Q Q Q Q Q Q n n n =+=+=+++驱动方程:012Q Q J = 012Q Q K =01Q J = 01Q K = 100==K J2、模M=13的扭环计数器:用时序逻辑器件也4LS194将电路设计出来思考题:1、用触发器和TTLSSI逻辑门设计一个模8二进制可逆计数器2、用MSI时序逻辑器件构成N进制计数器的常用方法有几种?它们各有何应用特点?答:1、反馈清0法:计数器从全0状态S0开始计数,计满N个状态后产生清0信号,使计数器恢复到初态S0,然后重复上述过程。
2、反馈置数法:置数法和清0法不同,由于置数操作可以置入任意状态,因此计数器不一定从全0状态S0开始计数。
它可以通过预置功能计数器从某个预置状态S i开始计数,计满N个状态后产生置数信号,使计数器以进入预置状态S i,然后重复上述过程。
实验小结:本次实验是本学期最后一次实验,实验主要要求自行设计同步时序逻辑电路主要选做了二进制计数器和模M=1的扭环计数器,根据时序逻辑器件74LS160、74LS194来设计电路并加以验证电路中的CP脉冲端主要连接RS触发器的Q端,RS触发器由74LS00构成。
运算器实验实验报告

运算器实验实验报告一、实验目的运算器是计算机中进行算术和逻辑运算的部件,本次实验的目的在于深入理解运算器的工作原理,掌握其基本结构和功能,并通过实际操作和测试,提高对计算机硬件系统的认识和实践能力。
二、实验设备本次实验所使用的设备包括:计算机、数字逻辑实验箱、导线若干等。
三、实验原理运算器主要由算术逻辑单元(ALU)、寄存器、数据通路和控制逻辑等组成。
ALU 是运算器的核心部件,能够执行加法、减法、乘法、除法等算术运算以及与、或、非等逻辑运算。
寄存器用于存储参与运算的数据和运算结果,数据通路负责在各部件之间传输数据,控制逻辑则根据指令控制运算器的操作。
在本次实验中,我们采用数字逻辑电路来构建运算器的基本功能单元,并通过连线和设置控制信号来实现不同的运算操作。
四、实验内容1、算术运算实验(1)加法运算首先,将两个 8 位二进制数分别输入到两个寄存器中,然后通过控制信号使 ALU 执行加法运算,将结果存储在另一个寄存器中,并通过数码管显示出来。
通过改变输入的数值,多次进行加法运算,观察结果是否正确。
(2)减法运算与加法运算类似,将两个 8 位二进制数输入到寄存器中,使 ALU 执行减法运算,观察结果的正确性。
2、逻辑运算实验(1)与运算输入两个 8 位二进制数,控制 ALU 进行与运算,查看结果。
(2)或运算同样输入两个 8 位二进制数,进行或运算并验证结果。
(3)非运算对一个 8 位二进制数进行非运算,观察输出结果。
3、移位运算实验(1)逻辑左移将一个 8 位二进制数进行逻辑左移操作,观察移位后的结果。
(2)逻辑右移执行逻辑右移操作,对比移位前后的数据。
五、实验步骤1、连接实验设备按照实验箱的说明书,将计算机与数字逻辑实验箱正确连接,并接通电源。
2、构建电路根据实验要求,使用导线将数字逻辑芯片连接起来,构建运算器的电路结构。
3、输入数据通过实验箱上的开关或按键,将待运算的数据输入到相应的寄存器中。
云南大学大学物理实验6-实验报告模板

云南大学软件学院 实验报告课程: 大学物理实验 学期: 2012-2013学年 第一学期 任课教师: 专业: 学号: 姓名: 成绩:实验6 示波器一、实验目的1.了解示波器的主要结构和显示波形的基本原理。
2.学会使用信号发生器。
3.学会用示波器观察波形以及测量电压、周期和频率。
二、实验内容1.观察信号发生器波形 2.测量正弦波电压在示波器上调节出大小适中、稳定的正弦波形,选择其中一个完整的波形,先测算出正弦波电压峰—峰值U p-p ,即:U p-p =(垂直距离DIV )×(档位V/DIV )×(探头衰减率)= 20V然后求出正弦波电压有效值U 为2U 71.0U pp -⨯== 7.1V3.测量正弦波周期和频率在示波器上调节出大小适中、稳定的正弦波形,选择其中一个完整的波形,先测算出正弦波的周期T ,即T =(水平距离DIV )×(档位t/DIV )= 1s然后求出正弦波的频率T f 1== 1Hz 。
4.利用李萨如图形测量频率设将未知频率f y 的电压U y 和已知频率f x 的电压U x(均为正弦电压),分别送到示波器的Y 轴和X 轴,则由于两个电压的频率、振幅和相位的不同,在荧光屏上将显示各种不同波形,一般得不到稳定的图形,但当两电压的频率成简单整数比时,将出现稳定的封闭曲线,称为李萨如图形。
根据这个图形可以确定两电压的频率比,从而确定待测频率的大小。
图4-15-8列出各种不同的频率比在不同相位差时的李萨如图形,不难得出:yx xy N N f X f Y 点数垂直直线与图形相交的点数水平直线与图形相交的轴电压的频率加在轴电压的频率加在=所以未知频率xyx y f NN f =但应指出水平、垂直直线不应通过图形的交叉点。
测量方法如下:(1)将一台信号发生器的输出端接到示波器Y 轴输入端上,并调节信号发生器输出电压的频率为50Hz ,作为待测信号频率。
把另一信号发生器的输出端接到示波器X 轴输入端上作为标准信号频率。
云南大学软件学院数据结构实验六实验报告——赫夫曼编码译码器

云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □学期:任课教师:实验题目: 实验五树及其应用小组长:联系电话:电子邮件:完成提交时间:年月日云南大学软件学院2010学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:课题分析,算法设计,程序编写,后期调试,完成实验报告综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)云南大学软件学院2010学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:课题分析,算法设计,后期调试,完成实验报告综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。
难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)1.数据结构算法的知识:●树的定义。
●树的节点和边的表示。
●树的存储结构。
●树的分类:二叉树—》Heffman树。
●树的遍历:前序遍历,中序遍历,后序遍历。
2.面向对象的程序设计相关知识:●C#基本语法知识。
●类的定义,实例化。
●对象的生成调用。
●变量的传递。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)本实验创建了四个类Form类//用于窗口的初始化,控制各控件的属性和动作Data类//用于本程序所需的频度表数组的生成以及调用HuffmanTree类//用于构造Huffman树以及控制树的各项操作HuffmanTreeNode类//用于构造Huffman树的节点抽象数据类型的功能规格说明:窗口初始化:private void Form1_Load(object sender, EventArgs e)转换模式:private void button1_Click(object sender, EventArgs e)private void button1_Click(object sender, EventArgs e)开始按钮:private void button3_Click(object sender, EventArgs e)声明全局数组:public member[] allMembers = new member[27];定义结构体数组:public struct member{public char ch;//保存频度字符public int frequentness;//保存频度}Data的构造函数(创建Huffman树)public Data()Data类中的寻找当前最大项函数:public int FindMax()Data类中的寻找当前第二大项函数:public int FindSecondMax()Data类中的计算当前有效项的数目的函数:public int Count() HuffmanTreeNode类中创建节点的构造函数:public HuffmanTreeNode (char ch2 ,int frequentness2)HuffmanTree类中定义的节点类型:public HuffmanTreeNode root,p,r; HuffmanTree类中实例化一个Data类来构造频度表:public DatafrequentnessTable; HuffmanTree类中的构造函数,创建一棵Huffman树:public HuffmanTree() HuffmanTree类中的成员函数,对于指定的字符实行中序遍历,遍历完之后逆向回溯得到该字符的Huffman编码:public int SearchTree()HuffmanTree类中的两个节点变量,用于判断左右子树:public int SearchTree()主程序模块伪代码说明:创建新的字母频度表:frequentnessTable = new Data();创建栈来倒装输出赫夫曼编码:Stack<char> HuffmanCode = Stack<char>;退出程序:this.Close()子程序伪代码说明(HuffmanTree):构建Huffman树:public HuffmanTreeNode root,p,r;核心程序段(生成Huffman编码):while (r == root){r = p.parent;if (p == r.left)HuffmanCode.Push('1');//栈中存1elseHuffmanCode.Push('0');//栈中存0p = p.parent;}返回栈中元素个数:public int count { get{ return list.Count; } }主程序模块与各子程序模块间的调用关系:Class Form1调用Class Data初始化程序所要的各项数据。
运算器原理实验报告

一、实验目的1. 理解和掌握运算器的组成结构及工作原理;2. 熟悉算术逻辑单元(ALU)的算术运算和逻辑运算功能;3. 掌握运算器中各种控制信号的作用及控制方法;4. 通过实验验证运算器的实际运算功能。
二、实验原理运算器是计算机中执行算术运算和逻辑运算的核心部件。
它主要由算术逻辑单元(ALU)、寄存器、控制单元等组成。
算术逻辑单元负责执行加、减、乘、除等算术运算和与、或、非、异或等逻辑运算。
控制单元根据指令控制运算器的各个部件进行相应的操作。
三、实验设备1. 计算机组成原理实验箱2. 74LS181算术逻辑单元芯片3. 数据输入/输出设备4. 排线若干四、实验步骤1. 按照实验指导书,连接实验箱电路,包括74LS181算术逻辑单元芯片、数据输入/输出设备等。
2. 设置运算器工作模式,包括算术运算模式和逻辑运算模式。
3. 设置算术运算模式,进行加、减、乘、除等算术运算实验。
4. 设置逻辑运算模式,进行与、或、非、异或等逻辑运算实验。
5. 观察实验结果,记录数据。
6. 根据实验结果,分析运算器的工作原理。
五、实验内容及结果1. 算术运算实验(1)加法运算输入两个8位二进制数:A=10101010,B=11001100。
执行加法运算,得到结果:S=11100110。
(2)减法运算输入两个8位二进制数:A=11001100,B=10101010。
执行减法运算,得到结果:S=01010100。
(3)乘法运算输入两个8位二进制数:A=10101010,B=11001100。
执行乘法运算,得到结果:S=111110010010。
(4)除法运算输入两个8位二进制数:A=11001100,B=10101010。
执行除法运算,得到结果:S=00101001。
2. 逻辑运算实验(1)与运算输入两个8位二进制数:A=10101010,B=11001100。
执行与运算,得到结果:S=10001000。
(2)或运算输入两个8位二进制数:A=10101010,B=11001100。
运算器实验报告

运算器实验报告运算器实验报告引言:运算器是一种能够进行数学运算的装置,它是计算机的核心组成部分之一。
在本次实验中,我们将通过搭建一个简单的运算器来深入了解其工作原理和运算过程。
通过实践,我们可以更好地理解计算机的运算逻辑,并掌握一些基本的计算机原理。
一、实验目的本次实验的主要目的是通过搭建运算器,了解其内部结构和运算过程,培养我们的动手能力和解决问题的能力。
同时,通过实验,我们还可以加深对计算机运算逻辑的理解,为今后的学习和研究打下基础。
二、实验材料和方法1. 实验材料:- 逻辑门芯片(与门、或门、非门等)- 连线- 电源- 开关- LED灯2. 实验方法:- 按照实验指导书的要求,依次连接逻辑门芯片、连线、开关和LED灯。
- 打开电源,观察LED灯的亮灭情况,记录实验结果。
- 根据实验结果,分析运算器的工作原理和运算过程。
三、实验结果与分析在实验过程中,我们按照指导书的要求,搭建了一个简单的运算器。
通过观察LED灯的亮灭情况,我们可以判断运算器是否正常工作。
在实验中,我们进行了加法、减法、乘法和除法等运算,记录了实验结果。
通过分析实验结果,我们可以发现运算器的工作原理和运算过程。
在加法运算中,我们使用了与门和或门来实现进位和求和的功能。
在减法运算中,我们使用了与门和非门来实现借位和求差的功能。
在乘法和除法运算中,我们通过多次加法和减法运算来实现。
四、实验总结通过本次实验,我们深入了解了运算器的工作原理和运算过程。
我们通过搭建运算器,实际操作了逻辑门芯片、连线、开关和LED灯等实验材料,培养了我们的动手能力和解决问题的能力。
同时,我们还加深了对计算机运算逻辑的理解,为今后的学习和研究打下了基础。
在今后的学习中,我们可以进一步深入研究运算器的原理和应用,探索更复杂的运算过程和算法。
通过不断学习和实践,我们可以提高自己的计算机技术水平,为科学研究和工程应用做出更大的贡献。
总之,本次实验是一次非常有意义的实践活动。
云南大学软件学院大学物理实验报告六

云南大学软件学院 实验报告课程: 大学物理实验 学期: 2012-2013学年 第一学期 任课教师: 张德海 专业: 数字媒体技术 学号: 20111120248 姓名: 赵云涛 成绩:实验6 示波器一、 实验目的1.学会使用信号发生器。
2.学会用示波器观察波形以及测量电压、周期和频率。
二、 实验内容1.观察信号发生器波形2.测量正弦波电压在示波器上调节出大小适中、稳定的正弦波形,选择其中一个完整的波形,先测算出正弦波电压峰—峰值U p-p ,即:U p-p =(垂直距离DIV )×(档位V/DIV )×(探头衰减率)= 20.0v然后求出正弦波电压有效值U 为2U 71.0U p p -⨯== 7.1v3.测量正弦波周期和频率在示波器上调节出大小适中、稳定的正弦波形,选择其中一个完整的波形,先测算出正弦波的周期T ,即T =(水平距离DIV )×(档位t/DIV )= 150.0s然后求出正弦波的频率T f 1= = 0.0067 Hz 。
4.观察李萨如图形(1)将示波器的显示模式切换为A/B ,A 通道接到如图电路的位置1,调节信号发生器输出电压的频率为50Hz ;信号发生器2的输出端接到示波器B 通道,分别调节输出正弦波的频率为50Hz 、75Hz 、100Hz 、150Hz ,观察并记录各种李萨如图形。
(2)将示波器的显示模式切换为A/B ,A 通道接到如图电路的位置2,调节信号发生器输出电压的频率为50Hz ;信号发生器2的输出端接到示波器B 通道,分别调节输出正弦波的频率为50Hz 、75Hz 、100Hz 、150Hz ,观察并记录各种李萨如图形。
思考题1. 信号的幅值对李萨如图形有影响么?答:会影响到,李萨如图的形状会随两个信号的幅值以及位相不同而变化。
2. 要获得稳定的李萨如图形,两个信号的频率应符合什么样的关系?答:李萨如图上的每一个点都可以用以下的公式进行表示:X=A1sin(ω1t+ψ1) ,Y=A2sin(ω2t+ψ2) 。
云南大学实验六数据库完整性报告

云南大学软件学院实验报告课程:数据库原理与实用技术实验任课教师:刘宇、张璇姓名:学号:专业:信息安全成绩:实验6 数据库完整性实验6-1 完整性约束1、创建规则(用图形或者语句方法创建)(1)创建入学日期规则“Enter_University_date_rule”,假定该学校于1923年4月30日创建。
要求:入学日期必须大于等于学校创建日期,并且小于等于当前日期测试:(2)创建学生年龄规则“Age_rule”。
要求:学生年龄必须在15~30岁之间测试:(3)创建学生性别规则“Sex_rule”。
要求:性别只能为“男”或“女”测试:《数据库原理与实用技术》实验3 / 21(4)创建学生成绩规则“Score_rule ”。
要求:学生成绩只能在0~100之间(5)用图形方法查看学生成绩规则“Score_rule ”,截图为:双击:成绩:(6)用语句方法查看学生成绩规则“Score_rule ”,语句为:2、删除规则Enter_University_date_rule3、创建默认(用图形或者语句方法创建)(1)创建默认时间“Time_default”为当前系统时间(2)创建默认入学年龄“Age_default”为18岁(3)用图形方法查看默认入学年龄“Age_default”,截图为:《数据库原理与实用技术》实验5 /21(4)用语句方法查看默认入学年龄“Age_default ”,语句为:4、删除默认入学年龄“Age_default ”5、创建声明式默认:在创建表的过程中创建声明式默认 (1)创建表“default_example ”,表中包含字段pid 、name 、sex 、age 。
要求设定sex 的默认值为“男”、age 的默认值为18。
编号 姓名 性别 年龄 101 苏晴 女 201马拯山20执行结果为:输入数据:获取数据结果为:(2)在表中增加新的默认,将编号默认为100。
插入一条记录,执行结果为:6、在“学生管理数据库”各个数据表中建立相应的主键、外键、惟一值、以及check约束,要求:学生的年龄必须是两位数,其中第一位是1或2:学生表如下:《数据库原理与实用技术》实验授课表如下课程表如下:7/ 21成绩表如下:删除check 约束:学生表的:《数据库原理与实用技术》实验9/21授课表的:课程表的:成绩表的:7、完成教科书456页如下习题:[7.1]a:实验6-2 触发器《数据库原理与实用技术》实验11 / 211、使用触发器(1)创建一个触发器trig_update ,返回对“学生表”进行更新操作后,被更新的记录条数(2)执行触发器(3)修改触发器trig_update ,除返回被更新的记录条数外,再返回学生的所有基本信息2、使用触发器的两个特殊表:插入表(inserted)和删除表(deleted)。
运算器实验报告

运算器实验报告
实验目的
本次实验的主要目的是研究计算机运算器的工作原理,并通过实验模拟计算器的加减乘除运算,以达到对运算器工作原理的理解与掌握的目的。
实验器材
该实验所需的器材主要有:
1.计算机运算器实验板
2.示波器
3.数字信号发生器
4.电缆线
5.万用表
6.电子元器件
实验步骤
1.根据实验板说明书进行组装,接通电源,检查实验板是否能够正常工作。
2.使用数字信号发生器提供输入信号,将输入信号通过运算器
进行运算,从而得到相应的输出信号。
3.使用示波器观测输入信号和输出信号的波形,以评估运算器
的各项性能指标。
4.通过电缆线将运算器连接到计算机,将运算器的输出信号保
存至计算机硬盘,以方便后续处理和分析。
实验结果
通过对实验板的组装和调试,我们成功地实现了模拟计算器的
加减乘除运算。
同时,我们还使用示波器观测到了输入信号和输
出信号的波形,并通过电缆线将运算器连接到计算机,将运算器
的输出信号保存到了计算机硬盘中。
实验总结
本次实验结束后,我们深刻地认识到了计算机运算器的重要性。
在计算机系统中,运算器扮演着极为关键的角色,通过对各种数
字信号进行加减乘除等运算,完成了计算机的复杂计算任务。
因此,对运算器的研究和掌握显得十分必要,尤其是在计算机科学
与技术领域,更是必不可少的一部分。
最后,我们要感谢老师对我们的指导和支持,在这个实验中,我们更加深入地了解了计算机的原理与工作机制。
希望在未来的学习中能够发扬这种学习精神,更好地掌握计算机科学与技术的核心内容,为我们的学习和研究提供有力的支撑。
实验六 运算器数据通路

实验六 运算器数据通路一、实验目的1、熟悉74LS181函数功能发生器的功能,提高器件在系统中应用的能力2、熟悉运算器的数据传送通路3、完成几种算逻运算操作,加深对运算器工作原理的理解 二、实验内容按图6-1所示参考框图自行设计一个能完成表6-1所列补码运算指令的运算器(为简单化电路,进位和结果触发器可以不设置)。
选择适当元件,画出详细实验电路逻辑图(包括对开关的定义),并组装成电路。
表6-1:在电路上进行表6-1中指令的手动单指令操作(操作数、指令码由数据开关输入)。
设计提示:1、运算器的输入缓存器A S 、B S 分别用一片74LS161来实现,但只用到74LS161的置数功能,禁止其计数功能。
2、用一片74LS273作为运算器操作指令寄存器,只用到6位。
3、用一片74LS244控制运算器的运算结果能否送总线。
三、实验仪器及器材1、实验台和+5V 直流稳压电源各一台。
2、器件由附录A “集成电路清单”内选用。
四、实验电路原理(实验电路原理图)1、四位函数功能发生器(ALU )74LS181的功能74LS181通过“控制参数”3S ~0S 和“模式控制”M ,可对两个输入操作数完成32种算、逻运算,并可以工作于正逻辑输入输出或负逻辑输入输出方式(本实验为正逻辑方式)。
控制端0M =时,属算术运算;1M =时,属逻辑运算。
进位采用补码形式输入输出,电路亦可进行数的比较运算。
其操作功能可查阅实验五中的功能表。
2、数据传送通路实验电路方案运算器是计算机对数据进行运算的重要部件,它的核心是ALU 函数功能发生器,其次还要有存放操作数和运算中间结果的寄存器、移位门、传送数据的总线等部件,在不同的控制信号下,运算器完成不同的运算功能。
如图6-1所示。
图6-1 运算器数据通路框图在图6-1中,A S 、B S 为存放两个现行操作数的缓冲寄存器。
其中A S 兼作存放中间结果的累加器,并给予显示。
它们仅接收来自总线的数据信息,送入ALU 进行算、逻运算。
运算器原理实验报告

运算器原理实验报告运算器原理实验报告一、引言运算器是计算机中的重要组成部分,它负责进行各种算术和逻辑运算。
在本次实验中,我们将探索运算器的基本原理,并通过实际搭建电路并进行测试,来验证运算器的功能和性能。
二、实验目的本次实验的主要目的有以下几点:1. 理解运算器的基本原理和工作方式;2. 学习运算器电路的搭建和调试方法;3. 掌握运算器的性能测试和评估方法。
三、实验原理运算器是由逻辑门电路组成的,它能够对输入的数据进行算术和逻辑运算,并输出结果。
在实验中,我们将使用与门、或门、非门等逻辑门电路来构建一个简单的四位二进制加法器。
四、实验步骤1. 准备工作:收集所需器件和元件,包括与门、或门、非门、触发器等,并确保它们的正常工作。
2. 运算器电路的搭建:按照实验指导书上的电路图,将逻辑门电路依次连接起来,形成一个完整的运算器电路。
3. 电路调试:将电路连接到电源上,并使用示波器等工具进行电路的调试,确保信号的传输和转换正常。
4. 功能测试:输入不同的二进制数值,并通过示波器观察输出结果是否正确。
5. 性能评估:测试运算器的响应速度、功耗等性能指标,并与理论值进行对比分析。
五、实验结果与分析通过实验,我们成功搭建了一个四位二进制加法器,并进行了功能测试和性能评估。
在功能测试中,输入不同的二进制数值,运算器能够正确地进行加法运算,并输出正确的结果。
在性能评估中,我们发现该运算器的响应速度较快,功耗较低,符合设计要求。
六、实验总结本次实验通过搭建运算器电路并进行测试,加深了对运算器原理的理解。
实验结果表明,通过合理设计和调试,可以构建出性能良好的运算器电路。
然而,我们也发现实验过程中存在一些问题,如电路连接不稳定、信号干扰等,这些问题需要进一步的优化和改进。
七、实验心得通过本次实验,我深刻认识到了运算器在计算机系统中的重要性,同时也了解到了运算器电路搭建和调试的一些技巧。
在今后的学习和研究中,我将进一步探索运算器的原理和应用,为计算机系统的设计和优化做出更多的贡献。
云南大学_数字电路与逻辑设计实验六实验报告

数字电路与逻辑设计实验六实验报告信息学院一、实验目的1、熟悉MSI时序器件74LS160、74LS194的逻辑功能和使用方法2、掌握MSI时序逻辑电路的分析方法二、实验仪器及设备1、直流稳压电源、数字逻辑电路实验箱、万用表、示波器2、74LS00、74LS02、74LS04、74LS74、74LS76(或74LS112)三、实验内容及步骤1.数码显示电路2.同步十进制计数器用74LS160和74LS48芯片建立如图5-3所示的实验电路(74LS160引脚编号旁边标注的是对应引脚的逻辑名称之别名)。
图5-3计数器的时钟脉冲输入端CP接单脉冲,进位输出端Oc、计数输出端、、、各接一个LED,并且最好按照从左到右的顺序排列(为什么?)。
让74LS160从=0000(十进制数“0”)开始工作(如何做到?),按动单脉冲按钮逐个送入计数脉冲。
每送入一个脉冲就记下相应的时钟脉冲数以及输出端、、、、的状态变化和数码管显示出的数字(应与时钟脉冲数相等)。
送入第十个脉冲时,计数器应当回复到全0状态。
整理结果,画出74LS160的计数时序波形图。
3.双向移位寄存器图5-5所示为集成双向移位寄存器74LS194的逻辑功能测试图,同样在芯片引脚编号旁边标注了引脚逻辑功能的别名(没有标注的即为暂无别名)。
74LS194的逻辑功能较为复杂,实验中使用的逻辑开关较多,建议所用逻辑开关的排列顺序与原理图中的顺序相同,以便操作记忆。
如图建立实验电路,模式选择输入端、、清零输入端(也就是端)、移位方向控制输入端、分别接到五只逻辑开关,时钟脉冲输入端CP(也就是CLK端)接到单脉冲,在并行数据输入端~(也就是图中的DCBA端)上加载数据=1011,寄存器输出端~(也就是图中的端)分别接到四只LED。
先将74LS194的计数清零,用同步置数功能,将输出端~置为并行输入数据1011.改变并行数据,重复一次实验,记录实验过程和结果。
将计数清零,用右移功能,用四个单脉冲,将输出端~按0000→0001→0010 0101→1011的顺序最终得到=1011的状态,记录实验过程和结果。
运算器原理实验报告

运算器原理实验报告摘要本实验利用运算器实现了加法和乘法运算,并通过编程控制了运算过程。
实验结果表明,该运算器能够正确地进行加法和乘法运算,并输出正确的结果。
同时,通过在程序中添加适当的控制语句,可以实现不同运算的选择。
1.引言运算器是计算机中非常重要的一部分,用于进行数值计算和逻辑运算。
在本实验中,我们设计了一个简单的运算器,通过编程控制实现加法和乘法运算。
2.实验设备和原理2.1 实验设备本实验主要使用了一台电脑,并在其上运行了相应的编程软件。
同时,还需要连接显示屏和输入设备(如键盘)以方便数据的输入和输出。
2.2 实验原理本实验采用的运算器是基于二进制数的加法和乘法运算,其原理如下:(1)加法运算:将两个二进制数按位相加,超出位数则向高位进位。
(2)乘法运算:利用加法和位移操作实现。
对于A、B两个数的乘法,依次将A的每一位与B相乘,然后将结果相加得到最终的乘积。
3.实验步骤3.1 编写程序根据实验原理,编写相应的程序代码,包括加法和乘法的实现以及相应的控制语句。
3.2 运行程序将程序上传至运算器设备,并打开相应的输入输出设备。
根据需要输入相应的操作数和运算符,然后运行程序,观察输出结果。
4.实验结果与分析经过实验,我们发现该运算器能够正确地进行加法和乘法运算,并输出正确的结果。
通过在程序中添加控制语句,可以实现不同运算的选择,提高了运算器的灵活性。
5.结论通过本次实验,我们成功设计并实现了一个基于二进制数的运算器,可以进行加法和乘法运算,并输出正确的结果。
该运算器具有一定的灵活性,可以通过编程控制实现不同运算的选择。
云南大学汇编运算器实验参考答案

硬件实验要求
1、每次硬件实验前必须先预习,实验时请带好硬件实验的
指导书;
2、每次的实验报告都要求手工填写,打印的报告无效,每
次硬件实验开始时请打印好空白的实验报告模板(见第
4页)。
3、实验报告要填写的内容请看各次的实验报告填写要求;
4、每次实验结束后请把实验箱电源线交到讲台处;
5、实验报告提交时间是下次实验课时间,提交时请区分实
验课的选课教师,提交到硬件实验室1429。
硬件实验报告填写内容
实验六运算器实验
1.按实验指导书完成开关控制操作方式的实验内容;
2.画出实验连线图;
3.根据实验步骤,分析总结各步骤设置和控制;
4.实验数据记录
注:填写实验验证过的功能即可
(请自行转化为二进制表示十六进制,可能部分存在错误,自行对照公式表验算。
)
5.实验小结
2.
3.(1) 三态门74244作为输出缓冲器由ALU-G信号控制,ALU-G 为“0”时,三态门开通,此时其输出等于其输入;ALU-G 为“1”时,三态门关闭,此时其输出呈高阻。
(2)本实验中ALU-G和C-G不能同时为0,否则造成总线冲突,损坏芯片!故每次实验时应时刻保持只有一路与总线相通。
(3)按一下脉冲源及时序电路的“单脉冲”按钮,给暂存器LT1(U27,74LS273)送时钟,上升沿有效,把数据存在LT2中
5. (1)掌握运算器的组成及工作原理;
(2)了解4位函数发生器74181的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程;
(3)验证带进位控制的74181的功能
(公式请参照运算器实验指导书)
指导教师 (签名):。
云南大学软件学院计算机网络原理实验六实验报告3

实验六、传输层可靠传输协议GBN编程实验报告序号:姓名:学号:成绩指导老师:一、实验目的:1、通过编写实现一个简单可靠的数据传输协议GBN的发送和接收代码,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
二、实验指导:参考教材。
动画演示:三、实验要求:编程实现一个GBN传输协议的发送方和接收方两程序,采用编程语言不限,要求能将发送――接收流程以及处理方法表现出来.1.实验流程图如下:N2.实验截图与代码如下: 截图: 传送下一个数据包结束代码及注释:一、GBN.h#pragma once#include <stdio.h>//基础功能模块的数据结构声明#define BIDIRECTIONAL 1 /* change to 1 if you're doing extra credit andwrite a routine called B_output *//* a "msg" is the data unit passed from layer 5 (teachers code) to layer4 (students' code). It contains the data (characters) to be delivered tolayer 5 via the students transport level protocol entities. */struct msg{ char data[20];};/* a packet is the data unit passed from layer 4 (students code) to layer3 (teachers code). Note the pre-defined packet structure, which allstudents must follow. */struct pkt{int seqnum;int acknum;int checksum;char payload[20];};#define WINDOWSIZE 8#define MAXBUFSIZE 50#define RTT 15.0#define NOTUSED 0#define NACK -1#define TRUE 1#define FALSE 0#define A 0#define B 1//网络仿真部分数据结构声明***********************************************************struct event{float evtime; /* event time */int evtype; /* event type code */int eventity; /* entity where event occurs */struct pkt *pktptr; /* ptr to packet (if any) assoc w/ this event */ struct event *prev;struct event *next;};/* possible events: */#define TIMER_INTERRUPT 0#define FROM_LAYER5 1#define FROM_LAYER3 2#define OFF 0#define ON 1//基础功能模块的函数声明******************************************************************* void ComputeChecksum(struct pkt *packet);//计算校验和int CheckCorrupted(struct pkt packet);//检查数据是否出错void A_output( struct msg message);//A端向外发送数据void A_input(struct pkt packet);//A端接收数据void A_timerinterrupt();//A计时器超时void A_init();//A端初始化void B_output(struct msg message);void B_input(struct pkt packet);void B_timerinterrupt();void B_init();//网络仿真部分的函数声明**************************************************void init(); //初始化仿真器float jimsrand();//随机数发生器[0,1]//处理事件列表部分的函数声明*********************************************void generate_next_arrival();//产生下一个到达的分组void insertevent(struct event *p);//向事件列表中插入一条新的事件void printevlist();//打印事件列表//******************************************************************** //**********************计时器模块*********************************** void stoptimer(int);//停止计时器void starttimer(int,float);//启动计时器//******************************************************************** *//**************************网络各层之间传送模块***********************void tolayer3(int AorB,struct pkt packet);//向第3层发送信息void tolayer5(int AorB,char datasent[20]);//向第5层发送信息二、GBN.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE = 1; /* for my debugging */为我的调试extern int nsim = 0; /* number of messages from 5 to 4 so far */目前为止信息的数字是从5到4extern int nsimmax = 0; /* number of msgs to generate, then stop */如果信息产生的数字为0,然后就停止extern float time = 0.000;float lossprob; /* probability that a packet is dropped */数据包可能会丢失float corruptprob; /* probability that one bit is packet is flipped*/这一点的数据包可能会被弹出去float lambda; /* arrival rate of messages from layer 5 */ 第五层到达的信息的次序int ntolayer3; /* number sent into layer 3 */被传送到第三层的数据static int nlost = 0; /* number lost in media */在媒介中数据丢失static int ncorrupt = 0; /* number co rrupted by media*/被媒介毁坏的数据static int expectedseqnum = 0; /* expected se quence number at receiver side */在接收者这边接收到预期的序列数据static int nextseqnum; /* next sequence number to use in sender side */下一个序列数据使用在发送者这边static int base; /* t he head of sender window */发送者的头窗口struct pkt winbuf[WINDOWSIZE]; /* window packets buffer */数据包缓冲区窗口static int winfront,winrear; /* front and rear points of wind ow buffer */窗口缓冲区的前方点和后方点static int pktnum; /* packet number of window buffer */窗口缓冲区的数据包个数struct msg buffer[MAXBUFSIZE]; /* sender message buffer */发送消息缓冲区int buffront,bufrear; /* front and rear pointers of buffer */缓冲区的前指针与后指针static int msgnum; /* message number of buffer */信息数量的缓冲int packet_lost =0;int packet_corrupt=0;int packet_sent =0;extern int packet_correct=0;extern int packet_resent =0;int packet_timeout=0;extern struct event *evlist = NULL; /* the event list *///计算校验和void ComputeChecksum( struct pkt *packet){int checksum;int i;checksum = packet->seqnum;checksum = checksum + packet->acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet->payload[i]);checksum = 0-checksum;packet->checksum = checksum;}//检查是否出错int CheckCorrupted(struct pkt packet){int checksum;int i;checksum = packet.seqnum;checksum = checksum + packet.acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet.payload[i]);if ( (packet.checksum+checksum) == 0 )return (FALSE);elsereturn (TRUE);}//A端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void A_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* update state variables */nextseqnum = nextseqnum+1;starttimer(A,RTT);B_input(sendpkt);A_input(sendpkt);}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//B端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void B_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);A_input(sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* if it is the first packet in window, start timeout */ //if ( base == nextseqnum )//{//starttimer(A,RTT);//printf("----A: start a new timer!\n");// }/* update state variables */nextseqnum = nextseqnum+1;}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//A端接收数据void A_input(struct pkt packet){struct pkt sendpkt;int i;/* if received packet is not corrupted and ACK is received */if ( (CheckCorrupted(packet) == FALSE) && (packet.acknum != NACK) ) {printf("----A: ACK %d is correctly received,",packet.acknum);packet_correct++;/* delete the acked packets from window buffer */winfront = (winfront+(packet.acknum+1-base)) % WINDOWSIZE; pktnum = pktnum - (packet.acknum+1-base);/* move window base */base = packet.acknum+1;stoptimer(A);if ( base < nextseqnum){//starttimer(A,RTT);printf ("\n\n\nsend new packets!");}/* if buffer is not empty, send new packets */while ( (msgnum!=0) && (nextseqnum<base+WINDOWSIZE) ) {/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;buffront = (buffront+1) % MAXBUFSIZE;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = buffer[buffront].data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* if it is the first packet in window, start timeout */if ( base == nextseqnum ){//starttimer(A,RTT);printf ("send new packets!\n");}/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;winbuf[winrear] = sendpkt;pktnum ++;/* update state variables */nextseqnum = nextseqnum+1;/* delete message from buffer */msgnum --;}}elseprintf ("----A: NACK is received, do nothing!\n");}//B端接收数据*****************************************************一定要调用这个/* Note that with simplex transfer from a-to-B, there is no B_output() */ /* called from layer 3, when a packet arrives for layer 4 at B*/void B_input(struct pkt packet){struct pkt sendpkt;int i;/* if not corrupted and received packet is in order */if ( (CheckCorrupted(packet) == FALSE) && (packet.seqnum == expectedseqnum)){printf("\n----B: packet %d is correctly received, send ACK!\n",packet.seqnum);/* send an ACK for the received packet *//* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = expectedseqnum;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet *///tolayer3 (B, sendpkt);/* update state variables */expectedseqnum = expectedseqnum+1;printf("----B:expectedseqnum = %d\n",expectedseqnum);/* deliver received packet to layer 5 *///tolayer5(B,packet.payload);}/* otherwise, discard the packet and send a NACK */else{printf("----B: packet %d is corrupted or not I expects, send NACK!\n",packet.seqnum);/* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = NACK;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (B, sendpkt);}}//A计时器超时/* called when A's timer goes off */void A_timerinterrupt(){int i;printf("----A: time out,resend packets!\n");/* start timer */starttimer(A,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(A,winbuf[(winfront+i)%WINDOWSIZE]);}}//B计时器超时/* called when B's timer goes off */void B_timerinterrupt(){int i;printf("----B: time out,resend packets!\n");/* start timer */starttimer(B,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(B,winbuf[(winfront+i)%WINDOWSIZE]);}}//A端初始化/* entity A routines are called. You can use it to do any initialization */void A_init()base = 0;nextseqnum = 0;buffront = 0;bufrear = 0;msgnum = 0;winfront = 0;winrear = 0;pktnum = 0;}//B端初始化/* entity B routines are called. You can use it to do any initialization */void B_init(){expectedseqnum = 0;}//初始化仿真器void init() /* initialize the simulator */{int i;float sum, avg;float jimsrand();FILE *fp;fp = fopen ("parameter.txt","r");printf("----- Stop and Wait Network Simulator Version 1.1 -------- \n\n");printf("Enter the number of messages to simulate: ");//fscanf(fp,"%d",&nsimmax);scanf("%d",&nsimmax);printf("\nEnter packet loss probability [enter 0.0 for no loss]: "); //fscanf(fp, "%f",&lossprob);scanf("%f",&lossprob);printf("\nEnter packet corruption probability [0.0 for no corruption]: "); //fscanf(fp,"%f",&corruptprob);scanf("%f",&corruptprob);printf("\nEnter average time between messages from sender's layer5 [ > 0.0]: ");//fscanf(fp,"%f",&lambda);scanf("%f",&lambda);printf("\nEnter TRACE: ");//fscanf(fp,"%d",&TRACE);scanf("%d",&TRACE);printf("\n\n");srand(9999); /* init random number generator */sum = 0.0; /* test random number generator for students */for (i=0; i<1000; i++)sum=sum+jimsrand(); /* jimsrand() should be uniform in [0,1] */avg = sum/1000.0;/*if(avg < 0.25 || avg > 0.75){printf("It is likely that random number generation on your machine\n" ); printf("is different from what this emulator expects. Please take\n"); printf("a look at the routine jimsrand() in the emulator code. Sorry. \n");exit(0);}*/printf("%f",avg);ntolayer3 = 0;nlost = 0;ncorrupt = 0;time=0.0; /* initialize time to 0.0 */generate_next_arrival(); /* initialize event list */}//随机数发生器float jimsrand(){double mmm = 2147483647; /* largest int - MACHINE DEPENDENT */float x; /* individual students may need to change mmm */x = rand()/mmm; /* x should be uniform in [0,1] */return(x);}//**************************************************************************************//*******************************事件处理部分*******************************************void generate_next_arrival(){double x,log(),ceil();struct event *evptr;float ttime;int tempint;//if (TRACE>2)//printf("-----------------GENERATE NEXT ARRIVAL: creating new arrival\n");x = lambda*jimsrand()*2; /* x is uniform on [0,2*lambda] *//* having mean of lambda */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + x;evptr->evtype = FROM_LAYER5;if (jimsrand()<0.5){evptr->eventity = A;}evptr->eventity = B;insertevent(evptr);}//向事件列表中插入一条新的事件void insertevent(struct event *p){struct event *q,*qold;if (TRACE>2){//printf(" INSERTEVENT: time is %lf\n",time);//printf(" INSERTEVENT: future time will be %lf\n",p->evtime);}q = evlist; /* q points to front of list in which p struct inserted */if (q==NULL)/* list is empty */{evlist=p;p->next=NULL;p->prev=NULL;}else{for (qold = q; q !=NULL && p->evtime > q->evtime; q=q->next) qold=q;if (q==NULL)/* end of list */{qold->next = p;p->prev = qold;p->next = NULL;}else if (q==evlist)/* front of list */p->next=evlist;p->prev=NULL;p->next->prev=p;evlist = p;}else /* middle of list */{p->next=q;p->prev=q->prev;q->prev->next=p;q->prev=p;}}}//打印事件列表void printevlist(){struct event *q;int i;printf("--------------\nEvent List Follows:\n");for(q = evlist; q!=NULL; q=q->next){printf("Event time: %f, type: %d entity: %d\n",q->evtime,q->evtype,q->eventity);}printf("--------------\n");}//启动计时器void starttimer(int AorB,float increment){struct event *q;struct event *evptr;if (TRACE>2)printf("\n----A: START TIMER: starting timer at %f\n",time);/* be nice: check to see if timer is already started, if so, then warn *//* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) ){//printf("Warning: attempt to start a timer that is already started\n");return;}/* create future event for when timer goes off */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + increment;evptr->evtype = TIMER_INTERRUPT;evptr->eventity = AorB;insertevent(evptr);}//停止计时器/* called by students routine to cancel a previously-started timer */ void stoptimer(int AorB) /* A or B is trying to stop timer */{struct event *q,*qold;if (TRACE>2)printf("\n----A: STOP TIMER: stopping timer\n");/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) )/* remove this event */{if (q->next==NULL && q->prev==NULL)evlist=NULL; /* remove first and only event on listelse if (q->next==NULL) /* end of list - there is one in front */ q->prev->next = NULL;else if (q==evlist) /* front of list - there must be event after */{q->next->prev=NULL;evlist = q->next;}else /* middle of list */{q->next->prev = q->prev;q->prev->next = q->next;}free(q);return;}//printf("Warning: unable to cancel your timer. It wasn't running.\n");}//向第三层发送信息/************************** TOLAYER3 ***************/void tolayer3(int AorB,struct pkt packet){struct pkt *mypktptr;struct event *evptr,*q;float lastime, x, jimsrand();int i;ntolayer3++;/* simulate losses: */if (jimsrand() < lossprob){nlost++;if (TRACE>0)printf(" TOLAYER3: packet being lost\n");return;}/* make a copy of the packet student just gave me since he/she may decide *//* to do something with the packet after we return back to him/her */ mypktptr = (struct pkt *)malloc(sizeof(struct pkt));mypktptr->seqnum = packet.seqnum;mypktptr->acknum = packet.acknum;mypktptr->checksum = packet.checksum;for (i=0; i<20; i++)mypktptr->payload[i] = packet.payload[i];if (TRACE>2){printf(" TOLAYER3: seq: %d, ack %d, check: %d ", mypktptr->seqnum,mypktptr->acknum, mypktptr->checksum);for (i=0; i<20; i++)printf("%c",mypktptr->payload[i]);printf("");}/* create future event for arrival of packet at the other side */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtype = FROM_LAYER3; /* packet will pop out from layer3 */ evptr->eventity = (AorB) % 2; /* event occurs at other entity */evptr->pktptr = mypktptr; /* save ptr to my copy of packet *//* finally, compute the arrival time of packet at the other end. medium can not reorder, so make sure packet arrives between 1 and 10 time units after the latest arrival time of packetscurrently in the medium on their way to the destination */lastime = time;/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==FROM_LAYER3 && q->eventity==evptr->eventity) ) lastime = q->evtime;evptr->evtime = lastime + 1 + 9*jimsrand();/* simulate corruption: */if (jimsrand() < corruptprob){ncorrupt++;if ( (x = jimsrand()) < .75)mypktptr->payload[0]='Z'; /* corrupt payload */else if (x < .875)mypktptr->seqnum = 999999;elsemypktptr->acknum = 999999;if (TRACE>0)printf(" TOLAYER3: packet being corrupted\n");}//if (TRACE>2)//printf(" TOLAYER3: scheduling arrival on other side\n");insertevent(evptr);}//向第五层发送信息/************************** TOLAYER5 ***************/void tolayer5(int AorB,char datasent[20]){int i;if (TRACE>2){printf(" TOLAYER5: data received: ");for (i=0; i<20; i++)printf("%c",datasent[i]);printf("\n");}}三、GBN-CS.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE ; /* for my debugging */extern int nsim ; /* number of messages from 5 to 4 so far */extern int nsimmax; /* number of msgs to generate, then stop */extern float time;extern int packet_correct;extern int packet_resent;extern struct event *evlist;int main(){struct event *eventptr;struct msg msg2give;struct pkt pkt2give;int i,j;char c;init();A_init();B_init();while (1){eventptr = evlist; /* get next event to simulate */ if (eventptr==NULL)goto terminate;evlist = evlist->next; /* remove this event from event list */if (evlist!=NULL)evlist->prev=NULL;if (TRACE >= 2){printf("\nEVENT time: %f,",eventptr->evtime);printf(" type: %d",eventptr->evtype);if (eventptr->evtype==0)printf(", timerinterrupt ");else if (eventptr->evtype==1)printf(", fromlayer5 ");elseprintf(", fromlayer3 ");printf(" entity: %d\n",eventptr->eventity);}time = eventptr->evtime; /* update time to next event time*/if (nsim==nsimmax)break; /* all done with simulation */if (eventptr->evtype == FROM_LAYER5 ){generate_next_arrival(); /* set up future arrival *//* fill in msg to give with string of same letter */j = nsim % 26;for (i=0; i<20; i++)msg2give.data[i] = 97 + j;if (TRACE>2){printf(" MAINLOOP: data given to student: ");for (i=0; i<20; i++)printf("%c", msg2give.data[i]);printf("\n");}nsim++;if (eventptr->eventity == A){A_output(msg2give);}else{B_output(msg2give);}}else if (eventptr->evtype == FROM_LAYER3){pkt2give.seqnum = eventptr->pktptr->seqnum;pkt2give.acknum = eventptr->pktptr->acknum;pkt2give.checksum = eventptr->pktptr->checksum;for (i=0; i<20; i++)pkt2give.payload[i] = eventptr->pktptr->payload[i];if (eventptr->eventity == A) /* deliver packet by calling */ A_input(pkt2give); /* appropriate entity */elseB_input(pkt2give);free(eventptr->pktptr); /* free the memory for packet */ }else if (eventptr->evtype == TIMER_INTERRUPT){if (eventptr->eventity == A)A_timerinterrupt();elseB_timerinterrupt();}else{printf("INTERNAL PANIC: unknown event type \n");}free(eventptr);}terminate:printf(" Simulator terminated at time %f\n after sending %d msgs from layer5\n",time,nsim);printf(" correctly sent pkts: %d \n", packet_correct);printf(" resent pkts: %d \n", packet_resent);system("pause");}附源代码及注释四. 实验小结通过本次试验了解了编程实现简单可靠的数据传输GBN协议,模拟了可靠数据传输理解了TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
实验报告_运算器实验

软件学院综合性、设计性实验报告书实验课程:计算机组成原理实验指导教师:实验时间:实验题目:运算器组成实验实验类型:□综合性 设计性一、实验目的:1、熟悉TEC-8模型计算机的运算器结构2、熟悉该运算器中双端口寄存器组的读写操作3、熟悉运算器的数据传送通路4、熟悉74ls181的功能,能完成给定数据的各种运算二、实验仪器设备及实验环境:1、TEC-8实验系统2、逻辑测试笔3、实验环境:组成原理实验室三、总的设计思想、实验原理等1、TEC-8实验系统中使用两片74LS181构成了8位的ALU部分,同时使用一片可编程芯片EPM7064设计出4个8位的通用寄存器供使用。
同时还有1片74LS74、1片74LS244、1片74LS245和1片74LS30构成整个运算器部分。
2、在EPM7064芯片内,包含了4个8位寄存器R0、R1、R2、R3以及两个4选1的多路选择器和1个2-4译码器。
其寄存器组为双端口读出、单端口写入模式。
3、由数据总线DBUS连接了运算器部分,总线操作及寄存器读写需要相应的控制信号及寄存器地址,选择74LS181的运算功能也需要相应控制信号。
4、手动提供数据,通过系统中编写好的运算器实验部分微程序控制完成一个确定的运算操作序列。
5、独立方式下,通过手动拨电平开关实现4的功能。
四、实验步骤设计:4.1 微程序控制方式实验步骤1、微程序控制方式下,由控制器发出控制命令控制运算器的操作,所需控制命令由微程序、微指令代码表示,并且微程序代码在控制存储器的存放已是固定的,所以其有固定的操作流程步骤。
2、将控制转换开关拨到下面“微程序”位置,打开电源,按一次复位按钮CLR,使实验系统复位。
3、指示灯µA5~µA0显示“000000”,将操作模式开关设为“1101”,准备进入运算器控制实验。
4、按一次QD按钮,进入实验过程,此时指示灯µA5~µA0显示“001011”,当前微指令要求设置数A进入R0,观测记录此时相应控制指示灯的值为:在数据开关SD7~SD0上设置数据“11110000”,在灯D7~D0上可看到所设置数据“11110000”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EL-JY-II计算机组成原理实验系统简介一、系统组成:EL-JY-II系统由两大部分组成:1、基板:本部分是8位机和16位机的公共部分,包括以下几个部分:1)数据输入和输出电路2)显示及监控电路3)脉冲源及时序电路4)数据和地址总线5)8255扩展实验电路6)单片机控制电路和键盘操作部分7)与PC机通讯的接口电路8)主存储器电路9)微代码输入及显示电路9)电源电路10)CPLD实验板(选件)11)自由实验区(面包板)2.CPU板:本板分为8位机和16位机两种,除数据总线和地址总线分别为8位和16位以外,都包括以下几个部分:1)微程序控制器2)运算器3)寄存器堆4)程序计数器5)指令寄存器6)指令译码电路7)地址寄存器8)数据和控制总线二、系统布局:系统布局分别见图1和图2。
三、使用说明及要求1.本系统分为三种实验操作方式:方式一:开关控制操作方式;方式二:键盘控制操作方式;方式三:PC机联机操作方式。
2.本系统采用正逻辑,即“1”代表高电平,“0”代表低电平;3.指示灯亮表示相应信号为高电平,熄灭表示相应信号为低电平;4.实验连线时应按如下方法:对于横排座,应使排线插头上的箭头面向自己插在横排座上;对于竖排座,应使排线插头上的箭头面向左边插在竖排座上;5.为保证实验的成功,每次实验之前均应认真阅读实验指导书,接线要按要求,确保正确无误且接触良好;6.应严格按照实验指导书的实验步骤和先后顺序进行实验,否则有可能造成实验不成功甚至损坏芯片。
方式一:开关控制操作方式:1.在各种控制信号中,有的是低电平有效,有的是高电平有效,请注意区别,具体可参见各个实验指导。
2.总线是计算机信息传输的公共通路。
为保证总线信息的正确无误,总线上每次只能有一个控制信号有效,如果同时有两个或两个以上同时有效,会产生总线竞争而造成错误甚至损坏芯片。
故每次开始实验操作时均要先使置所有控制开关电路的控制信号为“1”,高电平,对应的指示灯亮。
方式二:键盘控制操作方式:系统通电,K4开关拨到OFF,监控指示灯(数码管,以下数码管均指监控指示灯)上滚动显示【CLASS SELECt】,在该状态下,整个键盘可用键分别为:系统检测键:按下该键,数码管显示【CHESYS】,(即CHECK SYSTEM的缩写),进入系统自检程序,具体说明见后述说明。
实验选择键:按下该键,数码管显示【ES--__】,进入实验课题选择,具体说明见后述说明。
联机键:按下该键,系统进入与上位机通讯状态,当与计算机联机成功,数码管显示【Pc-Con】,最后显示【8】,表示联机通讯成功。
除了上述三个键有效外,其余按键系统均不响应。
1. 系统检测键具体操作说明:1). 当在监控指示灯显示【CLASS SELECt】时按下该键,显示变为【CHESYS】(CHECK SYSTEM),进入系统自检,此时,只要按下键盘上任意一键,数码管后两位就显示该键所对应的键盘编码,前四位显示对应电路的名称——8255。
比如我们按下2号键,对应的显示为【825502】,然后返回显示【CHESYS】;按下F 号键,对应的显示为【82550F】,然后返回显示【CHESYS】。
2). 在系统检测状态,按下【取消】键,则退出系统检测程序。
3). 对于键盘上的【0】号键和【1】键,除了显示其键盘编码外,还有第二功能:【0】键的功能说明:检测所有总线(数据总线、控制总线、微控制总线)的输出功能。
按下【0】号键后,监控指示灯显示【825500】后,约过0.5S,系统首先显示【UCDC00】,自动送“0“到所有总线,24位微代码显示数码管显示全0(如果其他两条总线连接有监视灯的话,也显示全0);此时,系统等待按【确认】键。
当按下【确认】键后,数码管显示变为【UCDCFF】,系统自动送所有总线FF,24位微代码显示数码管显示全1(如果其他两条总线连接有监视灯的话,也显示全1),此时系统等待按【取消】键退出该项功能检测。
在总线输出【00】和【FF】的时候,通过观察总线上的状态显示灯即可知道哪一条总线上的哪一位出错。
【1】键的功能说明:检测所有总线(数据总线、控制总线、微控制总线)的输入功能。
按下【1】号键后,显示【825501】后,系统等待按【确认】键,按下【确认】键后,系统显示【UC0PPP】,此时需把K4从“OFF”状态拨向“ON”状态,把开关MS1~MS24拨为全0,再次按下“确认”键,系统读入微控总线的第0组(第一个8位)的全0,如果总线出错,读入哪一个为1的话,在数码管上就位显示对应的错误位号(如果第一个(低)8位的第0位出错,则显示【UC00Er】,表示微控总线的第0组的第0位出错,UC后的第1个0表示第0组微控总线,第2个0表示第0位),如果完全正确的话,显示【UC0Cor】,约过1S,显示变为【UC1PPP】,按下【确认】键,系统检测微控总线的第1组(第二个8位)的全0,如果完全正确的话,显示【UC1Cor】,若有哪一位错误的话,错误信息显示与第一组显示相同;在显示【UC1Cor】后约1S,显示为【UC2PPP】,按下【确认】键,系统检测微控总线的第2组(第二个8位)的全0,如果完全正确的话,显示【UC2Cor】,若有哪一位错误的话,错误信息显示与第一组显示相同;当三组全检测完毕,显示变为【CHEEND】(CHECK END),约1S后,显示【OFF】,此时把K4开关拨回到OFF,则又回到系统检测最开始部分。
2. 【实验选择】键具体操作说明:当显示【CLASS SELECt】时按下该键,数码管显示变为【ES--__】,系统打开键盘,等待通过数字键盘输入实验课题代码,输入相应的课题代码后,按【确认】键进入该实验,在输入的过程中,可通过按【取消】键修改输入,在显示【ES--__】状态连续按【取消】键,即可退出实验选择功能,返回到【CLASS SELECT】状态。
实验课题与输入代码对应关系如下:实验课题输入代码及按键实验一01+确认或1+确认实验二02+确认或2+确认实验三03+确认或3+确认实验四04+确认或4+确认实验五05+确认或5+确认实验六06+确认或6+确认实验七07+确认或7+确认实验八08+确认或8+确认实验九09+确认或9+确认注意:1).在采用单片机键盘控制操作方式实验时,必须把K4开关置于【OFF】状态,否则系统处于自锁状态,无法进行实验;2).除说明了的除外,本实验方式中提到的数码管(显示)均指监控指示灯的显示。
各实验课题均相同。
3. 【联机】键说明当在数码管显示【CLASS SELECT】时按下该键,系统进入上位机监控实验状态,所有按键全都封闭,除【RST】(复位)键外,所有的实验操作全由上位机控制。
当退出联机实验状态后,系统又自动恢复到【CLASS SELECt】状态。
方式三:PC机联机操作方式。
略实验六运算器实验一、实验目的:1.掌握运算器的组成及工作原理;2.了解4位函数发生器74181的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程;3.验证带进位控制的74181的功能。
二、预习要求:1.复习本次实验所用的各种数字集成电路的性能及工作原理;2.预习实验步骤,熟悉实验时要求的注意之处。
三、实验设备:EL-JY-II型计算机组成原理实验系统一套,排线若干。
四、工作原理:运算器的结构框图见图1-5:算术逻辑单元ALU是运算器的核心。
集成电路74181是4位运算器,两片74181以并/串形式构成8位运算器。
它可以对两个八位二进制数进行多种算术或逻辑运算,74181 有高电平和低电平两种工作方式,高电平方式采用原码输入输出,低电平方式采用反码输入输出,这里采用高电平方式。
三态门74244作为输出缓冲器由ALU-G信号控制,ALU-G 为“0”时,三态门开通,此时其输出等于其输入;ALU-G 为“1”时,三态门关闭,此时其输出呈高阻。
两片74273作为两个八位数据暂存器,其控制信号分别为LDR1和LDR2,当LDR1和LDR2 为高电平有效时,在T4脉冲的前沿,总线上的数据被送入暂存器保存。
五、实验内容I、采用开关控制操作方式进行实验为了避免总线冲突,首先将控制开关电路的所有开关拨到输出高电平“1”状态,所有对应的指示灯亮。
本实验中所有控制开关拨动,相应指示灯亮代表高电平“1”,指示灯灭代表低电平“0”。
1.按图接线图接线:连线时应注意:对于横排座,应使排线插头上的箭头面向自己插在横排座上;对于竖排座,应使排线插头上的箭头面向左边插在竖排座上。
2 . 通过数据输入电路的拨开关开关向两个数据暂存器中置数:注意:本实验中ALU-G和C-G不能同时为0,否则造成总线冲突,损坏芯片!故每次实验时应时刻保持只有一路与总线相通。
1)置ALU-G=1,关闭ALU的三态门U31(74LS244),再置C-G=0,打开数据输入电路的三态门;2)向数据暂存器LT1(U27,74LS273)中置数:(1) 设置数据输入电路的数据开关“D7……D0”为想要输入的数值,如“0101 0101”;(2) 置LDR1=1,使数据暂存器LT1(U27,74LS273)的控制信号有效,置LDR2=0,使数据暂存器LT2(U28,74LS273)的控制信号无效;(3)按一下脉冲源及时序电路的【单脉冲】按钮,给暂存器LT1(U27,74LS273)送时钟,上升沿有效,把数据存在LT1中。
3)向数据暂存器LT2(U28,74LS273)中置数:(1)设置数据输入电路的数据开关“D7……D0”为想要输入的数值,如“1010 1010”;(2)置LDR1=0,数据暂存器LT1的控制信号无效,置LDR2=1,使数据暂存器LT2的控制信号有效。
(3)按一下脉冲源及时序电路的“单脉冲”按钮,给暂存器LT1(U27,74LS273)送时钟,上升沿有效,把数据存在LT2中。
(4)置LDR1=0、LDR2=0,使数据暂存器LT1、LT2的控制信号无效。
4)检验两个数据暂存器LT1和LT2中的数据是否正确:(1)置C-G=1,关闭数据输入电路的三态门,然后再置ALU-G=0,打开ALU的三态门;(2)置“S3S2S1S0M”为“11111”,数据总线显示灯显示数据暂存器LT1中的数“0101 0101”,表示往暂存器LT1置数正确;(3)置“S3S2S1S0M”为“10101”,数据总线显示灯显示数据暂存器LT2中的数“1010 1010”,表示往暂存器LT2置数正确。
3.验证74181的算术和逻辑功能:按实验步骤2往两个暂存器LT1和LT2分别存十六进制数“34H”和“B6H”,在给定LT1=34H、LT2=B6H的情况下,通过改变“S3S2S1S0MCn”的值来改变运算器的功能设置,通过数据总线指示灯显示来读出运算器的输出值F,填入下表中,参考表1-1的功能表,分析输出F值是否正确。