2022山东大学软件学院计算机组成与课程设计(计组课设)分享&防踩坑

目录

课程主要内容

课程时间:

学分:

小Tips:

经验分享:

关于地址写入的简单介绍

关于脉冲速度调节

关于清零端的问题

踩坑注意事项:

一些具体实验器件的介绍:

总图的介绍:

选择器:

IR指令寄存器

uPC :

MDR:

三态门:

PC:

ALU和寄存器Z:

CVNZ的实现:

一些具体流程的介绍:

取值周期:

LOAD周期:

ADD周期:

STORE周期:

HALT:



课程主要内容

计算机组成与课程设计是山东大学软件学院在大二下面向软件工程专业的同学开设的一门主要偏向实践的课程。目的是通过该课程设计的学习,运用所学的计算机原理知识,设计一台模型机,从而更加深刻理解计算机的工作原理。

课程时间:

上课时间1-9周,其中第9周为答疑时间。最迟不超过13周(也有可能是12周)完成所有实验。

PS: 由于疫情关系,导致2020级推迟到了14周完成。

学分:

2

小Tips:

  1. 实验室在四楼/五楼,从某种角度可以帮你减肥:)
  2. 每年的题目都有一些不同,而且是非常明显的不同。所以期望找直系学长/学姐寻求全部“帮助”是不明智的,但是主要部件可以为蓝本进行参考。例如MAR MDR ALU等,基本部件基本上是可以提供一定参考的价值的。
  3. 关于评优:首先坦率说,在2020级,如果只是完成基础部分(实现加法和CVNZ)应该只能达到良级。而且有越来越卷的趋势(上一级是只需要做出一项扩展就可以评优,这次一个班就有非常多的同学做出来了乘法),如果没有保研的想法,请理性思考成本问题。
  4. 不要有幻想什么的,老师对实验器材异常敏感,不可能不会发现不了你的小心思。如果有什么缺陷的话最好实话实说。老师不会刻意为难你的。

经验分享:

关于地址写入的简单介绍

首先是实验台的部分。实验台有一个实验器材和一个电脑。在电脑中,你可以对想要输入的RAM和ROM进行写入。操作过程我就不一一赘述了,但是我想给大家分享一个比较简单的方法,就是你可以通过点击写地址,加你所需要的地址和数据,按照

地址:

XXXXXX

数据:

XXXXXX

进行快速写入

//注意这里的“:”是英文的 

写入完之后我们可以按红色和绿色的箭头对其写入ROM,RAM写入操作,这里请注意,一般情况下,你只能修改右侧的RAM中的数字来实现修改操作(上图的版本较老,可以参考下面的版本)

//粗略解释一下RAM中各个数字的意义:取A0 和A1(位于RAM中相应地址)内的数字,将相加的结果打入A2(RAM中的数字)中,最后的结果就是观察位于A2中的值是否和通过计算器得到的值相同:

如图

 那么结果就应该亮三盏灯(位于PSW)溢出,进位,判零

我们就可以读出在A2中的值为00(最前面的1因为溢出被省略)

关于脉冲速度调节

然后是实验器材本身,由于本次实验器材已经用了很多次,所以很有可能会导致许多实验器材在脉冲的打入上遇到问题。这里注意的是,脉冲的打入我们可以人为控制的。控制点位于实验器材的左侧,中间靠下的部分。那里有一排引脚(如图),你可以把一个类似帽子的东西拔出来,再改变插入位置,从左到右代表的是脉冲速度,从慢到快,你可以在最慢的时候进行观察,最快的时候进行实验验证。//但这里强烈建议用单脉冲调试

关于清零端的问题

清零端的打入自古以来都是一个非常困难的问题,如果你遇到了第一次实验是正确的,但是第二次甚至以后全部的实验都是错误的,只能够通过完全重启实验器材(断电)来实现正确的写入的话,那很有可能是你清零做干净彻底,我的建议是将清零总线接到一个开关上,通过手动对其进行清零操作,而且在读取之前进行清零操作,这样的话就可以保证你的RAM和ROM不受影响。之后再拨回,保证下一次实验的正常进行。

所以我认为比较合理的实验步骤是(可能只对个人有用):写RAM/写ROM=>Quartus 进行programmer操作=>手动清零=>单片机和CPU复位=>打入脉冲=>完成实验操作=>拨下/拨上清零端=>读取RAM=>修改RAM中相应数据(为下一组数据做准备)=>写入RAM=>拨上/拨下清零端=>单片机和CPU复位=>打入脉冲

踩坑注意事项:

  1. 首先有一个好队友是特别重要的,一定不能半路掉链子,摆烂。我们班就有同学抱怨几乎是他/她自己独立完成了全部实验。所以选择队友一定是重中之重,我就很开心有一位非常优秀的队友,我们虽然都是小菜鸡,但最后还是做出来了
  2. 时间安排。本次课设实验时间较长,也就是说每天的工作量可能没有那么大,但是换另一个角度来说也有可能每天拖延症晚期,导致拖到了最后,最后看电路图都看不懂
  3. 合理分工,这个我个人感觉闭门造车不太好。可以通过网络或者是同学相互讨论循序渐进。
  4. 官群可能会有戾气(希望只是在我们年级),但不管匿名的同学怎么说,请永远相信美好的事情即将发生:)

一些具体实验器件的介绍:

//下文主要依靠本模型实现

总图的介绍:

通过老师给出的抽象模型,我们可以看出,整机实验的核心是以ALU,Z寄存器和A,B选择器组成的运算单元,而且其中的核心都包括暂存器Z。这里我简略写一下需要用到暂存器Z的地方:

  1. PC=>B选择器=>ALU=>暂存器Z
  2. 暂存器Z=>地址总线=>MDR
  3. M(MAR)=>选择器=>MDR=>三态门=>A选择器=>ALU=>暂存器Z
  4. R1=>ALU=>暂存器Z R0=>ALU=>暂存器Z //注意这里是同时打入,之后一起打入ALU,暂存器Z
  5. 暂存器Z=>数据总线=>寄存器组R1

可以看出,Z暂存器在每一个重要环节都有参与,因此,我强烈建议在第一次实验中可以把ALU彻底搞懂。

RAM:这里主要由实验器材负责,我们只需要把PC的值给RAM就可以了,其他的不用关心。

数据总线:为最上面的连接几乎所由元器件的桥梁。 

启动电路:

 老师提供了两种启动电路,其实如果实验器材本身没有问题的话,选择哪种方案其实没有什么太大的差别,现在在这里简单介绍一下各个管脚的主要功能:

最上面的是连接HALT指令(停机指令),通过非门使输出为0,实现了停机操作。

中间两个是脉冲的打入,通过打入脉冲可以使实验器材按照我们的意愿进行下一步操作。

最下面是CLEAR指令,这个建议单独绑一个开关

选择器:

这里可以实现指令接下来是通过uPC实现uPC+1还是直接执行无条件跳转

思路如下:

这个器件的实质是一个选择器:

如果需要作为uPC+1,则BY打入高电平,选择B端口作为输出端口,这样就可以在uPC中实现uPC+1操作。

如果需要执行无条件转移指令,那么我们只需要选AY,这样的话输出的就会因为我们通过有意的连接VCC和接地实现强制转换。例如在这里我就直接将输出结果强制转化为00000001.实现了指令的无条件转移。

IR指令寄存器

这个IR指令寄存器的实质其实只是一个register-8.但是我们可以通过控制输入指令的切割实现不同的目的。

这个初学者可能理解比较困难,这里我举一个例子:

例如我输入A1操作(位于RAM),

我们关注于转换得到的2进制,也就是10100001,这样打入D1到D8的0或1我们就已经知道了,从高位到低位分别是10100001.输出时,我们可以看出有两个不同的方向,其中Y1到Y4可以控制选择那些不同的寄存器(位于寄存器组中)

而高四位的输出我们可以看出是通过和B1-4的组合形成新的值,也就是00001010,这个值会打入uPC,在执行uPC+1操作后读取我们写入ROM中的下一条指令。 

即机器会读取位于ROM中A0位置的指令,之后如果没有遇到无条件转移指令,会一直读下去的。

uPC :

本质上就是要实现uPC+1操作,这里就不详细介绍了,但还是要注意输出引脚的绑定,我们要绑定180-191

MDR:

 和MAR一致,只是目的不同。值得注意的是,实验要求上如果说要实现隔绝MDR的话,这里强烈建议将MDR,三态门,选择器打包成一个统一部件,切忌不能只打包两个!或者是干脆不打包。

三态门:

 三态门,作用和它的名字一样,通过控制EN来实现MDR中的数据的输出方向;

例如在老师停供的总图中:

我们可以看出,MDR有两个不同的输出方向,分别是输出到RAM和通过A选择器到ALU再到寄存器。因此控制输出方向就是否有必要了

这里给出一个一般思路:(可能有更好的)

分别接入两个三态门,中间的控制MDR和双端口相连,右边的控制和A选择器相连,这样就可以控制MDR的输出方向了。

PC:

和uPC本质上是一个元器件,它们的目的其实都是在脉冲打入的时候实现+1的操作,当然,用另一句通俗易懂的话来说,就是通过它们我们可以实现了指令向下读取

这里我就以PC为例,介绍一下PC,B选择器,ALU,MAR在宏观上的联系。也就是本实验的核心部分。

在本实验老师给出的抽象模型中,我们可以看出 ,数据流通过PC,B选择器,ALU,暂存器Z,数据总线,形成了循环,也就是说。我们通过PC加一来实现取值,LOAD,操作(也就是宏观上RAM的值的读取和分析)

ALU和寄存器Z:

这个是本实验的核心。ALU相信同学在之前的实验里已经自己组装过了。但是我还是想补充几点:

首先是74181和74182.我们对于这个是怎样内部实现的不用关心,我们是要利用它们。

其次是CVNZ的操作,这个大家可以参考后文中的详细介绍。

我们先看一下74181的功能表。我们首先要明白的是,作为ALU,在本实验中,它的作用已经被定死了,也就是要实现加法操作,也就是说,我们可以通过接入VCC或者是接地的方法来实现这一功能。

 通过M,S1,S2接地,C0.S0,S3进入VCC来实现。

 从老师给出的参考图我们就会知道ALU的输入十分复杂。我们可以把它抽象成首先通过A,B选择器进行预选,这样的话才可以打入ALU,并在ALU执行加法操作(也可以是作为打入R0/R1的中继站,因为存入的数+0还是原来的数字)

我就不详细介绍了,之前的实验大家肯定了解的十分详细,唯一我要补充的是CN4,也就是图中右下侧绑定非门的输出,CN4记录运算后的进位。但是和我们印象不同的是,进位它打出低电平,因此需要连接非门。

接下来我详细介绍一下CVNZ是怎样实现的

CVNZ的实现:

1C→CF(进位标志位)反映无符号数的运算是否产生进位或借位。运算结果的最高有效位向更高位进位或者借位,CF1,否则置0。   

2Z→ZF(零标志位):判断结果是否为0。运算结果0ZF1,否则置0。    

3N→SF(符号标志位):反映运算结果的符号。运算结果为负,SF1,否则置0。   

4V→OF(溢出标志位):反映有符号数的运算是否溢出。运算结果超过了规定字长有符号数的表示范围,OF1,否则置0

这是老师的实验要求,那么我们应该怎样实现呢?

我将会从简到深的为大家介绍。

C:

首先是最简单的C,即进位:之前我们已经提到了,由CN4产生的低电平信号经过非门变成高电平,这样的话我们直接接入PSW寄存器即可。

Z:

接下来是Z,首先我们需要明白什么是Z,这里的Z是狭义上的。即RAM中的数字。我们继续举上文的栗子:

 在这里,我们只需要关注于最后的00即可。因此,只要我们转化为二进制的结果所有都为零即可。

在这里我们一定要明白,不是100中的“00”是全为“0”的,而是转化为二进制的“0000,0000”全部为0的!因此,我们需要接入OR8,再接入非门。理由很简单:如果里面输入任何一个不全为0的数,就会经过或操作,再接入非门变成低电平。因此输出为低电平,也就是宏观上的灯泡不亮。

N:

N:这个也同样十分简单。反映运算结果的符号。运算结果为负,SF置1,否则置0。   我们只需要把最高位接出即可。

V:

V的实现比较复杂,因为有两种可能导致溢出的情况。

首先我们要明白,什么是溢出?

溢出就是计算出的数超过了缓冲区的范围,导致部分数值丢失的操作。

可能导致溢出的原因在本实验中只有两条:

同为正数相加和同为负数相加

我们这里可以利用同或门和异或门来实现。

逻辑如上,大家有时间可以自己思考。核心还是同或或是异或问题

大家可以参考这篇文章

(125条消息) c语言32位数如何判断溢出,单片机程序状态字PSW的OV位到底是怎么判断溢出的?有CY位不就够了么?..._weixin_39965673的博客-CSDN博客https://blog.csdn.net/weixin_39965673/article/details/117147563?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165392608716782391849865%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165392608716782391849865&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-117147563-null-null.142%5Ev11%5Epc_search_result_control_group,157%5Ev12%5Econtrol&utm_term=%E5%8D%95%E7%89%87%E6%9C%BA+%E5%88%A4%E6%96%AD%E6%BA%A2%E5%87%BA&spm=1018.2226.3001.4187基本上主要部件已经梳理完成啦,接下来我打算能不能写一下主要流程介绍

一些具体流程的介绍:

实验流程主要包括取值周期,LOAD周期,ADD周期,STORE周期,HALT。

取值周期:

LOAD周期:

ADD周期:

STORE周期:

HALT:

HALT停机指令,当读取到本指令时,计算机会停止下一个指令的读取,且指示灯不亮,PSW显示正确结果。具体实现如图:

通过11信号的打入,使AND3恒为非状态,阻止了CP信号的打入。进而阻止了下一步指令的形成。因此实现了停机操作。

尾声

如果同学实在没什么思路,不妨去每台电脑的D盘翻翻,里面有很多很多意料之外的小惊喜噢

:)

  • 16
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值