☰
计算机组成原理实验:基于74LS161与74LS245的程序计数器电路设计
2026/10/7 18:36:53 网站建设 项目流程

程序计数器(PC)是计算机组成原理实验里最经典、也最能帮你把“取指-译码-执行”这个抽象流程落到电路上的一个模块。很多同学一看到电路图就懵,实际上PC的实验电路没有那么玄:一个能计数、能装载、能复位、能三态输出的寄存器,再配上总线缓冲,就构成了CPU取指阶段的“进度条”。这篇内容适合正在准备计算机组成原理实验考试、或者想用74系列芯片在面包板上复现课本原理的人,我会按“信号设计-选型-接线-调试-扩展”的顺序,把从0到1的搭建过程完整拆开讲,包含一份可以直接对着接线的引脚级电路连接表。

1. 这个实验到底要解决什么问题

1.1 程序计数器(PC)在CPU里的位置

先给不熟悉的同学补个基础。程序计数器全称Program Counter,简称PC,它保存的是下一条将要执行的指令在内存中的地址。CPU执行指令时,第一步“取指”就是根据PC给出的地址,从存储器里把指令取出来,同时PC自动加1,指向下一条指令;而遇到跳转指令时,CPU会把目标地址直接写进PC,打断原来的顺序执行流程。

你可以把PC理解成读书时夹在书里的书签,翻到当前页,读完翻下一页;突然想跳读某章,就把书签直接插到那一章。计算机组成原理课上讲的控制器、运算器、存储器,几乎每一个环节都要和PC打交道,所以它虽然小,却是整个CPU前端的人口。

我记得刚学计组时,总是背“PC自动加1”这句话,但一直不知道这背后到底是哪个硬件在做加法。等到做实验才发现,教材里轻描淡写的“自动加1”,在实际电路里可以简单到“来一个时钟上升沿,计数器加1”这么直接。这个从抽象到具体的落差,恰好就是这门实验课的价值所在。

1.2 这次实验要实现什么功能

既然是实验,就要有明确的验收标准。我给这个实验定的目标是:设计一个4位程序计数器,支持下面四种基本操作。

  • CLR(清零):让PC回到地址0,程序从头开始执行。
  • LD(装载):把一个目标地址写入PC,对应跳转指令。
  • INC(自增):PC加1,对应顺序执行下一条指令。
  • OUT(三态输出):把PC的值放到总线上,供外部部件读取地址。

这四种操作几乎覆盖了真实PC的所有基本行为。你可能会问,为什么需要“三态输出”这个额外操作?因为真实的CPU里,数据总线是多个部件共享的,如果PC一直占着总线,存储器、寄存器就没办法把数据送上来了。所以PC的输出口必须设计成可断开的总线驱动器,这就是实验里的三态门,也是整张电路图最值得琢磨的地方。

为了不把实验复杂化,我采用“手动控制信号”的方式:用按键和拨码开关模拟CPU发出的控制信号,用LED观察PC当前值。等把逻辑跑通了,再考虑接入自动控制,比如用译码器产生时序控制信号。

2. 器件选型与环境搭建

2.1 为什么核心芯片选74LS161

做PC实验,第一步是选一个能做“计数+装载”的核心芯片。我推荐用74LS161,这是一颗非常经典的4位同步二进制计数器,也是各实验室库存里最常见的TTL芯片。

74LS161的重要引脚分三组:数据输入是A、B、C、D;数据输出是QA、QB、QC、QD;控制引脚包括清零MR#、并行装载PE#、计数使能CEP和CET,以及时钟CLK。它最方便的地方在于,计数和装载都在时钟上升沿完成,是“同步”动作,这和我们希望PC在时钟节拍下稳定变化的需求完全一致。

有人会问,直接用寄存器加加法器不是更贴近教材吗?确实,更接近真实CPU的PC是一个寄存器加上一个加法器,寄存器暂存地址,加法器负责加1或加偏移量。但那是进阶玩法,第一版实验用161有两个好处:一是芯片内部已经帮你把加法器集成了,接线量少,不容易出错;二是161的RCO进位输出,可以直接级联到下一片,扩展成8位、16位PC非常方便。先把“计数”这个行为吃透,再换成寄存器+加法器方案,会顺畅很多。

顺带说一句,如果你们用的是唐朔飞或者王道这类教材,PC这部分考点永远离不开“时序”和“总线”,用74LS161做实验刚好能把这两点都覆盖到。

2.2 三态门和数据总线的关系

前面提到“三态门”,这里专门解释一下。普通逻辑门只有两种状态:高电平和低电平。三态门多了一个“高阻态”,也就是说输出端既不输出高电平,也不输出低电平,相当于把引脚从电路里“断开”了。

用会议室来打比方:一个会议室只有一扇门,大家都想把材料送进去,如果所有人都站在门口往里递,肯定会堵塞。于是规定,只有被“点名”的人才能走到门口,其他人退到走廊里等待。三态门就是那个被点名的机制,OE#使能信号就是点名动作。

在这个实验里,PC的值最终要通过74LS245输出到总线上。74LS245是一颗8路总线收发器,内部集成了三态缓冲。它的DIR引脚控制方向,我们用不到反向传输,所以直接把DIR接高电平,固定A端输入、B端输出;OE#引脚控制三态,低电平有效,OE#为低时数据正常通过,OE#为高时所有输出都变成高阻态。

这就解释了一个实际问题:为什么PC不直接把引脚接到LED上,而是要绕到245后面?因为接LED只是为了显示,但接总线是为了让PC能和存储器、寄存器通信。在真实CPU里,PC如果不经过三态门就直接挂在总线上,其他部件就无法使用总线,整个系统直接瘫痪。

2.3 实验工具清单

硬件部分需要准备以下材料,清单不复杂,大多是实验室常备件。

  • 面包板或洞洞板一块,建议选面包板,方便随时改线。
  • 74LS161计数器两片(做8位扩展时用,先备一片也够)。
  • 74LS245总线收发器一片。
  • 5V直流电源,TTL芯片统一用5V,别接12V。
  • 单脉冲模块一个,或者用按键自己做去抖。
  • 拨码开关若干,用于预置地址。
  • LED和限流电阻,电阻用220欧姆或330欧姆,LED用于显示PC当前值。
  • 面包板跳线若干,颜色分类好,正电源用红色、地线用黑色。
  • 万用表,示波器可选但强烈建议备一台,逻辑笔也行。

如果你手头硬件不全,也可以在Multisim或者Proteus这样的仿真软件里先搭一遍。我在自己做这个实验时,就是先在Multisim里把电路跑通,再去面包板动手,排错时间至少省了一半。仿真环境中74LS161、74LS245这些芯片都有现成模型,按引脚号放置就能接线,非常方便。

3. 电路设计核心细节解析

3.1 PC主体的完整引脚连接

我先把本实验核心部分的引脚关系给出来。下面这张表几乎就是简化版的电路图,照着接即可,芯片引脚号以DIP封装为准。

先看74LS161,我把它标成U1。

引脚名称接到哪
1MR# / CLR#清零按键,低有效
2CLK单脉冲时钟
3A / D0数据总线第0位,或预置开关
4B / D1数据总线第1位,或预置开关
5C / D2数据总线第2位,或预置开关
6D / D3数据总线第3位,或预置开关
7CEP接+5V,或接INC控制信号
8GND电源地
9PE# / LD#装载控制,低有效
10CET接+5V,或接INC控制信号
11Q0接74LS245的A1
12Q1接74LS245的A2
13Q2接74LS245的A3
14Q3接74LS245的A4
15RCO做8位扩展时接高位片的CET,本实验不用可悬空
16VCC接+5V

再看74LS245,标成U2。

引脚名称接到哪
1DIR接+5V,固定方向A到B
2A1接U1的Q0
3A2接U1的Q1
4A3接U1的Q2
5A4接U1的Q3
18B1接数据总线第0位,同时接LED显示
17B2接数据总线第1位,同时接LED显示
16B3接数据总线第2位,同时接LED显示
15B4接数据总线第3位,同时接LED显示
19OE#输出使能,低有效,接控制开关
20VCC接+5V
10GND接电源地

这里有一个容易纠结的点:161的CEP和CET到底怎么接。如果希望“每来一个时钟脉冲,PC就加1”,就把两个使能引脚都接高电平。如果想让实验里有一个明确的INC自增信号,可以把CET引脚接到一个控制线上,INC为高电平时允许计数,INC为低电平时即使有CLK也不变化。两种接法都合理,我建议新手直接接+5V,先把最基础的“时钟到来就自增”现象看清楚。

这张表也体现了一个重要思路:所有控制信号,比如CLR#、LD#、OE#,都要单独引出来用开关控制。这样每个信号的作用一目了然,后续接自动控制时也只需要把这些端子改接到译码器或单片机引脚上。

3.2 控制时序:先画时序图再接线

在整个计组实验里,“时序”这个词出现频率极高。你可以不背芯片手册,但必须能在纸上画出每个控制信号的先后关系。程序计数器最典型的三个操作时序分别如下。

清零操作最简单:把CLR#拉低,161立刻被异步清零,QA到QD全部变0,不需要等待时钟。要注意的是161的清零是异步的,意思是只要CLR#有效,输出立刻就变,和CLK没关系。这在实际电路中要格外小心,因为按钮按下时会产生抖动,如果不清抖,可能出现意想不到的复位脉冲。

装载操作是同步动作:先在总线或拨码开关上设置目标地址,确保数据稳定后,把LD#拉低,然后给出一个时钟上升沿,161才会把D0到D3的数据装进计数器。重点在于数据必须先准备好,再给时钟,顺序不能反。用实验步骤表示就是:

1. 设置预置地址,比如 D3D2D1D0 = 1100 2. LD# = 0,允许装载 3. CLK 从0变成1,产生上升沿,此刻数据被锁存 4. LD# = 1,恢复正常计数状态

自增操作更直接:只要LD#为高,CEP和CET为高,每次CLK上升沿,输出值加1。也就是说,实验里“按一下时钟按键”就等于执行了一次顺序取指。

我建议动手接线前,先画出这三个操作的时序图,把CLK、LD#、CLR#、Q0到Q3的波形画在一张纸上。别觉得多此一举,这比焊完线发现问题再返工快得多。我第一次做的时候就是直接接线,结果加载地址时怎么都不对,后来发现是CLK和LD#的顺序反了。

如果想进一步模拟CPU的自动控制,可以用74LS138译码器生成控制信号。把138的CBA输入端接到一个模拟状态机上,输出Y0#、Y1#、Y2#分别接到CLR#、LD#、OE#。这个方案可以在后面的实验中再尝试,第一版手动开关完全够用。

3.3 时钟产生与按键去抖

实验中最大的坑之一,是直接用普通按键当单脉冲时钟。机械按键在按下和释放的瞬间,触点会抖动几百微秒,产生一串毛刺。如果你把按键输出直接接到CLK引脚,计数器可能按一次却跳了好几个数,而且每次跳的数还不一样,让人完全摸不着头脑。

解决办法有三个。第一,用实验室现有的单脉冲模块,它内部已经做了去抖,输出一个干净的上升沿,这是最省事的。第二,用两个与非门组成RS触发器去抖,比如用74LS00两个与非门,一个按键接两个输入,输出经过一级反相接到CLK。第三,用RC滤波加施密特触发器,比如在按键输出端接一个10千欧电阻和0.1微法电容组成的低通滤波,再进74LS14反相器整形。

如果你用面包板自搭,我推荐第三种方案。连线方法是:按键一端接+5V,另一端经过10千欧电阻接到GND,同时把按键输出脚用0.1微法电容对地滤波,然后送到74LS14的输入端,74LS14的输出就是整形后的脉冲信号,再接161的CLK。这套电路简单可靠,能解决绝大部分抖动问题。

除了按键抖动,还要注意芯片上电瞬间的状态。74LS161上电后的初始值是不确定的,所以实验第一步应该先按一下复位键,让PC回到0,再做其他操作。这也是为什么清零按键一定要安排在顺手的位置。

4. 完整实操搭建与功能验证

4.1 文字版电路图:一张表看懂所有走线

标题里说的“完整电路图”,我这里直接换成更实用的引脚级接线表呈现。你拿着下面这张表,无论是画Multisim原理图,还是在面包板上插线,都能直接照做。

整张电路图的核心就是:161负责PC值的存储与自增,245负责三态总线隔离,按键和拨码开关负责控制与数据输入,LED负责显示。我按模块再归纳一次。

模块元件关键连接作用
电源模块5V电源VCC网络接所有芯片16/20脚,GND接所有芯片8/10脚提供电平
时钟模块按键+74LS14按键输出经RC滤波接74LS14,74LS14输出接U1的CLK产生干净单脉冲
计数模块74LS161数据端接预置开关,Q端接245,CLR#和LD#接控制开关存储和自增PC
三态输出74LS245A端接161的Q,B端接数据总线和LED总线隔离、输出地址
显示模块LED+电阻每位LED串220欧电阻接到245的B端观察PC值

接线顺序也有讲究。先把所有芯片的VCC和GND接好,并且就近接一个0.1微法去耦电容。这一步不能省,TTL芯片在工作时电流变化很快,电源线上会出现毛刺,去耦电容不接,可能会遇到莫名其妙的计数错误。

接下来把所有悬空的输入引脚处理好。74LS161的CEP和CET接+5V,D0到D3接拨码开关,不能悬空;245的DIR接+5V,OE#接控制开关。悬空输入引脚在TTL电路里会呈现不确定电平,是很多诡异问题的根源。

LED显示部分,我建议从245的B端引出,每位LED串联一个220欧姆电阻到GND。这样当输出为高电平时LED点亮,输出为低电平时熄灭;当OE#为高、245输出高阻时,LED不亮,这正好展示了总线隔离的效果。

如果你在Multisim中画电路图,元件名称分别搜索74LS161N和74LS245N就可以找到;在Proteus里同理。仿真时记得加逻辑探针或LED,跑一下交互仿真,按键操作和面包板完全一致。

4.2 推荐搭建顺序

很多同学喜欢一口气把所有线插完,再通电测试,这样一旦出错,根本不知道从哪里排查。我建议按下面的顺序分步搭建,每完成一步就验证一步。

第一步,搭电源网络。先把面包板左右两边的电源轨用跳线连通,接入5V和GND,用万用表确认两端电压正常。此时芯片可以先不插,避免接反电源烧掉。

第二步,搭时钟模块并单独验证。把按键去抖电路搭好,用万用表或示波器观察输出脚,按一次按键应该出现一个清晰的脉冲。如果手头有逻辑笔,也可以用它观察。

第三步,插入74LS161,先不接245。把161的Q0到Q3接LED,CEP、CET接+5V,CLR#接复位开关,LD#暂时接高电平,CLK接时钟模块。通电复位后,每按一次时钟,LED指示的二进制数应该加1。

第四步,插入74LS245,把161的Q端和245的A端相连,245的B端接LED,DIR固定高电平。默认OE#接低电平,此时PC值正常显示;把OE#接到高电平,LED全部熄灭,说明高阻输出生效。

第五步,接拨码开关到161的D0到D3,接LD#装载开关。此时可以测试装载功能,预置地址、按下LD#、再按一次时钟,看PC是否跳转到预置值。到这一步,整个实验主体就算完工了。

这个顺序的核心思路,就是先验证右半部分(计数器本身),再验证左半部分(三态和总线),最后验证控制路径(装载)。每部分都是独立闭环,出问题时可以快速缩小范围。

4.3 功能验证三步走

实验做完,要像平时做课程设计一样留下验证记录。我给出一个标准的验证流程。

先验证清零功能。上电后按一下CLR#按键,观察LED,此时应该显示0000。再按几下时钟,让它变成其他数字,比如0011,然后再按CLR#,应该立刻回到0000。

再验证装载功能。把拨码开关设成1100,按下LD#按键保持不放,再按一次时钟脉冲,松开LD#,LED应该显示1100。这里的关键是判断时序是否正确:如果先按了时钟再按LD#,结果就会不对。可以把拨码开关改成其他值,重复测试三次以上。

最后验证自增功能。清零后连续按时钟,观察LED按二进制递增:0000、0001、0010、0011、0100,一直到1111,再回到0000。如果跳过某个值或者乱跳,基本可以判断是按键抖动或者CEP/CET没接好。

输出使能验证是加分项。把OE#开关拨到高电平,LED应该熄灭;拨回低电平,LED重新点亮。如果没有这个功能,就说明245的高阻控制没有生效。如果你有示波器,可以同时看CLK和161的Q0波形,会发现Q0在CLK下降沿之后发生变化,因为161是上升沿触发,数据在上升沿后被更新。

全部验证通过后,你就可以拍胸脯说,自己已经亲手搭建了一个可用的程序计数器前端。

5. 常见问题与排查实录

5.1 问题速查表

实验现场最容易出的问题就那么几类,我把它整理成一张速查表,出问题先对号入座。

现象可能原因排查方法
上电后LED全亮或全灭,按键无反应芯片VCC和GND接反、电源没供上先量芯片供电脚,确认16脚5V、8脚0V
PC清零后不为0CLR#按键悬空、引脚虚接检查MR#是否稳定拉低再拉高,用万用表量电平
按一次时钟,PC跳好几个数按键抖动严重,没有经过去抖换单脉冲模块,或加RC加施密特整形
计数不递增,输出固定不变CEP或CET没接高电平检查7脚和10脚,确认是否都接了+5V
装载无效,PC保持原值LD#没拉低、CLK没到、数据端悬空按顺序操作:拨码开关设值,LD#拉低,再给CLK
245输出端LED一直不亮OE#没接低电平或DIR方向不对让OE#接地,DIR接高,检查A端和B端对应引脚
运行一段时间后数据乱跳电源纹波大、去耦电容缺失每个芯片VCC就近加0.1微法电容
多路信号输出冲突,总线数据打架245输出使能一直被拉低,造成总线占用确认其他总线器件没有被同时选中

这些问题里,最容易被忽视的是“芯片悬空引脚”。TTL芯片的输入引脚一旦悬空,电平可能被外部干扰拉来拉去,表现出来就是时好时坏。做完电路后,把所有不用的输入引脚统一接高或接低,问题会少一半。

5.2 现场排错的一些心得

做硬件实验,最忌讳“乱猜”。我第一次搭PC时,计数死活不对,以为是161坏了,换了三片芯片还是老样子,最后发现是CET引脚接触不良,虚焊导致电平不稳定。从那以后我养成了一个习惯:不管电路多简单,先拿万用表把每个芯片的电源脚量一遍,再查信号脚。

排错时我推荐“分段隔离法”。比如PC值不对,先把245断开,让161直接带LED,确认计数器本身没问题;再接入245,确认总线隔离正常;最后接拨码和LD#,确认装载路径。每一次改动只引入一个变量,问题就无处遁形。

示波器在这里非常有用。你不需要测太多点,重点看两个位置:一是CLK引脚,确认上升沿干净,没有多余毛刺;二是161的Q0引脚,确认在时钟下降沿后有跳变。如果CLK波形上有一连串高频抖动,说明去抖电路有问题。

如果你用的是面包板,还要注意跳线是否完全插入。面包板的隐形坑在于内部金属夹片可能氧化,导致某一行接触不良。遇到偶发问题时,可以用万用表蜂鸣档去测跳线两端是否导通。

仿真排除法也很管用。碰到奇怪现象,先在Multisim里把同样的电路搭一遍,如果仿真正常而硬件不对,问题基本出在接线、电源或接触上,而不是逻辑设计错误。这个思路能帮你少走很多弯路。

6. 进阶扩展:从计数器走向真正的CPU前端

6.1 真实CPU里的PC为什么不直接放一片161

等你把74LS161版本做得滚瓜烂熟,可以思考一个进阶问题:真实CPU里的PC,为什么通常不用一片计数器芯片,而是用寄存器加加法器实现?

核心原因是161只能加1,而真实CPU的跳转种类很多:无条件跳转要把目标地址直接写入PC,条件跳转要判断标志位后再决定写不写PC,相对寻址还要在PC当前值上加一个偏移量。这些操作靠一颗固定加1的计数器做不出来,所以实际设计会用寄存器保存PC值,用ALU或专用加法器完成加1、加偏移等运算,再通过多路选择器决定下一拍PC写入哪个数据。

如果你想做进阶版,可以尝试用74LS374做PC暂存寄存器,用74LS283做4位加法器,再用多路选择器或门电路选择“PC+1”还是“外部目标地址”。这个方案的接线量比161方案大不少,但做完以后,你对PC的理解会上一个台阶,因为你会清楚地看到:加法器负责算,寄存器负责存,选择器负责选路。

6.2 把PC接入取指链路

如果你还想继续往下做,下一步实验就是把PC接到真正的取指链路上。按照模型机常见的结构,PC的输出经过三态门接到MAR,MAR再驱动存储器读地址;存储器读出指令送入IR;指令经译码器产生控制信号;控制信号再反过来控制PC的装载和自增。这就是一个完整的“取指-译码-执行”闭环。

做这个扩展时,本实验里的LED显示和拨码开关就可以拆掉了,因为控制信号不再来自手动开关,而是来自译码器的输出。你可以用74LS138译码器配合节拍产生器,按顺序拉低CLR#、LD#、OE#等控制线,整个系统就能自动跑起来。

我个人在实际实验中的体会是,PC单独看只是一个会数数的寄存器,但一旦放进取指链路,它立刻变成整个计算机的“方向盘”。你亲手把PC搭通之后,后续的指令寄存器、存储器读写实验都会顺很多。最后再分享一个小技巧:无论做什么后续扩展,都先把本实验的引脚接线表留好,它就是你排查整机故障时的第一份地图。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询