ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Proteus模型计算机课设:74LS181、26位微指令与时序调试

Proteus模型计算机课设:74LS181、26位微指令与时序调试

简介:文华学院《计算机组成原理》课程设计文档,面向计算机与软件工程专业学生,对应“基于Proteus简单模型计算机设计与实现”考查题目,可供课程复习、实验报告撰写与设计思路对照使用。内容围绕模型计算机逻辑电路设计与控制信号归纳、整机电路层次化设计展开,涵盖运算器、寄存器组、指令计数器与存储器各单元的端口信号,并用开关模拟控制信号调试二段汇编指令;同时给出机器指令对应的微指令码点、脉冲与电平信号的区分及时序安排,最后连接微程序控制器完成整机运行与指令系统验证。压缩包共1个doc文件,约2.79MB,目录含需求与总体设计、模型机逻辑图、软件设计、调试过程与结果、总结等章节,并附参考教材信息。已有537人学习,适合需要课程设计框架、微程序设计与调试排错参考的读者。

1. 拨一排开关才能跑通一条指令:这份 Proteus 模型计算机课设到底给了什么

两片 74LS181、一片 6116、几片 74LS273、一条 8 位总线,再加一排拨动开关和一个单步脉冲按钮——这就是一份「计算机组成原理课程设计」里能跑起来的最小 Proteus 模型计算机。它把整机拆成运算器、寄存器组、PC 计数器、存储器、控制器五个子电路,用 26 位微指令驱动,靠 T2/T4 两个节拍手工拨开关跑通 IN、ADD、OUT,最后拿到 58H+58H=D0H。资源里逻辑图、控制信号表、微代码段、逐拍调试记录都有,适合正在赶课设又不想从零猜连线的人;对已经工作、想补一遍数字系统时序概念的工程师,它也是一台能上手的最小样机。下面按信号、电路、微码、时序、排错的顺序拆。

2. 控制信号先立住:74LS181 与 6116 的 23 个字段、有效电平和脉冲/电平之分

2.1 先出信号表再动笔画图

Proteus 里画模型机,最贵的不是画,是改。一根线名字起错,后面五张子图全要翻。所以第一步不是打开软件,是拿张纸把信号列成表:叫什么、干什么、高有效还是低有效、是脉冲还是电平、从哪个子电路出、到哪个子电路去。这张表定下来,后面画图只是照着连线。

课程设计里要求「归纳所有控制信号、区分脉冲信号和电平信号」,这句话不是形式。脉冲信号指上升沿触发一次动作、平时无效的时钟类信号,比如 D1CK、D2CK、RCK、PCK、WMCK;电平信号指在一个节拍内保持有效、当组合逻辑使能用的信号,比如 /EDR1、/ALU-O、/RM。两者的区别直接决定你调试时是先拨开关还是先按脉冲按钮,混了就会遇到「开关全对但数据不进去」。

下面这张表是我按资源里的端口整理的一份,信号名统一用下划线前缀 N 表示低有效,你在 Proteus 里可以照抄,也可以换成斜杠,但全图必须统一一种写法:

信号作用有效电平类型归属
SW_BUS开关数据送上总线高电平主图
EDR1选通 DR1 暂存器低电平运算器
EDR2选通 DR2 暂存器低电平运算器
D1CKDR1 打入上升沿脉冲运算器
D2CKDR2 打入上升沿脉冲运算器
M181 逻辑/算术选择高为逻辑电平运算器
S3~S0181 功能选择高电平运算器
CN181 进位输入低为有进位电平运算器
ALU_OALU 结果上总线低电平运算器
SA、SB寄存器组 A/B 口选择高电平寄存器组
WR寄存器组写允许低电平寄存器组
RCK寄存器组打入上升沿脉冲寄存器组
RD寄存器组读允许低电平寄存器组
PC_PLUS1PC 加一高电平PC 单元
PCKPC 打入上升沿脉冲PC 单元
PC_OPC 值上地址总线低电平PC 单元
CLRPC 与微地址清零高电平主图
RM存储器读低电平存储器
WM存储器写低电平存储器
WMCK存储器写入脉冲上升沿脉冲存储器
CS6116 片选低电平存储器
EIR1IR1 打入高电平控制器
EIR2IR2 打入高电平控制器
IR2_OIR2 内容上总线低电平控制器
MCS微地址寄存器打入低电平控制器

提示:这张表一旦被微指令字段引用,就不要随手改名。Proteus 的网络标号是纯文本匹配,改一个字符不会报错,只会静默不通。

低有效信号多了以后容易看花眼,我一般把低有效统一写成 N 开头(N_EDR1、N_ALU_O),比斜杠可靠,因为部分版本的标号框对斜杠处理不一致。这一步做完,你会得到 20 多个信号,正好对上 26 位微指令的字段数,多出来的几位留给 CLR、PCK 这类全局信号。

2.2 运算器子电路:两片 74LS181 的级联与功能码

74LS181 是 4 位 ALU,A0~A3、B0~B3 两组数据输入,F0~F3 结果输出,S3~S0 选功能,M 选逻辑还是算术,Cn 是进位输入,Cn+4 是进位输出,G、P 是给快速进位链用的。8 位模型机就用两片级联:低片管 D0~D3,高片管 D4~D7,两片的 S3~S0、M 并联,由微码同时给;低片的 Cn+4 接高片的 Cn,串行进位就够用,课设里没有必要上 74LS182。

两片 181 的 A 口接 DR1 的输出、B 口接 DR2 的输出,DR1/DR2 由总线在 EDR1/EDR2 有效时用 D1CK、D2CK 打入。运算结果要挂回总线,就必须过一级三态,常见做法是接一片 74LS245,方向固定 A→B,使能端接 ALU_O。这里是第一个大坑:74LS181 本身没有三态输出,把 F0~F7 直接怼到总线上,总线上永远有强驱动,别的模块一说话就打架。资源里的 ALU_O 信号正是为这级缓冲准备的,画图时别省。

功能码取决于你要做什么运算,常用几个如下(M=0 为算术,M=1 为逻辑):

运算MS3 S2 S1 S0CN
A+B01 0 0 11
A−B00 1 1 00
A·B11 0 1 1无关
A∨B11 1 1 0无关
A⊕B10 1 1 0无关
取反 /A10 0 0 0无关
直通 A11 1 1 1无关

做加法时 CN 取「无进位」那一档,做减法时 CN 取「有进位输入」那一档,具体到你的 Proteus 器件模型,H/L 的含义可能和手册标注相反。血泪经验是:级联之前先拿一片 181 单独搭个测试电路,A 口拨 5、B 口拨 3,S=1001、M=0,看 F 是不是 8,确认了再往整机里放。这一步花十分钟,能省掉后面两小时的怀疑人生。

减法 A−B 在 181 上是靠「加补码」实现的,S=0110 配合进位输入就能出结果,不需要你自己搭反相器。这也是模型机里 SUB、AND、OR、XOR、COM 五条指令能共用同一套 DR1/DR2 通路的原因——只是 S3~S0 和 M 不同,数据通路完全不动。

2.3 寄存器组、存储器与 PC:三类端口的命名习惯

寄存器组要放 R0~R3 四个 8 位寄存器,常见做法是四片 74LS273,每个 273 的 CP 接各自的 RCK 分支,D 端并到总线,Q 端再经 74LS244 三态挂回总线。SA、SB 两位负责选口:SA 选送到 ALU A 口的那个寄存器,SB 选 B 口。写的时候用 WR 选片、RCK 上升沿打入;读的时候用 RD 使能 244。这里的关键是 SA/SB 是电平信号,必须在脉冲到来之前就稳定,否则打进去的是上一个寄存器的值。

存储器用 6116,2K×8 的静态 RAM,11 根地址线 A0~A10、8 根数据线、WE、OE、CS 三个控制端。资源里地址只接了 AB0~AB7,也就是只用前 256 字节,对课设这点程序和数据完全够,但你要知道这是简化:真要扩到 2K,得把 PC 高位也接上去,而 74LS193 只有 4 位,8 位 PC 已经占了两片,再扩就要加第三片。写存储器时 WM 和 WMCK 必须配合,6116 是 WE 有效期间数据被写入,WMCK 给一个上升沿更稳妥;读的时候 RM 和 CS 同时有效,数据才上总线。

PC 单元用两片 74LS193 级联成 8 位,CLR 清零,PC_PLUS1 接计数使能,PCK 接 CP,输出经 74LS244 挂地址总线,PC_O 使能。193 是双时钟器件,加计数和减计数分开,接线时别把 CP 和 CP+ 搞混,否则会出现「PC 每拍减一」这种看着像玄学的问题。

3. 层次化整机电路:五个子电路的端口清单与主图总线接法

3.1 切分原则:主图只放总线、开关、灯和控制器

层次化设计不是为了好看,是为了改得动。主图上一旦铺开二十多片芯片,改一根线要滚半天屏,仿真速度也肉眼可见地掉。合理的切法是:主图只保留 8 位数据总线、地址总线、开关输入、指示灯输出、时序发生器、微控制器,以及五个子电路的方框符号;运算器、寄存器组、PC、存储器各成一个子电路,控制器也可以单独拆出去。

子电路之间的连接全部通过网络标号完成,不画长线。主图里每个方框的引脚用 INPUT/OUTPUT 终端标注,名字与子电路内部完全一致,Proteus 就按名字连。这样你在子电路里改内部结构,只要端口名不变,主图一个字都不用动。

主图上还需要两个东西:一个是单步脉冲源,给 T2、T4 各一个按钮,按一下出一个上升沿;另一个是拨码开关组,接 SW_BUS 缓冲后上总线,用来模拟「输入数据」和「手工给电平」。资源里调试阶段就是靠这两样,一个节拍一个节拍地拨。

3.2 五个子电路的端口清单

下面这份清单按资源里的端口整理,画方框时照着填:

子电路输入端口输出端口
运算器D0~D7、EDR1、EDR2、D1CK、D2CK、S3~S0、M、CNF0~F7、ALU_O
寄存器组D0~D7、SA、SB、WR、RCK、RDD0~D7
PC 单元CLR、PC_PLUS1、PCK、PC_OAB0~AB7
存储器AB0~AB7、D0~D7、RM、WM、WMCK、CSD0~D7
控制器CLR、T2、T4、MCS、IR1、IR2MD0~MD25、MB0~MB5、EIR1、EIR2、IR2_O

有个细节容易被忽略:运算器和寄存器组都是「既读总线又写总线」的模块,端口表里 D0~D7 会同时出现在输入和输出两栏。Proteus 里对应做法是内部用双向总线终端,或者干脆拆成 DIN 和 DOUT 两组标号,在子电路内部用 245 隔开。我倾向后者,因为调试时一眼能看出方向。

存储器的数据线也要双向,读的时候 6116 输出,写的时候 6116 输入,中间必须有三态缓冲,不能直接并联。

3.3 网络标号与端口一致性:Proteus 里最容易翻车的一步

画完五个子电路,把它们拖进主图,接下来全是标号活。Proteus 的规则很简单:同名的 Default 终端互连,总线用 BUS 线加D[0..7]标注,每个引脚再单独标D0、D1。规则简单,错起来也简单,而且不报错。

常见的三种错法:一是大小写不一致,N_RD和n_rd在 Proteus 里是两个网络,肉眼看不出来;二是总线入口没标号,线画上去了但成员没进总线,单根线是通的,整体是断的;三是子电路端口名和主图终端名差一个下划线,比如IR2_O对IR2-O,画面上完全一样,逻辑上不通。

我的做法是建一份命名表放在旁边,画一个标一个,画完用 Proteus 的 Design Explorer 或者直接 Search 功能逐个查引用数,每个信号至少要出现两次(一次源、一次目的),出现一次的大概率是漏了。这个检查花五分钟,比仿真跑不通再回头找强得多。

注意:子电路符号的引脚顺序和内部端口的对应关系在放置时确定,后面改内部端口顺序不会同步到主图,改完要重新放置符号。

4. 从汇编到微代码:两条程序的逐拍拆解与 26 位码点位

4.1 先把两条汇编程序拆成数据流

资源里给了两段程序,第一段练输入输出和运算,第二段多两条访存指令:

; 程序一 IN R0, #DATA1 IN R1, #DATA2 ADD R0, R1 OUT R0 ; 程序二 IN R0, #DATA1 STA (01H), R0 IN R0, #DATA2 MOV R1, (01H) ADD R0, R1 OUT R0

拆微操作的方法是从寄存器出发反推:数据从哪来、经过谁、最后落到哪。以IN R0,#DATA1为例,路径是「开关 → 总线 → DR1 → ALU 直通 → 总线 → R0」,对应三个动作:SW_BUS 加 EDR1 把开关值送上总线并选通 DR1,T2 打一个 D1CK 把值锁进 DR1;然后 ALU 设成直通(M=1、S=1111),ALU_O 打开,结果上总线;同时寄存器组 SA 选 R0、WR 有效,T2 给一个 RCK,值就进了 R0。

ADD R0,R1的路径是「R0 → DR1,R1 → DR2,181 相加,结果回 R0」,四拍:选 R0 读、EDR1 有效、T2 打 D1CK;选 R1 读、EDR2 有效、T2 打 D2CK;设 S=1001、M=0、CN 取无进位、ALU_O 打开,结果上总线;寄存器组选 R0、WR 有效、T2 打 RCK。中间任何一拍顺序错了,结果就不是和,而是某个中间值。

OUT R0最简单:选 R0 读,ALU 直通,结果送到显示锁存器(一片 273 带 LED),T2 打一下就行。程序二里的STA (01H),R0和MOV R1,(01H)多了一步地址来源:地址 01H 从 IR2 的立即数字段经 IR2_O 送上地址总线,数据走 RM、WM。

把每条指令拆成这样的动作序列,你就得到了微指令的骨架——一条微指令对应一个节拍,节拍里哪些电平有效、哪个脉冲打一下,写清楚就完事。

4.2 T2/T4 两个节拍:脉冲打数据,电平选通路

资源里的调试过程反复出现「给 T4 脉冲打开某功能,给 T2 脉冲把数据打入」,这个分工要理解透:T4 负责切换通路,T2 负责让数据落袋。一个节拍内,先由 T4 把这一拍要用的电平信号全部建立(选寄存器、开三态、设功能码),稳定之后再给 T2 一个上升沿,把总线上的值打进目标寄存器。

这解释了为什么很多人的模型机「单步能走、连起来就乱」:T2 和 T4 的先后关系反了。先给 T2 再给 T4,打进寄存器的是上一拍残留的总线值,看起来就像数据晚了一拍。

节拍谁动作典型信号
T4 上升沿微地址更新、电平信号切换MCS、S3~S0、SA、SB、RD、ALU_O
T4 之后总线稳定数据在总线上保持
T2 上升沿数据打入D1CK、D2CK、RCK、PCK、WMCK

微地址的推进也挂在 T4 上:每条微指令执行完,T4 让 MB0~MB5 加一或者跳到下一条。资源里 MB 是 6 位,最多 64 条微指令,跑两段程序够用;如果你要加指令,先数一下还剩多少空位。

4.3 26 位微指令的字段位序与互斥约束

微指令是 26 位,直接对应 26 个控制信号。位序怎么排没有标准答案,但一旦定了就不能改,因为微码 ROM 里的数据是按这个顺序烧的。我用的一套顺序如下,你可以整体替换,但要整表一起换:

位信号位信号
MD0SW_BUSMD13RD
MD1EDR1MD14PC_PLUS1
MD2EDR2MD15PC_O
MD3MMD16EIR2
MD4S3MD17IR2_O
MD5S2MD18RM
MD6S1MD19WM
MD7S0MD20CS
MD8CNMD21EIR1
MD9ALU_OMD22MCS
MD10SAMD23CLR
MD11SBMD24PCK
MD12WRMD25WMCK

字段之间有硬性互斥,写微码时必须自己盯住:同一拍只能有一个三态源上总线(SW_BUS、ALU_O、PC_O、IR2_O、寄存器组的 RD 选通,五选一);RM 和 WM 不能同时有效;EDR1 和 EDR2 不要同时开,否则 DR1、DR2 会同时往总线上怼;WR 和 RD 在寄存器组上同时有效时,写入值等于读出值,动作看起来「没生效」。

这些约束靠人眼检查迟早出事,尤其是微指令加到三四十条以后。稳妥的做法是写几行脚本,打包的同时做检查,第 4.4 节和第 6 章各给一段。

4.4 用脚本把微指令表压成 6116 的 HEX 文件

手工把 26 位二进制敲成十六进制,敲错一位就要重来,而且很难查。我一般写成「助记符集合 + 自动打包」,改一条微指令只改集合里的名字。

# microasm.py —— 26 位微指令打包,输出 6116 可用的 hex FIELDS = [ "SW_BUS", "EDR1", "EDR2", "M", "S3", "S2", "S1", "S0", "CN", "ALU_O", "SA", "SB", "WR", "RD", "PC_PLUS1", "PC_O", "EIR2", "IR2_O", "RM", "WM", "CS", "EIR1", "MCS", "CLR", "PCK", "WMCK", ] ACTIVE_LOW = {"EDR1", "EDR2", "ALU_O", "PC_O", "IR2_O", "RM", "WM", "CS", "MCS", "RD", "WR"} def pack(sig): """sig 是本拍有效的信号名集合,低有效信号未出现时输出 1""" v = 0 for name in FIELDS: on = name in sig if name in ACTIVE_LOW: # 低有效:无效时该位为 1 on = not on if on: v |= 1 << FIELDS.index(name) return v # 每条微指令:微地址 + 本拍有效信号 + 备注 MICRO = [ (0x00, {"SW_BUS", "EDR1"}, "IN R0: 开关值送上总线,选通 DR1"), (0x01, {"EDR1", "D1CK"}, "IN R0: T2 打入 DR1"), (0x02, {"M", "S3", "S2", "S1", "S0", "ALU_O", "SA", "WR"}, "IN R0: ALU 直通,选 R0 写"), (0x03, {"RCK"}, "IN R0: T2 打入 R0"), (0x04, {"RD", "SA", "EDR1"}, "ADD: 读 R0 到 DR1"), (0x05, {"D1CK"}, "ADD: T2 打入 DR1"), (0x06, {"RD", "SB", "EDR2"}, "ADD: 读 R1 到 DR2"), (0x07, {"D2CK"}, "ADD: T2 打入 DR2"), (0x08, {"S3", "S0", "ALU_O", "SA", "WR"}, "ADD: S=1001, M=0, A+B"), (0x09, {"RCK"}, "ADD: T2 结果写回 R0"), ] def emit(micro, path="micro.hex"): rows = [] for addr, sig, note in micro: val = pack(sig) # 26 位拆成 4 个字节, <p> <a href="https://download.csdn.net/download/killer655/86738737" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进