第 162 篇
考研数电·零基础讲义 第15讲|寄存器与移位寄存器
考研数电·零基础讲义 · 第 15 讲|寄存器与移位寄存器 学完本讲,你能说清数码寄存器和移位寄存器的结构与工作过程,会逐拍列出移位寄存器里代码的移动情况,看懂并会用双向移位寄存器 74HC194 的功能表,知道它怎样做串并转换、乘除 2 和级联扩展,并对环形、扭环形计数器有初步认识。预计用时 90 分钟。
本讲地图
- 数码寄存器:一排共用时钟的触发器,一拍存进一组二值代码(并行输入、并行输出)。
- 移位寄存器:触发器首尾串接,每来一个时钟,代码整体右移(或左移)一位;能做串行↔并行转换、乘除 2、数据延迟。
- 74HC194 双向移位寄存器:置零、保持、右移、左移、并行输入五种工作状态,由、、控制;两片级联成 8 位。
- 预告:把移位寄存器首尾相接就是环形计数器、扭环形计数器(与第 14 讲的自启动问题直接相关)。
- 华师怎么考:考纲明确列出"时序逻辑电路:触发器、计数器、寄存器等"。常见考法:逐拍写出移位寄存器状态、按 74HC194 功能表填状态、用移位寄存器构成计数器并判断自启动。
- 教材对应:阎石第六版 5.4 节(寄存器)、6.3.1 节(移位寄存器)、6.3.2 节第四部分(移位寄存器型计数器)。
前置知识
- 边沿触发 D 触发器及其"只在时钟沿按沿前输入动作"的特点,见第 13 讲(中)、(下)。
- 同步时序电路的状态方程、状态转换表、自启动判断,见第 14 讲。
- 4 选 1 数据选择器的表达式,见第 10 讲。
一、数码寄存器:一排储物柜
1.1 大白话
寄存器(Register)就是"能存一组二值代码的电路"。想象超市门口的一排储物柜:每个柜子放一位(0 或 1),4 个柜子就能存一个 4 位二进制数。管理员一声令下(时钟来了),4 个柜子同时换上新东西。
一个触发器存 1 位,个触发器存位。寄存器里的触发器只要能置 1、置 0 就够了,所以电平触发、脉冲触发、边沿触发的触发器都能用。
1.2 结构与工作方式
把 4 个 D 触发器的时钟端接在一起,4 个端分别接数据,4 个输出就是存下的数据:
数据各位同时输入,同时出现在输出端,这种方式叫并行输入、并行输出。
1.3 用不同触发器,动作特点不同
教材举了两个 4 位寄存器的例子:
| 芯片 | 内部触发器 | 动作特点 |
|---|---|---|
| 74LS75 | 电平触发 D 触发器(D 锁存器) | CLK 高电平期间跟随变化;CLK 变低后保持变低时刻的 |
| 74HC175 | CMOS 边沿触发 D 触发器 | 只在 CLK 上升沿按当时的更新 |
同样是"4 位寄存器",用的触发器结构不同,动作特点就不同——这正是第 13 讲(中)"触发方式由电路结构决定"的体现。
为了使用灵活,有些寄存器还附加了异步置零、输出三态控制、保持等功能。这里的"保持"指:时钟到了,触发器也不按改变,维持原状态。
1.4 例题 1
题:一个由上升沿 D 触发器组成的 4 位数码寄存器,初态。第 1 个上升沿时,第 1、2 个上升沿之间输入变成,第 2 个上升沿到来前又变成。求两个上升沿后的状态。
解:边沿触发只看沿到达前一瞬间的输入。第 1 个上升沿后;两沿之间输入变成 0111 不起作用;第 2 个上升沿前一瞬间输入是 1100,所以第 2 个上升沿后。
1.5 易错点 ⚠️
- ⚠️ 用 D 锁存器做的寄存器(如 74LS75)在 CLK 有效期间是"透明"的,输出会跟着输入变;别和边沿触发的寄存器混为一谈。
- ⚠️ 数码寄存器各位之间没有连接,不会移位。
二、移位寄存器:传纸条
2.1 大白话
移位寄存器(Shift Register)除了能存代码,还能让代码在时钟作用下一位一位地挪。就像教室里一排同学传纸条:老师拍一下手,每个人都把手里的纸条交给右边的同学,同时最左边的同学从窗外接过一张新纸条,最右边那张传出去了。
2.2 电路结构
用 4 个边沿触发的 D 触发器串起来:
- 第一个触发器的端接串行输入 ;
- 后面每一个触发器的端接前一个触发器的:,,;
- 4 个触发器共用一个时钟 CLK(叫移位脉冲);
- 最后一个可以作为串行输出。
用第 14 讲的语言写,它的状态方程是:
2.3 为什么能"只挪一位"
疑问:上升沿到来时,收进新数据,变了;会不会接着收到这个新的 ,一口气连挪好几位?
不会。原因有两层:
- 触发器从时钟沿到达到输出变化,要经过一段传输延迟时间 。时钟沿同时打到 4 个触发器时,它们的端都还是旧值:按的旧值翻转,按的旧值翻转……
- 边沿触发器只在沿那一瞬间采样,等前一级输出变了,沿已经过去了,后一级不再接收。
总效果:原有代码整体右移一位,同时的新代码移入。这又是"同一拍所有触发器同时用现态计算次态"的规矩(第 14 讲)。
如果换成电平触发的 D 锁存器就不行:CLK=1 期间所有锁存器都是透明的,数据会从一路"冲"过好几级。脉冲触发(主从)的触发器则可以,因为它的输出要等主触发器接收完毕、CLK 回到低电平时才变。
2.4 例题 2:串行输入 1011,逐拍列表
题:上述 4 位右移寄存器初态,4 个时钟周期内串行输入依次为 1、0、1、1(先送 1),列出每个上升沿后的状态。
解:每一拍:取当时的,其余各位取左边一位的旧值。
| CLK 顺序 | 输入 | ||||
|---|---|---|---|---|---|
| 0(初态) | — | 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 0 | 0 | 0 |
| 2 | 0 | 0 | 1 | 0 | 0 |
| 3 | 1 | 1 | 0 | 1 | 0 |
| 4 | 1 | 1 | 1 | 0 | 1 |
(这张表与教材表 6.3.1 一致,并用 Python 逐拍模拟核对。)
图 1:串行输入 1011 时,代码在 4 位右移寄存器里逐位右移(橙色为输入的代码,灰色为原来的 0,动画循环播放)
图 2:同一过程的电压波形,第 4 个上升沿后并行读出 1101,之后输入为 0,代码继续右移(扫描线动画循环播放)
读图要点:最先送进去的那个 1,每过一个上升沿就往下挪一行(),4 个上升沿后到达。此时 4 位串行代码全部进入寄存器,同时出现在 4 个输出端——串行输入、并行输出,这就是串-并转换。
注意顺序:最先送入的位到了最右边,最后送入的位在最左边。
2.5 并-串转换
反过来,先把 4 位数据并行置入 4 个触发器,再连续加 4 个移位脉冲,代码就从一位一位地串行送出。例如置入、右移时:
| 第几次移位前 | 串行输出 | |
|---|---|---|
| 1 | 1101 | 1 |
| 2 | 0110 | 0 |
| 3 | 0011 | 1 |
| 4 | 0001 | 1 |
依次送出 1、0、1、1,即先送位、最后送位(Python 核对)。串-并、并-串转换在数据通信中很常用:线路上一位一位传,电路内部一组一组处理。
2.6 左移寄存器
把连接方向反过来:接串行输入,,,,代码就从向方向移动,叫左移。"左""右"只是相对于画图方向的叫法,关键看数据从哪一端进、往哪一端走。
用 JK 触发器也能组成移位寄存器:把每一级接成 D 触发器的形式(、,即、),功能完全一样。
2.7 易错点 ⚠️
- ⚠️ 逐拍列表时,每一位都取前一位的旧值。最常见的错误是用刚更新的去算,导致"一拍挪好几位"。
- ⚠️ 串行输入位数据需要个移位脉冲才能全部进入;并-串输出也需要个脉冲才能全部送出。
- ⚠️ 写状态时先说明位的顺序(本讲统一写成,与教材一致)。
三、双向移位寄存器 74HC194
3.1 大白话:一个多功能储物柜
实际芯片往往把"清零、保持、右移、左移、并行置数"几种功能做在一起,用几个控制端来选择。74HC194(教材写作 74HC194A)就是典型的 4 位双向移位寄存器。
3.2 引脚
| 引脚 | 读法 / 作用 |
|---|---|
| 4 位并行输出 | |
| 4 位并行数据输入 | |
| 右移串行输入端(R = Right),右移时送进 | |
| 左移串行输入端(L = Left),左移时送进 | |
| 、 | 工作方式控制端 |
| 置零端,低电平有效,正常工作时接高电平 | |
| CLK | 时钟,上升沿触发 |
图 3:74HC194 引脚示意。橙色虚线把接回,配合右移就构成环形计数器(虚线流动为动画效果)
3.3 功能表(以教材表 6.3.2 为准)
| 工作状态 | |||
|---|---|---|---|
| 0 | × | × | 置零 |
| 1 | 0 | 0 | 保持 |
| 1 | 0 | 1 | 右移 |
| 1 | 1 | 0 | 左移 |
| 1 | 1 | 1 | 并行输入 |
每种状态下时钟上升沿到来后的结果:
| 工作状态 | ||||
|---|---|---|---|---|
| 置零(,不等时钟) | 0 | 0 | 0 | 0 |
| 保持 | ||||
| 右移 | ||||
| 左移 | ||||
| 并行输入 |
记忆法:看成一个两位二进制数——0 保持,1 右移,2 左移,3 置数。
3.4 内部原理:每一位前面有个 4 选 1
以第二位为例,它的输入端前面是一个由与或非门和反相器组成的、具有互补输出的 4 选 1 数据选择器,就是地址:
- 选中(自己)→ 保持;
- 选中(左边一位)→ 右移;
- 选中(右边一位)→ 左移;
- 选中(并行数据)→ 置数。
写成状态方程(就是第 10 讲 4 选 1 的表达式):
(Python 对 64 种组合穷举,与功能表一致。)其余三位同理,只是的"左边一位"换成,的"右边一位"换成。
3.5 例题 3:按控制信号逐拍填状态(典型考法)
题:74HC194 依次进行下列操作,写出每步之后的: ① ;② 、,,来一个上升沿;③ ,,来一个上升沿;④ ,,来一个上升沿;⑤ ,,来一个上升沿;⑥ ,来一个上升沿。
解:
| 步骤 | 操作 | 计算 | |
|---|---|---|---|
| ① | 置零 | 立即全部清 0 | 0000 |
| ② | 并行输入 | 1011 | |
| ③ | 右移, | ,,, | 0101 |
| ④ | 右移, | ,其余取左边旧值 | 1010 |
| ⑤ | 左移, | ,,, | 0101 |
| ⑥ | 保持 | 不变 | 0101 |
(Python 用功能表模型逐步模拟,结果一致。)
3.6 两片级联成 8 位双向移位寄存器
教材给出的接法很简单:
- 第一片的接第二片的(右移时数据从第一片流进第二片);
- 第二片的接第一片的(左移时数据从第二片流回第一片);
- 两片的、、CLK、分别并联。
整体就是 8 位:右移时数据从第一片的进,依次经过第一片的、再进入第二片的;左移时从第二片的进,方向相反。
例如 8 位内容为 1011 0000(前 4 位是第一片),右移两次,得到 0010 1100(Python 核对)。
3.7 易错点 ⚠️
- ⚠️ 是右移、是左移,不要记反;右移的新数据从进,左移的新数据从进。
- ⚠️ 低电平有效,且优先级最高:它为 0 时,和时钟都不起作用。
- ⚠️ 并行置数也要等时钟上升沿才生效,和的立即清零不同。
四、移位寄存器的应用
4.1 数据的串-并、并-串转换
见 2.4、2.5 节:串行进、并行出,或并行进、串行出。
4.2 乘 2、除 2
如果把当作数的最低位、当作最高位,那么右移()就是把每一位挪到权重大一倍的位置上,相当于乘以 2(补 0);左移相当于除以 2(舍去最低位)。
例:寄存器里存 3,即(写作)。右移一次()得 0110,值为;再左移一次()又回到 3(Python 核对)。
教材例 6.3.1 正是利用这一点:两个 8 位移位寄存器分别存、,按时钟让右移 3 位、右移 1 位,再用加法器相加,得到。
⚠️ "左移乘 2 还是右移乘 2"取决于哪一端是最低位,题目里一定要先看清位权,不能死记。
4.3 数据延迟
串行数据从进去,要经过个时钟才从出来,相当于把信号延迟了个时钟周期。
五、预告:移位寄存器型计数器
把移位寄存器的串行输出反馈回串行输入,就得到不用加法也能"数数"的计数器。
5.1 环形计数器
令(74HC194 中把接,右移,见图 3 虚线)。先置入 1000,此后每来一个时钟,那个 1 就循环右移一位:
4 个状态循环,可以数 4 个时钟;而且每个状态只有一个 1,直接看哪个为 1 就知道数到几,不用译码。
但 4 个触发器共有 16 个状态,有效循环只用了 4 个。用 Python 把 16 个状态全部模拟一遍,发现还有 0000、1111(停在原地)以及 0011→1001→1100→0110、0101→1010、0111→1011→1101→1110 等几个无效循环——所以基本环形计数器不能自启动,使用前必须先置入有效状态。
5.2 扭环形计数器(约翰逊计数器)
令(反相后送回),从 0000 开始:
位移位寄存器得到个有效状态,利用率比环形计数器高一倍,而且每次只有一位变化,译码时不会产生竞争-冒险。但剩下的 8 个状态自成另一个循环,所以基本扭环形计数器同样不能自启动。第 14 讲例 2 的三位电路正是三位扭环形计数器,我们已经学过怎样修改反馈逻辑让它自启动。
这两种计数器的自启动设计,在后面计数器和时序电路设计的讲次里还会系统展开。
速记卡
| 知识点 | 要点 |
|---|---|
| 数码寄存器 | 个触发器共用时钟,,并行入并行出;74LS75 用锁存器(电平触发),74HC175 用边沿 D 触发器 |
| 右移寄存器 | ,;每拍整体右移一位 |
| 为何只挪一位 | 边沿触发 + 传输延迟:同一拍各级都按前一级的旧值翻转 |
| 串-并 / 并-串 | 串行位需个脉冲;先进的位最终在最远端 |
| 74HC194 控制 | 置零(优先);:00 保持、01 右移、10 左移、11 并行输入 |
| 右移 / 左移 | 右移:;左移: |
| 内部原理 | 每位前一个 4 选 1,为地址 |
| 8 位级联 | 片 1 的片 2 的;片 2 的片 1 的;控制端、时钟并联 |
| 乘除 2 | 移向高位权 = ×2,移向低位权 = ÷2,先看清哪端是最低位 |
| 环形计数器 | ,个有效状态,不能自启动 |
| 扭环形计数器 | ,个有效状态,不能自启动,每次只变一位 |
自测练习
1. 4 位右移寄存器(D 触发器构成,,),初态,串行输入依次为 1、1、0、1,写出每个时钟后的状态。
答案与提示
1000 → 1100 → 0110 → 1011。第 4 拍后最先送入的 1 到了,最后送入的 1 在。(Python 核对。)
2. 74HC194 初态,,依次进行:右移()、右移()、左移()、保持、并行输入(),每步一个上升沿。写出每步后的状态。
答案与提示
1011 → 1101 → 1010 → 1010 → 1001。第 3 步左移时现态是 1101,所以、、、,得 1010。(Python 核对。)
3. 用一个 8 位移位寄存器把串行送来的 8 位数据变成并行输出,至少需要几个移位脉冲?若要把并行置入的 8 位数据串行送出,又需要几个?
答案与提示
都需要 8 个移位脉冲:串行输入 8 位要移 8 次才能全部进入;并行置入后连续加 8 个移位脉冲,8 位代码依次从串行输出端送出(2.5 节表中 4 位的情形是 4 个脉冲)。
4. 4 位环形计数器(,右移)预置 1000,写出有效循环。它能自启动吗?为什么?
答案与提示
1000 → 0100 → 0010 → 0001 → 1000,4 个有效状态。不能自启动:其余 12 个状态构成 0000、1111 自环以及 0011→1001→1100→0110、0101→1010、0111→1011→1101→1110 等无效循环,进入后回不到有效循环。(Python 列出全部循环核对。)
5.(华师风格)用 74HC194 接成右移方式(),,从 0000 开始。写出状态序列,说明是几进制计数器,并判断能否自启动。
答案与提示
每拍,其余右移:0000 → 1000 → 1100 → 1110 → 0111 → 0011 → 0001 → 0000,有效循环 7 个状态,是七进制计数器。用 Python 模拟全部 16 个状态,只存在这一个循环,其余 9 个状态都会进入它,所以能自启动。
6. 3 位扭环形计数器(,右移,状态写作)有几个有效状态?无效状态是哪些?
答案与提示
有效循环 000 → 100 → 110 → 111 → 011 → 001 → 000,共 6 个()。无效状态 010、101 互相转换(010 → 101 → 010),不能自启动。
7. 能否用电平触发的 D 锁存器代替边沿 D 触发器组成移位寄存器?为什么?
答案与提示
不能。CLK 有效期间所有锁存器都是透明的,的数据会连续穿过多级,一个时钟内移动不止一位。必须用边沿触发器(或输出在有效电平结束后才变化的脉冲触发主从触发器),保证每个时钟每级只按前一级的旧值翻转一次。
8. 两片 74HC194 级联成 8 位右移寄存器,8 位内容(片 1 的,片 2 的)为 1011 0000,,右移两次后内容是什么?片间怎样连接?
答案与提示
0010 1100。连接:片 1 的接片 2 的;若要双向,再把片 2 的接片 1 的;两片的、、CLK、分别并联。(Python 核对。)
下一讲预告
第 16 讲(上):从 T' 触发器的翻转出发,搭出同步、异步二进制和十进制计数器,弄清它们的原理和状态转换规律。
👉 点击进入下一讲:第16讲(上)|同步/异步计数器的原理
评论
还没有评论。 来写第一条。