计算机组成实验报告_LAB5

合集下载

计算机组成实验报告

计算机组成实验报告

计算机组成实验报告
一、实验名称:计算机组成实验
二、实验人员:报告撰写人:
三、实验地点:
四、实验日期:
五、实验器材:10台废旧机(各种板卡齐全)1台新式机,几台故障机,螺丝刀等工具。

六、实验注意事项:
1.一定要断电后,再打开机箱拔插板卡。

2.不能强拔强插板卡。

3.实验完成后,将设备整理放好。

4.实验中如何有疑问举手示意不能自作主张,以免造成伤害。

七、实验目的:
1. 熟悉计算机硬件组成,了解各种板卡的功能作用。

2. 熟悉计算机外部组成,能够连接主机、显示器等硬件。

3. 能认出各种板卡会拔插板卡。

4.了解各种硬件故障及解决方法。

八、实验步骤:
1.复习回顾所学的有关计算机硬件的相关知识。

2.通过投影方式,展示计算机主机箱上的各种插孔的作用,连接显示器、键盘、鼠标等常用设备。

3.开机看效果。

然后关机断电打开机箱,先简单给学生们展示机箱内部的各种硬件(电源、显卡、声卡、CPU、内存、主板、网卡、光驱、硬盘等。

),在展示如何拔插各种板卡(注意不要强拆电源等部件)。

分成10组后指导学生实验。

实验后先让学生们组内讨论提出问题、再让有问题的学生提问,然后老师总结。

4.选取几台有故障的机子,由老师演示故障解决方法。

然后找动手能力强对计算机硬件熟悉的学生指导他完成故障的排除。

5.然后打开一台新式机,用投影让学生们找出各种板卡。

九、实验结论:
十、实验思考:
教师评语:。

计算机组成实验报告

计算机组成实验报告

计算机组成实验报告计算机组成实验报告(共3篇)篇一:《计算机组成与结构》实验报告11 .实验目的:1).学习和了解TEC-2000 十六位机监控命令的用法;2).学习和了解TEC-2000 十六位机的指令系统;3).学习简单的TEC-2000 十六位机汇编程序设计;2.实验内容:1).使用监控程序的R 命令显示/修改寄存器内容、D 命令显示存储器内容、E 命令修改存储器内容;2).使用 A 命令写一小段汇编程序,U 命令反汇编刚输入的程序,用G 命令连续运行该程序,用T、P 命令单步运行并观察程序单步执行情况;3、实验步骤1).关闭电源,将大板上的COM1 口与PC 机的串口相连;2).接通电源,在PC 机上运行PCEC.EXE 文件,设置所用PC 机的串口为“1”或“2”, 其它的设置一般不用改动,直接回车即可;3).置控制开关为00101(连续、内存读指令、组合逻辑、16 位、联机),开关拨向上方表示“1”,拨向下方表示“0”,“X”表示任意。

其它实验相同;4).按一下“RESET”按键,再按一下“START”按键,主机上显示:TEC-2000 CRT MONITOR Version 1.0 April 2001Computer Architectur Lab.,Tsinghua University Programmed by He Jia >5).用R 命令查看寄存器内容或修改寄存器的内容a.在命令行提示符状态下输入:R↙;显示寄存器的内容图片已关闭显示,点此查看图片已关闭显示,点此查看b.在命令行提示符状态下输入:R R0↙;修改寄存器R0 的内容,被修改的寄存器与所赋值之间可以无空格,也可有一个或数个空格主机显示:寄存器原值:_在该提示符下输入新的值,再用R 命令显示寄存器内容,则R0 的内容变为0036。

图片已关闭显示,点此查看6).用D 命令显示存储器内容在命令行提示符状态下输入:D 2000↙会显示从2000H 地址开始的连续128 个字的内容;连续使用不带参数的 D 命令,起始地址会自动加128(即80H)。

计算机组成原理实验报告

计算机组成原理实验报告

计算机组成原理实验报告实验目的,通过本次实验,深入了解计算机组成原理的相关知识,掌握计算机硬件的基本组成和工作原理。

实验一,逻辑门电路实验。

在本次实验中,我们学习了逻辑门电路的基本原理和实现方法。

逻辑门电路是计算机中最基本的组成部分,通过逻辑门电路可以实现各种逻辑运算,如与门、或门、非门等。

在实验中,我们通过搭建逻辑门电路并进行实际操作,深入理解了逻辑门的工作原理和逻辑运算的实现过程。

实验二,寄存器和计数器实验。

在本次实验中,我们学习了寄存器和计数器的原理和应用。

寄存器是计算机中用于存储数据的重要部件,而计数器则用于实现计数功能。

通过实验操作,我们深入了解了寄存器和计数器的内部结构和工作原理,掌握了它们在计算机中的应用方法。

实验三,存储器实验。

在实验三中,我们学习了存储器的原理和分类,了解了不同类型的存储器在计算机中的作用和应用。

通过实验操作,我们进一步加深了对存储器的认识,掌握了存储器的读写操作和数据传输原理。

实验四,指令系统实验。

在本次实验中,我们学习了计算机的指令系统,了解了指令的格式和执行过程。

通过实验操作,我们掌握了指令的编写和执行方法,加深了对指令系统的理解和应用。

实验五,CPU实验。

在实验五中,我们深入了解了计算机的中央处理器(CPU)的工作原理和结构。

通过实验操作,我们学习了CPU的各个部件的功能和相互之间的协作关系,掌握了CPU的工作过程和运行原理。

实验六,总线实验。

在本次实验中,我们学习了计算机的总线结构和工作原理。

通过实验操作,我们了解了总线的分类和各种总线的功能,掌握了总线的数据传输方式和时序控制方法。

结论:通过本次实验,我们深入了解了计算机组成原理的相关知识,掌握了计算机硬件的基本组成和工作原理。

通过实验操作,我们加深了对逻辑门电路、寄存器、计数器、存储器、指令系统、CPU和总线的理解,为进一步学习和研究计算机组成原理奠定了坚实的基础。

希望通过不断的实践和学习,能够更深入地理解和应用计算机组成原理的知识。

计算机组成结构的实验报告

计算机组成结构的实验报告

计算机组成构造的实验报告(1)中央处理器:既常说的CPU,是一台计算机的运算核心和控制核心。

主要是解释计算机指令以及处理计算机软件中的数据。

CPU最核心的功能单元是存放器.CPU的主要性能指标为字节,时钟频率和缓存.主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度。

CPU的主频与CPU实际的运算才能是没有直接关系。

当然,主频和实际的运算速度是有关的,只能说主频仅仅是CPU性能表现的一个方面,而不代表CPU的整体性能。

外频外频是CPU的基准频率,单位也是MHz。

CPU的外频决定着整块主板的运行速度。

CPU的位和字长位:在数字电路和电脑技术中采用二进制,代码只有“0”和“1”,其中无论是“0”或是“1”在CPU中都是一“位〞。

字长:电脑技术中对CPU在单位时间内(同一时间)能一次处理的二进制数的位数叫字长。

所以能处理字长为8位数据的CPU通常就叫8位的CPU。

同理32位的CPU就能在单位时间内处理字长为32位的二进制数据。

字节和字长的区别:由于常用的英文字符用8位二进制就可以表示,所以通常就将8位称为一个字节。

字长的长度是不固定的,对于不同的CPU、字长的长度也不一样。

8位的CPU一次只能处理一个字节,而32位的CPU一次就能处理4个字节,同理字长为64位的CPU一次可以处理8个字节。

缓存大小也是CPU的重要指标之一,而且缓存的构造和大小对CPU速度的影响非常大,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。

实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内存或者硬盘上寻找,以此进步系统性能。

但是由于CPU芯片面积和本钱的因素来考虑,缓存都很小。

(2)存储器:由随机存储器(RAM)和只读存储器(ROM)组成. 内存又叫内部存储器〔RAM〕,有DDR、DDR II、DDR III三大类,容量1-8GB。

计算机组成原理 实验报告

计算机组成原理 实验报告

计算机组成原理实验报告计算机组成原理实验报告引言:计算机组成原理是计算机科学与技术专业的重要课程,通过学习该课程,我们可以深入了解计算机的工作原理和内部结构。

本次实验旨在通过实际操作,加深对计算机组成原理的理解,并掌握一些基本的计算机硬件知识。

实验目的:1. 理解计算机的基本组成部分,包括中央处理器(CPU)、存储器、输入输出设备等;2. 掌握计算机的运行原理,了解指令的执行过程;3. 学习使用计算机组成原理实验箱,进行实际的硬件连接和操作。

实验过程:1. 实验一:组装计算机本次实验中,我们需要从零开始组装一台计算机。

首先,我们按照实验指导书的要求,选择合适的硬件组件,包括主板、CPU、内存、硬盘等。

然后,我们将这些硬件组件逐一安装到计算机箱中,并连接好电源线、数据线等。

最后,我们将显示器、键盘、鼠标等外设连接到计算机上。

2. 实验二:安装操作系统在计算机组装完成后,我们需要安装操作系统。

本次实验中,我们选择了Windows 10作为操作系统。

首先,我们将Windows 10安装盘插入计算机的光驱中,并重启计算机。

然后,按照安装向导的指引,选择安装语言、时区等相关设置。

最后,我们根据自己的需求选择安装方式,并等待操作系统安装完成。

3. 实验三:编写并执行简单的汇编程序在计算机组装和操作系统安装完成后,我们需要进行一些简单的编程实验。

本次实验中,我们选择了汇编语言作为编程工具。

首先,我们编写了一个简单的汇编程序,实现两个数相加的功能。

然后,我们使用汇编器将程序翻译成机器码,并将其加载到计算机的内存中。

最后,我们通过调试器来执行这个程序,并观察程序的执行结果。

实验结果与分析:通过本次实验,我们成功地组装了一台计算机,并安装了操作系统。

在编写并执行汇编程序的实验中,我们也成功地实现了两个数相加的功能。

通过观察程序的执行结果,我们发现计算机能够按照指令的顺序逐条执行,并得到正确的结果。

这进一步加深了我们对计算机的工作原理的理解。

计算机组成原理实验报告

计算机组成原理实验报告

计算机组成原理实验报告
实验目的:
本实验的目的是通过进行计算机组成原理实验,深入理解计算机的基本组成和工作原理,掌握计算机硬件与软件之间的协同工作方式。

实验设备:
1. 计算机主机
2. 键盘
3. 鼠标
4. 显示器
实验步骤:
1. 打开计算机主机,并接通电源。

2. 等待计算机启动完毕,进入操作系统界面。

3. 输入用户名和密码,登录系统。

4. 在桌面上打开文本编辑器,并新建一个文档。

5. 在文档中输入一段文字,并保存文件。

6. 打开浏览器,进入互联网页面。

7. 在浏览器中输入搜索词语,并点击搜索按钮。

8. 查看搜索结果,并点击其中一个链接。

9. 在打开的页面上点击按钮或链接,进行相应操作。

10. 关闭浏览器。

11. 关闭文本编辑器,保存文档。

12. 关闭计算机主机。

实验结果:
通过完成以上步骤,我们成功地进行了计算机组成原理实验。

在电脑启动后,我们登录系统并使用了各种软件和外部设备。

计算机可以顺利地接收我们的指令,并作出相应的操作。

我们也能够通过互联网浏览页面,并进行搜索和点击链接操作。

实验总结:
通过本次实验,我们更加深入地理解了计算机的组成和工作原理。

计算机是由硬件和软件组成,硬件包括主机、键盘、鼠标、显示器等,软件包括操作系统、文本编辑器、浏览器等。

计算机的各个组件通过协同工作,实现了我们对计算和信息的处理。

掌握计算机组成原理对于我们更好地使用计算机和理解计算机科学的发展趋势具有重要意义。

计算机组装上机实验5篇

计算机组装上机实验5篇

计算机组装上机实验5篇第一篇:计算机组装上机实验计算机组装实验/实训内容实验一:认识计算机系统各个硬件及外设实验目的:了解计算机系统各个硬件的外形、特征实验重点:掌握各个部件在机箱内的位置实验难点:各个部件的防接错特征实验步骤:1.用螺丝刀拆卸计算机各个硬件,注意轻拿轻放,保护好螺丝不要丢失2.根据学过的每个硬件的知识观察各个硬件的外形、特征3.观察每个硬件在机箱里的位置4、写出实验心得体会实验二:AMD,Intel CPU编号识别实验目的:了解AMD,Intel CPU外形、接口特征实验重点:AMD,Intel CPU编号的辨别实验难点:AMD,Intel CPU的防接错特征实验步骤:1、根据每个人的电脑内的CPU来分别辨别不同厂商的CPU、型号、接口类型2、观察AMD及Intel CPU 外形、接口特征3、在实验报告上写出自己的CPU 厂商、型号、接口类型实验三:AMD,Intel CPU和风扇的安装实验目的:掌握AMD,Intel CPU的安装方法实验重点:AMD,Intel CPU安装方法实验难点:AMD,Intel CPU的防接错特征实验步骤:1、根据每个人的电脑内的CPU来分别辨别不同厂商的CPU、型号、接口类型2、观察AMD及Intel CPU 外形、接口特征3、安装AMD或Intel CPU到主板的CPU插槽上,同时安装散热风扇实验四:认识主板的结构实验目的:了解AMD,Intel CPU外形、接口特征实验重点:AMD,Intel CPU编号的辨别实验难点:AMD,Intel CPU的防接错特征实验步骤:2、根据每个人的电脑内的CPU来分别辨别不同厂商的CPU、型号、接口类型2、观察AMD及Intel CPU 外形、接口特征3、在实验报告上写出自己的CPU 厂商、型号、接口类型实验四:认识主板的结构实验目的:了解主板的结构和组成原理实验重点:主板上各个元器件的识别实验难点:主板上每个电子元器件的位置及特征实验步骤:1、观察自己的主机内的主板的厂商、型号2、观察主板上的各个电子元器件,能指出其名字3、观察南北桥芯片组及各种外设接口实验六:主板驱动程序的安装实验目的:掌握主板驱动程序的安装过程实验重点:不同主板的驱动安装实验难点:找到对应的主板驱动程序实验步骤:1、通过优化大师查看自己的主板的型号及厂商2、下载驱动程序或把主板光盘自带的驱动程序放入光驱3、安装驱动程序,重启实验七:内存的识别及参数测试实验目的:了解内存的外形、接口特征实验重点:内存的安装实验难点:参数的测试实验步骤:1、根据每个人的电脑内存来分别辨别不同厂商的内存型号、接口方式2、观察不同类型的内存的外形、接口特征3、在实验报告上写出自己的内存厂商、型号、接口类型及容量4.用内存测试工具软件Hwinfo32测试内存,观察内存的参数指标实验八:主流硬盘的编号参数识别实验目的:了解主流硬盘的编号参数和接口类型实验重点:主流硬盘的编号识别实验难点:硬盘的接口连接实验步骤:1、根据每个人的电脑硬盘来分别辨别不同厂商的硬盘型号、容量、接口方式2、观察不同类型的硬盘的外形、接口特征3、在实验报告上写出自己的硬盘的厂商、型号、接口类型及容量实验九:电源各种引线接口的连接实验目的:了解电源中各种引线的接口及连接设备实验重点:电源的引线连接到设备中实验难点:电源的安装实验步骤:1、根据每个人的电脑电源来分别辨别不同厂商的电源型号、引线的接口2、观察不同类型的电源的外形、接口特征3、在实验报告上写出自己的电源的厂商及接口的阵脚数实验十:键盘和鼠标的安装实验目的:掌握键盘和鼠标的安装方式实验重点:键盘鼠标的安装实验难点:接口的识别实验步骤:1、根据每个人的电脑键盘和鼠标来分别辨别不同厂商的键盘和鼠标的类型和厂商2、观察键盘和鼠标的外形、接口特征3、在实验报告上写出自己的键盘和鼠标的生产厂商及接口方式实验十一:显示器的相关设置实验目的:掌握显示器的菜单设置实验重点:对于分辨率、语言、对比度、亮度的设置实验难点:显示器的水纹、消磁功能的设置实验步骤:1、根据每个人的显示器的类型来辨别不同厂商的显示器的类型2、观察显示期的种类、接口特征、及厂商3、在实验报告上写出自己的显示器的生产厂商及类型4、运用显示器上的主菜单设置语言、对比度、亮度、尺寸、消磁、水纹等功能实验十二:计算机组装实训实验目的:掌握计算机中各种硬件的组装和连线实验重点:计算机中各种硬件的组装实验难点:各种硬件的数据及电源线连接实验步骤:1、把各种硬件按照组装的步骤把每个硬件按照到主板上固定好主板到机箱上2、注意螺丝不要拧死,硬件安装到位3、连接各种数据线和电源线4、连接外设5、通电检测6、排除故障实验十三:OFFICE 2003的安装与删除实验目的:掌握office2003的安装与删除的方法实验重点:office2003安装的步骤及目录实验难点:安装时有选择的安装软件实验步骤:1、把准备好的OFFICE 2003安装程序通过开始菜单----控制面板—添加删除程序2、如果是.EXE程序直接安装到制定的目录3、打开各个程序看看程序安装是否正确4、删除OFFICE 2003软件实验十四:OFFICE 2003的安装与删除实验目的:掌握office2003的安装与删除的方法实验重点:office2003安装的步骤及目录实验难点:安装时有选择的安装软件实验步骤:4、把准备好的OFFICE 2003安装程序通过开始菜单----控制面板—添加删除程序5、如果是.EXE程序直接安装到制定的目录6、打开各个程序看看程序安装是否正确4、删除OFFICE 2003软件第二篇:计算机组装上机实验报告西安邮电大学计算机装配调试上机实习报告书系部名称:学生姓名:专业班级:学号:指导教师:计算机学院网络实习时间: 2014年12月22日至2014年12月26 日上机实习报告一、实习任务目标帮助我们了解计算机的组成以及性能,还有能对计算机进行基本的操作。

计算机组成原理实验报告

计算机组成原理实验报告

计算机组成原理实验报告计算机组成原理实验报告姓名:专业:计算机科学与技术学号:计算机组成原理实验(⼀)实验题⽬:时标系统的设置和组合成绩:⼀、实验⽬的1、了解时标系统的作⽤2、会设计、组装简单的时标发⽣器⼆、实验内容参照时标系统的设计⽅法,⽤组合逻辑⽅法设计⼀个简单的节拍脉冲发⽣器,产⽣图1-6所⽰的节拍脉冲,并⽤单脉冲验证设计的正确性。

在实验报告中画出完整电路,写出1W 、0W 和1N 的表达式。

图1-6 简单的节拍脉冲发⽣器⼀周期的波形设计提⽰:1、由波形图求出节拍脉冲1W 和0W 的表达式,进⽽组合成1N 的表达式。

2、注意节拍电平1T 和0T 的翻转时刻应在0M 下降沿与M 的上升沿同时出现的时刻。

3、注意D 触发器的触发翻转要求。

三、实验仪器及器材1、计算机组成原理实验台和+5V 直流稳压电源2、集成电路由附录A “集成电路清单”内选⽤四、实验电路原理(实验电路原理图)时标系统主要由时钟脉冲发⽣器、启停电路和节拍脉冲发⽣器三部分组成成,结构如图1-1所⽰。

图1-1 时标系统组成1、时钟脉冲发⽣器主要由振荡电路、分频电路组成,其作⽤是产⽣⼀定频率的时钟脉冲,作为计算机中基准时钟信号。

如图1-2所⽰。

图1-2 时钟脉冲发⽣器组成2、启停电路计算机是靠⾮常严格的节拍脉冲,按时间的先后次序⼀步⼀步地控制各部件⼯作的,所以,机器启停的标志是有⽆节拍脉冲,⽽控制节拍脉冲按⼀定的时序发⽣和停⽌,不能简单地⽤电源开关来实现。

如图1-3所⽰。

图1-3 简单的启停电路为了使机器可靠地⼯作,要求启停电路在机器启动或停机时,保证每次从规定的第⼀个脉冲开始启动,到最后⼀个脉冲结束才停机,并且必须保证第⼀个和最后⼀个脉冲的波形完整。

如图1-4所⽰。

图1-4 利⽤维持阻塞原理的启停电路3、节拍脉冲发⽣器节拍脉冲发⽣器的作⽤是产⽣⼀序列的节拍电平和⼯作脉冲。

节拍电平是保证计算机微操作的时序性,⼯作脉冲是各寄存器数据的打⼊脉冲。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机组成实验五——简单的类MIPS单周期处理器实现生命科学技术学院5110809XXX大豆比目录1OVERVIEW (1)1.1实验名称 (1)1.2实验目的 (1)1.3实验范围 (1)1.4注意事项 (1)2实验描述 (2)2.1新建工程 (2)2.2顶层模块Top (5)2.2.1模块描述 (5)2.2.2新建模块源文件Top.v (5)2.2.3定义信号线 (5)2.2.4程序计数器PC (6)2.2.5RESET (6)2.2.6模块实例化,连接模块 (7)2.2.7连接其他信号线 (8)3仿真测试 (10)3.1编写二进制测试程序 (10)3.2初始化存储器 (10)3.3编辑testbench文件 (11)3.4仿真测试,观察波形 (11)4下载验证 (12)4.1修改Top.v中Top模块的输入输出端口 (12)4.2编辑管脚约束文件top.ucf (12)4.3时钟分频 (12)4.4指定输入输出端口的意义 (13)5实验感想与建议 (14)5.1实验感想 (14)5.2一些建议 (14)6实验程序源代码 (15)6.1Top.v (15)6.2Ctr.v (18)6.3Alu.v (21)6.4AluCtr.v (22)6.5data_memory.v (23)6.6register.v (25)6.7signext.v (27)6.8inst_memory.v (27)6.9timeDivider.v (28)1.OVERVIEW11.1实验名称简单的类MIPS单周期处理器实现-整体调试1.2实验目的完成单周期的类MIPS处理器1.3实验范围本次实验将覆盖以下范围1、ISE的使用2、Xilinx Spartan3E实验板的使用3、使用VerilogHDL进行逻辑设计4、仿真测试、下载验证1.4注意事项本实验的逻辑设计工具为Xilinx ISE13.4。

2.1新建工程1、启动ISE13.4;2、新建工程lab5;3、选择FPGA型号、综合和仿真工具、描述语言等配置;4、右键点击Hierarchy窗口,添加已有模块。

有:Ctr.v、Alu.v、AluCtr.v、data_memory.v、register.v、signext.v六个文件(之前两个实验完成)。

5、Adding Source Files...中,选中全部要添加的文件,保持默认项,点OK。

2.2顶层模块Top2.2.1模块描述MIPS单周期处理器原理图2.2.2新建模块源文件Top.v下图的例子是已经下载至板子验证过的,故输入和输出有1个时钟(mainClock)、4个开关([3:0]SWITCH)和8个LED灯([7:0]LED)。

2.2.3定义信号线给Top模块内的每一根连接的信号线命名,并在top模块中声明它们。

2.2.4程序计数器PC程序计数器是这个简单CPU能够跑起来的关键。

定义一个32位reg类型PC,在时钟上升沿做PC<=PC+4。

//定义PC//初始化PC为0//在时钟的上升沿根据不同情况对PC赋值2.2.5RESET当RESET为1时,PC置0,各寄存器清零。

要达成上述功能,就需要适当修改之前实验的各个模块,给模块添加reset信号。

以下以data_memory模块为例,演示reset信号的加入和功能实现。

1、在data_memory模块的定义中加入输入信号reset:2、在always模块中添加初始化代码在这一步中需要注意的是,对数据初始化的操作必须在原来数据赋值的always模块中进行,否则上板时会失败(不允许同一个变量在两个模块中赋值)。

2.2.6模块实例化,连接模块实例化前两次实验中编写的模块,实例化的过程中连接模块的端口。

本实验在实例化过程中采用的是如下方法:在连接时用“.”符号,表明原模块是定义时规定的端口名:模块模块名(.端口1(信号1),.端口2(信号2))下面是本工程文件所有实例化对象和端口连接的代码:2.2.7连接其他信号线MUXMux可以用一个三目运算符来实现。

2.实验描述9在Top.v中Mux的实现代码如下:OUT1:OUT2:OUT3:OUT4:OUT5:3.1编写二进制测试程序由于处理器是从指令内存inst_memory中读取指令,依次执行的,所以程序保存在指令内存中。

以下是测试程序的指令:00001000000000000000000000000100//j a00000000000000000000000000000000//nop00000000000000000000000000000000//nop00000000000000000000000000000000//nop10101100000001000000000000000000//sw$40($0)10101100000000110000000000000100//sw$34($0)10001100000000010000000000000100//lw$14($0)10001100000000100000000000000000//lw$20($0)00000000001000100001100000100000//add$3,$1,$200000000001000100010000000100010//sub$4,$1,$200001000000000000000000000000100//j a3.2初始化存储器$readmemb和$readmemh这两个系统任务用来从文件中读取数据到存储器中,代码编写放在存储器的initial初始化块中。

data_memory中:register中:inst_memory中:注意:在仿真测试时,初始化不完全并不会对波形造成影响,但是如果要上板子,则需对变量中的每一位进行赋值,否则会产生一个warning,提示你进行了部分初始化,系统默认会将你的初始化操作忽略从而产生错误。

3.3编辑testbench文件这里添加了时钟激励,200ns为一个时钟周期。

3.4仿真测试,观察波形对照自己的测试程序可知,波形正确,仿真成功。

4.1修改Top.v中Top模块的输入输出端口之前有提到过,上板子时,输入输出要做些变化。

如下图Top模块的输入输出直接被改为一个时钟、四个开关和八个LED灯。

4.2编辑管脚约束文件top.ucf将输入输出端口与物理管脚连接起来,如下:4.3时钟分频由于板子晶振提供的时钟频率速度较高,需要对时钟进行分频,所以自己定义了一个TimeDivider模块来实现,是由实验二中的TimeDivider模块做简单修改而来。

这里将buffer和clockOut做了一个初始化为0,是为了上板子的需要。

另外将clockOut<=&buffer改为clockOut<=buffer[24]可以使得到的时钟周期波形更加理想。

如不改,则clockOut在绝大多数时间为0,只有在1/225的时间才为1,做此修改后,clockOut为0和1的时间各占一半,波形较理想,易于观察。

4.4指定输入输出端口的意义前面4.1对Top模块的定义时,只有1个时钟、4个开关和8个LED灯,而没有指定他们分别表示什么。

所以接下来我们需要定义这4个开关和8个LED灯所对应的信号。

//开关3为reset信号//开关2,开关1,开关0的状态分别是关、关、开的时候即001时,LED灯显示第一个寄存器的后8位数据;//开关2,开关1,开关0的状态分别是关、开、关的时候即010时,LED灯显示第二个寄存器的后8位数据;//开关2,开关1,开关0的状态分别是关、开、开的时候即011时,LED灯显示第三个寄存器的后8位数据;//开关2,开关1,开关0的状态分别是开、关、关的时候即100时,LED灯显示第四个寄存器的后8位数据;//开关2,开关1,开关0的状态分别是关、关、开的时候即001时,LED灯显示指令寄存器的后8位数据;//开关2,开关1,开关0的状态是除上面说明的五种情况以外时,LED灯显示PC寄存器的后8位数据;4.5生成二进制流文件,下载至板子点击Generate Programming File,生成完成后,下载至板子验证。

经实际操作验证,程序有效,上板子成功!5.实验感想与建议145.1实验感想Lab5是对Lab3和Lab4的一个综合,通过新定义的模块Top来实现一个简单的类MIPS 单周期处理器。

在老师所给的实验指导书中,省略了很多细节,有很多细节代码需要自己去编写,需要自己对着原理图思考。

但是所幸前几个实验让我们对Verilog和FPGA有了一个粗浅的认识,使得自己拥有了初步自己思考和编写代码的能力。

窃以为这样一步一步走向深入的方法是非常不错的!比我们本专业的实验设计要合理得多!希望老师能够继续保持,实验课能够越办越好。

不得不提的是在板子上验证这一环节占用了我整个Lab5编写的大半时间,这主要是由于我之前对Verilog的代码编写只是依葫芦画瓢,而不得其要领所致。

花了很多的时间重新编写Lab5的代码部分,主要是因为阻塞赋值和非阻塞赋值的理解不够深刻,导致整个程序翻译成二进制流文件时一直报错。

之后通过百度,知道了对这两种赋值的一般处理方法,才解决了此问题。

总之,上板子遇到的问题要比仿真多得多……最后还是感谢老师让我将板子带回宿舍自行调试,我才最终完成了板子调试这部分的工作,也算了却我一个心结。

5.2一些建议本次实验结束,由于作为一名大四学生琐事缠身也无力进行下一个实验,虽然本人对下一个实验也是充满期待,在此也是表达一下遗憾之情。

以下就是本人关于计算机组成实验的一些建议:1、在实验初期时即说明板子可外借,其实本人Lab5波形仿真早已成功,只是板子验证实验花去过多时间而无法进行Lab6实验,直到老师借本人一个板子,才完成了板子验证实验。

2、实验指导文件中多一些要实现的功能的描述。

在本次实验中,本人就是一直纠结reset 要实现何种功能而耽误许多时间,也许这是本实验高度开放性的体现,但本人还是希望有一个较明确的目标比较容易实现。

在这几个星期的实验中,多谢老师的悉心指导和给予的宽松的实验环境。

谢谢老师!6.1Top.v////////////////////////////////////////////////////////////////////////////////// module Top(input mainClock,input[3:0]SWITCH,output reg[7:0]LED);reg[31:0]PC;wire clk,reset,REG_DST,JUMP,BRANCH,MEM_READ,MEM_TO_REG,MEM_WRITE,ALU_SRC,REG_WRITE,ZERO;wire[1:0]ALU_OP;wire[3:0]ALU_CTR;wire[31:0]INST;wire[31:0]ALU_RES;wire[31:0]DATA;wire[31:0]READ_DATA;wire[31:0]READ_DATA1;wire[31:0]READ_DATA2;wire[4:0]OUT1;wire[31:0]OUT2;wire[31:0]OUT3;wire[31:0]OUT4;wire[31:0]OUT5;wire[7:0]REG1;wire[7:0]REG2;wire[7:0]REG3;wire[7:0]REG4;initialbeginPC=0;endtimeDivider mainTimeDivider(.clockIn(mainClock),.clockOut(clk));Ctr mainCtr(.reset(reset),.opCode(INST[31:26]),.regDst(REG_DST),.jump(JUMP),.branch(BRANCH),.memRead(MEM_READ),.memToReg(MEM_TO_REG),.aluOp(ALU_OP),.memWrite(MEM_WRITE),.aluSrc(ALU_SRC),.regWrite(REG_WRITE));Alu mainAlu(.reset(reset),.input1(READ_DATA1),.input2(OUT2),.aluCtr(ALU_CTR),.zero(ZERO),.aluRes(ALU_RES));AluCtr mainALuCtr(.reset(reset),.aluOp(ALU_OP),.funct(INST[5:0]),.aluCtr(ALU_CTR));data_memory mainDataMemory(.clock_in(clk),.reset(reset),.address(ALU_RES),.writeData(READ_DATA2),.memWrite(MEM_WRITE),.memRead(MEM_READ),.readData(READ_DATA)); register mainRegister(.clock_in(clk),.reset(reset),.readReg1(INST[25:21]),.readReg2(INST[20:16]),.writeReg(OUT1),.writeData(OUT3),.regWrite(REG_WRITE),.readData1(READ_DATA1),.readData2(READ_DATA2),.register1(REG1),//.register2(REG2),//.register3(REG3),//.register4(REG4));//signext mainSignExt(.inst(INST[15:0]),.data(DATA),.reset(reset));inst_memory mainInstMemory(.reset(reset),.readAddress(PC),.inst(INST));assign OUT1=REG_DST?INST[15:11]:INST[20:16];assign OUT2=ALU_SRC?DATA:READ_DATA2;assign OUT3=MEM_TO_REG?READ_DATA:ALU_RES;assign OUT4=(ZERO&&BRANCH)?((DATA<<2)+PC+4):(PC+4);assign OUT5=JUMP?(PC+4)&32'b111100000000000000000000|(INST[25:0]<<2): OUT4;assign reset=SWITCH[3];//assign LED=(SWITCH[2]&&SWITCH[1]&&SWITCH[0])?INST[7:0]:PC[7:0];alwaysbegincase(SWITCH[2:0])3'b001:LED=REG1;3'b010:LED=REG2;3'b011:LED=REG3;3'b100:LED=REG4;3'b111:LED=INST[7:0];default:LED=PC[7:0];endcaseendalways@(posedge clk)beginif(reset)PC<=0;//else if(ZERO&BRANCH)PC<=OUT4;else if(JUMP)PC<=OUT5;elsePC<=PC+4;endendmodule6.2Ctr.v////////////////////////////////////////////////////////////////////////////////// module Ctr(input reset,input[5:0]opCode,output reg regDst,output reg aluSrc,output reg memToReg,output reg regWrite,output reg memRead,output reg memWrite,output reg branch,output reg[1:0]aluOp,output reg jump);always@(opCode or reset)beginif(reset)beginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluOp=2'b00;jump=0;endelsecase(opCode)6'b000010://jumpbeginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluOp=2'b00;jump=1;end6'b000000://R typebeginregDst=1;aluSrc=0;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;aluOp=2'b10;jump=0;end6'b100011://lwbeginregDst=0;aluSrc=1;memToReg=1;regWrite=1;memRead=1;memWrite=0;branch=0;aluOp=2'b00;jump=0;end6'b101011://sw beginregDst=1'bx;aluSrc=1;memToReg=1'bx;regWrite=0;memRead=0;memWrite=1;branch=0;aluOp=2'b00;jump=0;end6'b000100://beq beginregDst=1'bx;aluSrc=0;memToReg=1'bx;regWrite=0;memRead=0;memWrite=0;branch=1;aluOp=2'b00;jump=1;enddefault:beginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluOp=2'b00;jump=0;endendcaseendendmodule6.3Alu.v////////////////////////////////////////////////////////////////////////////////// module Alu(input reset,input[31:0]input1,input[31:0]input2,input[3:0]aluCtr,output reg zero,output reg[31:0]aluRes);always@(input1or input2or aluCtr or reset)////beginif(reset)////begin////zero=0;////aluRes=0;////end////else if(aluCtr==4'b0010)//addaluRes=input1+input2;else if(aluCtr==4'b0110)//subtractbeginaluRes=input1-input2;if(aluRes==0)zero=1;elsezero=0;endelse if(aluCtr==4'b0000)//andaluRes=input1&input2;else if(aluCtr==4'b0001)//oraluRes=input1|input2;else if(aluCtr==4'b0111)//sltbeginif(input1<input2)aluRes=1;elsealuRes=0;endelse if(aluCtr==4'b1100)//noraluRes=~(input1|input2);endendmodule6.4AluCtr.v////////////////////////////////////////////////////////////////////////////////// module AluCtr(input reset,////input[1:0]aluOp,input[5:0]funct,output reg[3:0]aluCtr);always@(aluOp or funct or reset)if(reset)////aluCtr=0;////else////begin////casex({aluOp,funct})8'b00xxxxxx://lw swaluCtr=4'b0010;8'b01xxxxxx://beqaluCtr=4'b0110;8'b10100000://R-type addaluCtr=4'b0010;8'b10100010://R-type subtractaluCtr=4'b0110;8'b10100100://R-type andaluCtr=4'b0000;8'b10100101://R-type oraluCtr=4'b0001;8'b10101010://R-type sltaluCtr=4'b0111;endcaseend////endmodule6.5data_memory.v//////////////////////////////////////////////////////////////////////////////////module data_memory(input clock_in,input reset,input[31:0]address,input[31:0]writeData,input memWrite,input memRead,output reg[31:0]readData);reg[31:0]memFile[15:0];//memory space:16*32bitsinitialbeginmemFile[0]=32'b00000000000000000000000000000000;memFile[1]=32'b00000000000000000000000000000001;memFile[2]=32'b00000000000000000000000000000010;memFile[3]=32'b00000000000000000000000000000011;memFile[4]=32'b00000000000000000000000000000100;memFile[5]=32'b00000000000000000000000000000101;memFile[6]=32'b00000000000000000000000000000110;memFile[7]=32'b00000000000000000000000000000111;memFile[8]=32'b00000000000000000000000000001000;memFile[9]=32'b00000000000000000000000000001001;memFile[10]=32'b00000000000000000000000000001010;memFile[11]=32'b00000000000000000000000000001011;memFile[12]=32'b00000000000000000000000000001100;memFile[13]=32'b00000000000000000000000000001101;memFile[14]=32'b00000000000000000000000000001110;memFile[15]=32'b00000000000000000000000000001111;//$readmemh("./src/mem_data.txt",memFile,10'h0);endalways@(memRead or address or reset)////beginif(reset)readData=0;else if(memRead)readData=memFile[address>>2];endalways@(negedge clock_in)beginif(reset)////beginmemFile[0]<=32'b00000000000000000000000000000000;memFile[1]<=32'b00000000000000000000000000000001;memFile[2]<=32'b00000000000000000000000000000010;memFile[3]<=32'b00000000000000000000000000000011;memFile[4]<=32'b00000000000000000000000000000100;memFile[5]<=32'b00000000000000000000000000000101;memFile[6]<=32'b00000000000000000000000000000110;memFile[7]<=32'b00000000000000000000000000000111;memFile[8]<=32'b00000000000000000000000000001000;memFile[9]<=32'b00000000000000000000000000001001;memFile[10]<=32'b00000000000000000000000000001010;memFile[11]<=32'b00000000000000000000000000001011;memFile[12]<=32'b00000000000000000000000000001100;memFile[13]<=32'b00000000000000000000000000001101;memFile[14]<=32'b00000000000000000000000000001110;memFile[15]<=32'b00000000000000000000000000001111;//$readmemh("./src/mem_data.txt",memFile,10'h0);endelse if(memWrite)memFile[address>>2]<=writeData;endendmodule6.6register.v//////////////////////////////////////////////////////////////////////////////////module register(input clock_in,input reset,/////////input[25:21]readReg1,input[20:16]readReg2,input[4:0]writeReg,input[31:0]writeData,input regWrite,output reg[31:0]readData1,output reg[31:0]readData2,output[7:0]register1,//output[7:0]register2,//output[7:0]register3,//output[7:0]register4//);reg[31:0]regFile[15:0];//register space:16*32bitsinitialbeginregFile[0]=32'b00000000000000000000000000000000;regFile[1]=32'b00000000000000000000000000000001;regFile[2]=32'b00000000000000000000000000000010;regFile[3]=32'b00000000000000000000000000000011;regFile[4]=32'b00000000000000000000000000000100;regFile[5]=32'b00000000000000000000000000000101;regFile[6]=32'b00000000000000000000000000000110;regFile[7]=32'b00000000000000000000000000000111;regFile[8]=32'b00000000000000000000000000001000;regFile[9]=32'b00000000000000000000000000001001;regFile[10]=32'b00000000000000000000000000001010;regFile[11]=32'b00000000000000000000000000001011;regFile[12]=32'b00000000000000000000000000001100;regFile[13]=32'b00000000000000000000000000001101;regFile[14]=32'b00000000000000000000000000001110;regFile[15]=32'b00000000000000000000000000001111;//$readmemh("./src/reg_file.txt",regFile,8'h0);endassign register1=regFile[1][7:0];///assign register2=regFile[2][7:0];///assign register3=regFile[3][7:0];///assign register4=regFile[4][7:0];///always@(readReg1or readReg2or writeReg or writeData or reset)/// beginif(reset)beginreadData1=0;readData2=0;endelsebeginreadData1=regFile[readReg1];readData2=regFile[readReg2];////endendalways@(negedge clock_in)beginif(reset)beginregFile[0]<=32'b00000000000000000000000000000000;regFile[1]<=32'b00000000000000000000000000000001;regFile[2]<=32'b00000000000000000000000000000010;regFile[3]<=32'b00000000000000000000000000000011;regFile[4]<=32'b00000000000000000000000000000100;regFile[5]<=32'b00000000000000000000000000000101;regFile[6]<=32'b00000000000000000000000000000110;regFile[7]<=32'b00000000000000000000000000000111;regFile[8]<=32'b00000000000000000000000000001000;regFile[9]<=32'b00000000000000000000000000001001;regFile[10]<=32'b00000000000000000000000000001010;regFile[11]<=32'b00000000000000000000000000001011;regFile[12]<=32'b00000000000000000000000000001100;regFile[13]<=32'b00000000000000000000000000001101;regFile[14]<=32'b00000000000000000000000000001110;regFile[15]<=32'b00000000000000000000000000001111;//$readmemh("./src/reg_file.txt",regFile,8'h0);/*readData1=0;readData2=0;*/endelsebeginif(regWrite)regFile[writeReg]<=writeData;endendendmodule6.7signext.v////////////////////////////////////////////////////////////////////////////////// module signext(input[15:0]inst,input reset,////output reg[31:0]data);always@(inst or reset)////beginif(reset)////data=0;////else if(inst[15]==1)////data={16'b1111111111111111,inst};elsedata={16'b0000000000000000,inst};endendmodule6.8inst_memory.v////////////////////////////////////////////////////////////////////////////////// module inst_memory(input reset,input[31:0]readAddress,output reg[31:0]inst);reg[31:0]instMemFile[0:15];//memory space:16*32bitsinitialbegininstMemFile[0]=32'b00001000000000000000000000000100;//j ainstMemFile[1]=32'b00000000000000000000000000000000;//nopinstMemFile[2]=32'b00000000000000000000000000000000;//nopinstMemFile[3]=32'b00000000000000000000000000000000;//nopinstMemFile[4]=32'b10101100000001000000000000000000;//sw$40($0)instMemFile[5]=32'b10101100000000110000000000000100;//sw$34($0)instMemFile[6]=32'b10001100000000010000000000000100;//lw$14($0)instMemFile[7]=32'b10001100000000100000000000000000;//lw$20($0)instMemFile[8]=32'b00000000001000100001100000100000;//add$3,$1,$2instMemFile[9]=32'b00000000001000100010000000100010;//sub$4,$1,$2instMemFile[10]=32'b00001000000000000000000000000100;//j ainstMemFile[11]=32'b00000000000000000000000000000000;//nopinstMemFile[12]=32'b00000000000000000000000000000000;//nopinstMemFile[13]=32'b00000000000000000000000000000000;//nopinstMemFile[14]=32'b00000000000000000000000000000000;//nopinstMemFile[15]=32'b00000000000000000000000000000000;//nop//$readmemb("./src/mem_inst.txt",instMemFile,32'b0);endalways@(readAddress or reset)beginif(reset)inst=0;elseinst=instMemFile[readAddress>>2];////readAddress/4endendmodule6.9timeDivider.v//////////////////////////////////////////////////////////////////////////////////module timeDivider(input clockIn,6.实验程序源代码29output reg clockOut);reg[24:0]buffer;////initial beginbuffer=0;clockOut=0;/////endalways@(posedge clockIn)beginbuffer<=buffer+1;clockOut<=buffer[24];endendmodule。

相关文档
最新文档