
在数字电子学的世界里,触发器是构成存储器的基本单元,能够保存一位信息。虽然特性表能让我们通过预测电路的下一个状态来分析现有电路,但对于设计师而言,真正的挑战在于综合:我们如何构建一个能按特定、预期方式运行的电路?这需要我们转换视角,从“将会发生什么?”转变为“我如何让它发生?”我们需要一个工具,在给定当前状态和期望的下一状态后,能准确地告诉我们实现这一转换需要什么样的输入信号。
本文将介绍这一关键工具:触发器激励表。它是开启系统化时序电路设计大门的万能钥匙。我们将首先在“原理与机制”部分探讨其核心概念,您将学习如何推导D、T、SR和JK触发器的激励表,并特别关注强大的“无关项”。随后,“应用与跨学科联系”部分将演示如何运用这些知识来构建实用电路,从用一种触发器仿真另一种,到设计复杂的同步计数器和有限状态机,如序列检测器和交通信号灯控制器。
在之前的学习中,我们已经了解了触发器——数字世界中构成存储器的基本单元。我们知道它可以保存一位信息——0或1——并且了解了它的特性表。这个特性表就像一个水晶球,能根据触发器的当前状态及其输入,告诉我们它的下一状态是什么。如果您要分析一个别人已经建好的电路,这个表会非常有用。您可以按部就班,一步一步地推算出其行为,预测未来。
但如果您是架构师呢?如果您试图构建一个机器来执行特定任务呢?您的问题不是“将会发生什么?”,而是“我如何让某件事发生?”您知道自己所处的位置(当前状态,)和想去的地方(期望的下一状态,)。您的问题在于,需要弄清楚应该施加什么样的指令——也就是输入信号——来确保这一转换的发生。
这种从分析到综合的视角转变,需要一个新的工具。我们需要逆向思考。我们不再是从输入预测输出,而是要为期望的输出确定所需的输入。这个新工具,这本指导如何命令触发器的“说明书”,被称为激励表。它是时序电路设计的万能钥匙。
让我们想象一下如何构建这样一本说明书。这个过程是一项愉快的逻辑推理工作。我们利用触发器的已知行为,即其特性表所描述的行为,然后简单地反向推导。对于每一种可能的状态转换——从0到0,0到1,1到0,以及1到1——我们都问自己:“什么样的输入或输入组合可能导致了这个结果?”
D触发器(或称“数据”触发器)是所有触发器中最直接的一种。它的规则很简单:下一状态就是D输入的值。它的特性方程堪称优雅:
那么,我们如何构建它的激励表呢?如果我们希望下一状态是0,必须是什么?当然,必须是0。如果我们希望下一状态是1,必须是什么?它必须是1。当前状态是什么完全不重要!指令是绝对的。
由此,我们得到以下激励表:
| 所需的 | ||
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
请注意一个显著的特点:的每一个条目都是严格确定的。没有模棱两可之处,没有选择余地。这就是为什么D触发器的激励表中不包含“无关项”的原因。这种直接性是它的巨大优势,但也暴露了其局限性。例如,如果您想让一个D触发器翻转(即在每个时钟脉冲时改变其状态),您不能简单地将其输入固定连接到'1'或'0'。为了让它翻转,您需要。由于,这意味着您必须确保。您必须将其自身的反相输出反馈到其输入端——这一要求由其激励表清晰地揭示出来。
T触发器(或称“翻转”触发器)专为一件事而生:决定是否改变。如果其输入为0,它就保持状态。如果为1,它就翻转(改变)状态。其特性方程使用异或(XOR)运算:
为了找出激励条件,我们只需重新整理这个方程来解出:。让我们看看各种转换:
因此,其激励表呈现出优美的对称性:
| 所需的 | ||
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
同样,没有模棱两可之处。保持的指令是;翻转的指令是。
现在我们来到了故事中最有趣的部分。当有多种方式可以实现同一种状态转换时,会发生什么?这正是真正设计灵活性的来源,体现在一个极其强大的概念中:无关项。我们用'X'来表示它。激励表中的'X'并不意味着我们不知道这个值;它意味着我们可以自由选择这个值——0或1——选择那个能让我们设计师的工作变得更轻松的值。
让我们从SR(置位-复位)触发器开始。我们知道它的基本规则:将输出置为1,将其复位为0,使其保持状态。输入组合是禁止的。让我们来构建它的激励表:
这种自由度使得SR触发器比D或T类型更灵活。但JK触发器将此提升到了一个全新的水平。它利用了SR触发器的禁用状态(),并赋予它一个有用的功能:“翻转”。让我们看看这对它的激励表有什么影响:
看看这个!JK触发器对*每一种可能的状态转换*都有一个“无关项”。这使它成为所有标准触发器中功能最全、最灵活的一种,是电路优化的无可争议的冠军。
| 转换 | D 输入 | T 输入 | SR 输入 | JK 输入 |
|---|---|---|---|---|
| 0 | 0 | |||
| 1 | 1 | |||
| 0 | 1 | |||
| 1 | 0 |
为什么这种灵活性如此重要?因为它能让我们构建更简单、更便宜、更快速的电路。当我们设计一个状态机,比如计数器时,我们从一个显示所需状态序列的状态图开始。对于每个状态和每个触发器,我们使用激励表来确定所需的输入。
这些要求,包括所有的'X',为驱动触发器输入的逻辑门构成了一个真值表。“无关项”是我们的王牌。当我们使用像卡诺图这样的工具来简化逻辑时,我们可以将每个'X'视为0或1——选择任何一个能让我们形成最大可能分组并因此生成最简布尔表达式的选项。更简单的表达式意味着更少的逻辑门。
这个原理是普适的。我们甚至可以发明我们自己的假设触发器,比如一个只能“保持”或“预置”到1的触发器。通过分析其行为,我们可以推导出它的激励表。我们可能会发现某些转换是不可能的,而另一些则提供了“无关项”,为任何设计提供了宝贵的信息。
但是,如果我们懒得利用“无关项”进行优化会怎样?如果在JK触发器设计中,我们决定将所有'X'都视为0呢?最终的电路可能会比它本可以达到的更复杂,但令人惊讶的是,它仍然可以完美工作!这是最后一个深刻的教训:“无关项”代表的是一个机会,而非必需。它是选择阻力最小路径的自由,是开启优雅高效数字设计大门的钥匙。
掌握了触发器激励表的原理后,我们现在站在一个绝佳的起点。我们就像一个刚学会一门新语言语法规则的人。起初,一切都关乎记忆规则和表格。但真正的乐趣在于当你开始用这些规则写诗、讲故事、构建世界时。激励表就是数字设计的语法,我们现在准备好写一些“诗篇”了。它是我们的罗塞塔石碑,让我们能将对电路行为的抽象期望,转化为逻辑门的具体物理结构。让我们踏上旅程,看看我们能构建出什么。
这项知识的首个也是最具启发性的应用之一,有点像数字炼金术:将一种类型的组件转变为另一种。假设你的工具箱里装满了JK触发器,但你的设计需要一个D型触发器。你需要订购新零件吗?完全不需要!我们可以教会我们的JK触发器像D触发器一样工作。
目标很简单:我们希望时钟脉冲后的输出与脉冲前的数据输入完全相同。也就是说,我们要强制实现关系。然而,JK触发器遵循它自己的特性方程:。我们的任务是选择输入和(作为的函数),使得这个复杂的方程简化为。
让我们思考一下。我们希望右边的等于。注意到这个表达式依赖于当前状态,但我们期望的结果却不依赖!我们需要选择和来消除这种依赖性。一个绝妙的选择出现了:如果我们设置和会怎样?让我们将其代入JK方程:
提取公因式,我们得到:
由于对于任何布尔变量,我们知道,这可以完美地简化为:
它完美地工作了!通过将输入直接连接到,并通过一个反相器连接到,我们实际上用一个JK触发器制造出了一个D触发器。这不仅仅是一个聪明的技巧;它揭示了这些构建模块之间的基本关系,并表明JK触发器在某种意义上比D触发器更“强大”或更“通用”,因为它可以用简单的外部逻辑来仿真它。
也许触发器最常见和最重要的应用是创建计数电路。这些计数器是数字系统的心跳,为从微处理器到数字时钟的一切提供时序和顺序。使用我们的激励表,我们可以设计一个计数器来遵循我们选择的任何节奏。
让我们从设计一个3位同步二进制递减计数器开始,它从7(111)递减到0(000)并循环重复。状态由三个触发器保存。我们只需写下期望的序列,并观察每一位何时需要改变。
这里蕴含着一种纯粹的美感。我们如何让一个JK触发器翻转?我们设置和。我们如何让它保持其值?我们设置和。所以,一个位必须翻转的条件逻辑,就变成了其J和K输入的逻辑!
看看这有多简单!通过理解JK触发器的“翻转”模式,我们绕过了逐行填写激励表的整个过程,通过纯粹的推理得出了最终的、优雅的逻辑。
一个自由运行的计数器很有用,但一个可控的计数器则更有用。如果我们想暂停计数怎么办?我们可以添加一个“使能”输入。逻辑很简单:如果,计数器应如常工作;如果,它应保持其状态。我们可以通过简单地将使能信号与我们的翻转条件进行“与”运算来实现这一点。对于一个带使能的2位递增计数器,逻辑变为:
当时,所有的J和K输入都变为0,每个触发器都进入“保持”状态。这是一种极其简单且可扩展的添加控制的方式。我们可以将这个想法扩展到创建可以改变方向的计数器,比如一个根据控制输入向上或向下计数的格雷码计数器。设计过程保持不变:为每种情况定义状态转换,并推导出选择正确行为的逻辑。
计数器不必遵循简单的二进制序列。它们可以被设计成按我们能想象的任何状态序列进行步进。在这里,我们看到“计数器”只是对特定类型有限状态机(FSM)的一个友好称呼。
想象一下,我们需要一个电路,按序列(二进制:)循环。或者一个跳过状态3和6的计数器。方法总是一样的:
这里出现了一个关键概念:那些不在我们序列中的状态怎么办?对于计数器,状态0、2、4和7是未使用的。由于机器永远不应进入这些状态,我们“不关心”如果它进入了会发生什么。这意味着在我们的J和K输入的真值表中,对应于这些未使用状态的行可以用“无关项”(X)值填充。这些“无关项”是设计师最好的朋友,因为它们为简化最终的逻辑门提供了额外的灵活性,通常能得到更便宜、更快的电路。这是实际数字设计中的一个关键原则。
当我们从单纯的计数转向设计与世界互动的通用控制器时,这种方法的真正威力就显现出来了。
考虑一个普通的十字路口交通灯。我们可以将其操作建模为一个有四个状态的FSM:
S0(南北绿灯,东西红灯)S1(南北黄灯,东西红灯)S2(南北红灯,东西绿灯)S3(南北红灯,东西黄灯)机器在这些状态之间按固定循环转换:S0 S1 S2 S3 S0。如果我们为这些状态分配二进制代码(例如,S0=00, S1=01, S2=10, S3=11),设计问题就变得与设计一个任意序列计数器完全相同!控制物理灯光的输出则只是基于当前状态的简单组合逻辑。这个例子优美地将状态机的抽象概念与我们熟悉的日常系统联系起来。
现在让我们设计一个有实际任务的电路:一个“数字侦探”,它监视一串输入的二进制数据流,寻找一个特定的模式,比如'011'。这是电信、数据处理和计算中的一项基本任务。
我们可以定义一些状态来代表我们在搜索过程中的“心路历程”:
S0:初始状态。我们还没有看到任何有用的东西。S1:我们刚刚看到了一个'0'。我们希望这是我们序列的开始。S2:我们已经看到了序列'01'。我们只需要再来一个'1'就能成功!这些状态之间的转换现在依赖于一个外部输入。例如,如果我们处于状态S1(我们看到了一个'0'),而下一个输入是'1',我们就移动到状态S2。如果输入是另一个'0',序列被打破,但这个新的'0'可能是新尝试的开始,所以我们停留在状态S1。如果我们处于状态S2,输入是'1',我们就找到了!我们输出一个'1',并且由于问题指定的是非重叠检测器,我们重置到S0以寻找下一个序列。
再一次,我们为S0、S1和S2分配二进制代码,创建我们的状态转换表(现在包括输入),并使用我们可靠的激励表来推导出J和K输入的逻辑。这个简单的FSM是计算机CPU在解码指令或网络路由器在检查数据包时内部深层工作的一个缩影。
最后,让我们退后一步,欣赏一下隐藏在这个设计过程中的一个微妙而优美的数学片段。当我们设计一个FSM时,我们经常有未使用的状态码,这给了我们“无关项”。JK触发器自身的激励表也充满了“无关项”。有人可能会想:我们总共能得到多少个“无关项”?一个聪明的状态分配是否能给我们更多无关项,从而使我们的逻辑更容易简化?
答案是令人惊讶的。对于给定的状态数和使用JK触发器的设计,激励表中“无关项”的总数是恒定的,与状态分配无关!
为什么?“无关项”有两个来源:
对于一个使用3个触发器的5状态机,我们有3个未使用状态和5个已使用状态。单个触发器输入(比如和)的无关项总数将是:
。
这个数字是固定的。改变状态分配会重新排列'0'、'1'和'X'在表中的位置,这会极大地影响最终电路的复杂性,但“无关项”的原始数量保持不变。这是一个深刻的见解。它将问题的抽象结构(其状态数,其用JK触发器实现的方式)与具体实现的细节(所选的特定二进制代码)分离开来。
因此,激励表不仅仅是一个设计辅助工具。它是一个连接行为与形式的数学结构,在研究它的过程中,我们揭示了这些优美的、潜在的不变性。这是一个完美的例子,说明了在科学和工程中,我们为解决问题而发明的实用工具,往往会成为通向更深层次、更优雅现实的窗口。