ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

计算机组成原理实验:基于74LS161与74LS245的程序计数器电路设计

计算机组成原理实验:基于74LS161与74LS245的程序计数器电路设计 程序计数器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的A112Q1接74LS245的A213Q2接74LS245的A314Q3接74LS245的A415RCO做8位扩展时接高位片的CET本实验不用可悬空16VCC接5V再看74LS245标成U2。引脚名称接到哪1DIR接5V固定方向A到B2A1接U1的Q03A2接U1的Q14A3接U1的Q25A4接U1的Q318B1接数据总线第0位同时接LED显示17B2接数据总线第1位同时接LED显示16B3接数据总线第2位同时接LED显示15B4接数据总线第3位同时接LED显示19OE#输出使能低有效接控制开关20VCC接5V10GND接电源地这里有一个容易纠结的点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滤波接74LS1474LS14输出接U1的CLK产生干净单脉冲计数模块74LS161数据端接预置开关Q端接245CLR#和LD#接控制开关存储和自增PC三态输出74LS245A端接161的QB端接数据总线和LED总线隔离、输出地址显示模块LED电阻每位LED串220欧电阻接到245的B端观察PC值接线顺序也有讲究。先把所有芯片的VCC和GND接好并且就近接一个0.1微法去耦电容。这一步不能省TTL芯片在工作时电流变化很快电源线上会出现毛刺去耦电容不接可能会遇到莫名其妙的计数错误。接下来把所有悬空的输入引脚处理好。74LS161的CEP和CET接5VD0到D3接拨码开关不能悬空245的DIR接5VOE#接控制开关。悬空输入引脚在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接LEDCEP、CET接5VCLR#接复位开关LD#暂时接高电平CLK接时钟模块。通电复位后每按一次时钟LED指示的二进制数应该加1。第四步插入74LS245把161的Q端和245的A端相连245的B端接LEDDIR固定高电平。默认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脚0VPC清零后不为0CLR#按键悬空、引脚虚接检查MR#是否稳定拉低再拉高用万用表量电平按一次时钟PC跳好几个数按键抖动严重没有经过去抖换单脉冲模块或加RC加施密特整形计数不递增输出固定不变CEP或CET没接高电平检查7脚和10脚确认是否都接了5V装载无效PC保持原值LD#没拉低、CLK没到、数据端悬空按顺序操作拨码开关设值LD#拉低再给CLK245输出端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位加法器再用多路选择器或门电路选择“PC1”还是“外部目标地址”。这个方案的接线量比161方案大不少但做完以后你对PC的理解会上一个台阶因为你会清楚地看到加法器负责算寄存器负责存选择器负责选路。6.2 把PC接入取指链路如果你还想继续往下做下一步实验就是把PC接到真正的取指链路上。按照模型机常见的结构PC的输出经过三态门接到MARMAR再驱动存储器读地址存储器读出指令送入IR指令经译码器产生控制信号控制信号再反过来控制PC的装载和自增。这就是一个完整的“取指-译码-执行”闭环。做这个扩展时本实验里的LED显示和拨码开关就可以拆掉了因为控制信号不再来自手动开关而是来自译码器的输出。你可以用74LS138译码器配合节拍产生器按顺序拉低CLR#、LD#、OE#等控制线整个系统就能自动跑起来。我个人在实际实验中的体会是PC单独看只是一个会数数的寄存器但一旦放进取指链路它立刻变成整个计算机的“方向盘”。你亲手把PC搭通之后后续的指令寄存器、存储器读写实验都会顺很多。最后再分享一个小技巧无论做什么后续扩展都先把本实验的引脚接线表留好它就是你排查整机故障时的第一份地图。
返回列表