ARTICLE DETAIL

资讯详情

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

数电基础:时序电路的简单分析、设计方法

数电基础:时序电路的简单分析、设计方法 1. 绪论为什么要学习时序逻辑电路数字逻辑电路是构成现代计算机、通信设备、工业控制器和各类数字系统的基础。按照电路内部是否具有记忆功能数字逻辑电路可以划分为两大类组合逻辑电路和时序逻辑电路。组合逻辑电路的输出只由当前时刻的输入决定输入确定输出就确定电路本身不保存任何历史信息。时序逻辑电路则不同它的输出不仅与当前输入有关还与电路过去所处的状态有关。这种“能够记住过去”的能力使时序电路成为计数器、寄存器、状态机、存储器、处理器控制单元等一切复杂数字系统能够工作的核心机制。初学者在学习数电时往往对组合逻辑比较熟悉。与门、或门、非门、与非门、或非门、异或门等基本门电路构成的分析与设计问题本质上可以归结为逻辑函数的化简与实现。然而仅仅掌握组合逻辑远远不够。试想计算机的存储器单元为什么能够在断电前的瞬间保存数据程序计数器为什么能够一步一步地指向下一条指令交通灯为什么能够按照红灯、绿灯、黄灯的固定顺序循环切换这些问题都涉及对时间顺序的控制也就是时序逻辑电路的核心问题。从工程角度看时序电路学习的重点在于“时间”这一维度。组合电路通常只关心稳态下的输入输出关系时序电路则必须关心信号在什么时刻生效、状态在什么时刻发生改变、输出在什么时刻稳定有效。为此时钟信号、有效沿、建立时间、保持时间、竞争冒险、亚稳态等概念将贯穿整个学习过程。理解这些概念不仅有助于通过课程考试更是后续学习计算机组成原理、微处理器设计、现场可编程门阵列开发以及集成电路设计的基础。1.1 数字系统中的“记忆”问题组合电路无法记忆信息根本原因在于这类电路不存在反馈回路也不存在能够保持电平的储能元件。简单地说输入信号撤除以后组合电路的输出会立刻跟随输入变化原来的输出结果不会保留下来。时序电路则通过反馈或者专用的存储元件把某个时刻的逻辑电平保存起来以便在后续时刻继续使用。这种记忆能力可以直观地与机械开关或者电子门闩做类比。一个普通按钮开关按下时电路接通松开时电路断开开关本身并不记得“刚才是否按过”。而一个能够保持状态的开关例如具有自锁功能的按钮按下一次后即使松开电路仍然保持导通再按一次才断开。时序电路的存储元件类似后一种开关它能够在控制信号的作用下锁存一个逻辑值并在需要时保持这个值不变。1.2 从组合电路到时序电路的过渡要理解这一过渡可以从一个非常简单的实验出发把两个非门首尾相连构成一个由两个反相器组成的环形电路。单独观察时这个电路似乎没有明确输入输出但假设某个节点为高电平经过两个非门后仍然为高电平因此这个状态可以自发保持若该节点为低电平同样能够保持。这就构成了最基本的双稳态存储思想。实际电路中存储元件往往用两个交叉耦合的门电路来实现它们具有两个稳定状态分别表示逻辑0和逻辑1。进一步引入控制信号后存储单元就可以按照人的意愿被写入或读取。例如在交叉耦合电路的基础上增加置位端和复位端就得到SR锁存器增加使能控制端就能控制锁存器何时允许更新再通过主从结构或边沿触发结构就能得到只在时钟边沿采样数据的触发器。这一系列结构演变体现了从组合电路走向时序电路的自然过程也是本章后续内容的重要铺垫。2. 时序电路的基本模型与描述工具2.1 时序电路的一般结构模型在经典教材中时序电路通常被抽象为由组合逻辑电路和存储电路两部分构成的模型。组合逻辑电路接收两类输入信号一类是来自电路外部的外部输入信号通常记为X另一类是存储电路反馈回来的状态信号通常记为Q。组合逻辑电路经过运算产生两类输出信号一类是提供给电路外部的输出信号Z另一类是驱动存储电路的激励信号它们决定存储电路将要进入的下一个状态。存储电路在时钟信号或控制信号的作用下把激励信号保存为新的状态信息从而完成一次状态更新。这个模型可以用三个关键量概括现态、次态和输出。现态是存储元件在当前时刻保存的状态通常记作Qn次态是存储元件在下一个有效时钟信号到来之后将要进入的状态记作Qn1输出是电路对外表现的结果记作Z。时序电路的行为本质上就是研究现态、输入、次态和输出四者之间的关系。需要注意的是这里的“存储电路”不是抽象概念而是由具体触发器构成的寄存器组。所谓状态就是这一组触发器输出值的集合。如果电路中有n个触发器每个触发器有两种可能取值那么整个电路最多存在2n种状态。状态数量有限的时序电路在行为上等价于有限状态机。因此时序电路的分析与设计经常借助有限状态机的思想来完成。2.2 三大描述工具状态表、状态图与时序图由于时序电路行为与状态转换有关单纯使用逻辑表达式往往不够直观因此人们引入了状态表、状态图和时序图三种工具来辅助描述。状态表是一种表格描述方式表格中列出当前状态、输入信号以及对应的次态和输出。对于没有外部输入或者输入很少的电路状态表可以做成简单的状态转换表对于输入较多的电路则采用类似卡诺图的结构把输入组合作为分类条件。状态表的优点是信息完整、便于检查缺点是状态数量较多时表格较大。状态图是一种图形化描述方式用圆圈表示状态用带箭头的边表示状态转移边上标注引起该转移的输入条件以及对应的输出。状态图直观易懂特别适合分析状态较少的小型电路也适合描述状态机设计。时序图则从时间维度描述电路行为横轴为时间纵轴为各个信号的电平变化。通过时序图可以清楚地看到时钟、输入、各触发器状态和输出之间的先后关系与因果关系。在分析异步电路和验证电路时序时时序图尤其有用。3. 时序电路的分类同步与异步根据存储元件状态更新是否受统一时钟信号控制时序电路可以分为同步时序电路和异步时序电路两大类。这个分类直接影响分析与设计方法的复杂程度因此必须首先明确。3.1 同步时序电路同步时序电路中的所有触发器共用一个统一的时钟信号。当时钟的有效沿到来时所有受该时钟控制的触发器同时采样输入并在约定的时刻更新状态。在两次有效沿之间输入信号可以变化但触发器的状态保持稳定。同步时序电路的优点十分明显。第一结构规整所有状态变化点都被时钟沿对齐设计者可以按照统一流程进行分析和设计。第二便于处理毛刺问题因为组合逻辑产生的毛刺只要不出现在时钟采样窗口附近就不会被错误地存入触发器。第三便于使用硬件描述语言进行综合和验证现代电子设计自动化工具对同步设计有成熟的支持。正因如此当代数字系统设计中同步电路占据绝对主导地位。3.2 异步时序电路异步时序电路没有统一的公共时钟或者只有部分触发器受统一时钟控制。触发器的状态更新由不同事件触发例如外部输入的变化、其他触发器输出的变化甚至门电路延时的差异。因此异步电路的行为更加依赖信号到达的先后顺序和传播延时。异步时序电路的分析与设计比同步电路复杂得多。设计者必须仔细考虑每个触发器的有效时钟条件、各级信号的竞争关系以及毛刺是否会引起误动作。尽管异步电路在某些低功耗、高速度或无时钟场景中有独特优势例如异步先入先出队列、握手接口等但对于初学者来说学习重点应当放在同步时序电路上异步电路的理解可以建立在同步电路知识牢固之后。下表从多个角度对同步和异步时序电路进行比较。比较项目同步时序电路异步时序电路时钟信号所有触发器共用统一时钟无统一时钟由事件或延时驱动状态更新时刻仅在时钟有效沿更新由输入变化、触发器输出变化等事件决定分析与设计难度较低流程规范较高必须考虑竞争与延时抗毛刺能力较强时钟窗口屏蔽毛刺较弱毛刺可能引起错误翻转典型应用CPU内核、寄存器、流水线、计数器异步FIFO、握手协议、低功耗电路设计工具支持EDA工具支持成熟支持相对有限需人工分析时序4. 基本存储单元之一锁存器锁存器是电平敏感的存储器件。所谓电平敏感是指当控制信号处于有效电平时锁存器的输出会跟随输入变化当控制信号回到无效电平后输出保持不再改变。锁存器是触发器的基础理解锁存器有助于理解触发器的工作原理。4.1 SR锁存器SR锁存器是最简单、最经典的锁存器结构可以由两个交叉耦合的与非门构成也可以由或非门构成。以与非门构成的SR锁存器为例S端称为置位端R端称为复位端两个输出分别记为Q和Q的反相输出Q。当S为0、R为1时输出Q被置为1当S为1、R为0时输出Q被清为0当S和R都为1时锁存器保持原来的状态当S和R都为0时两个输出会同时变为1破坏了Q与Q互补的正常关系这种输入组合通常被列为禁止状态。SR锁存器的特性方程可以表示为Qn1等于S和Qn与非R的逻辑组合。使用中必须遵守约束条件SR等于0即S和R不能同时有效。这一约束使得SR锁存器在某些应用中使用不够方便但它揭示了锁存器通过反馈保持状态的基本原理因此具有重要的教学价值。为了增加控制能力可以在普通SR锁存器前加入使能门构成门控SR锁存器。当使能信号无效时S和R信号无法进入锁存器锁存状态不变当使能信号有效时电路行为与普通SR锁存器相同。门控SR锁存器为后续D锁存器和边沿触发器的设计提供了基础。4.2 D锁存器SR锁存器存在禁止输入组合使用起来不够安全。D锁存器通过增加一个非门使S和R始终保持互补关系从而从根本上消除了不确定状态。具体做法是输入D直接作为SD经非门取反后作为R。这样当D为1时相当于置位当D为0时相当于复位锁存器不会进入禁止状态。D锁存器的行为非常简洁。当使能信号E为高电平时输出Q跟随输入D当使能信号E由高变低后输出保持E下降沿到来前一瞬间D的值。因此D锁存器被称为透明的电平敏感锁存器。在使能有效期间如果输入端D出现毛刺输出Q也会跟随抖动这是锁存器的固有特点也是它在关键时序路径中使用时需要谨慎的原因。4.3 锁存器的特性与使用注意锁存器结构简单、速度快在某些设计中具有面积优势。但在同步设计中锁存器通常不推荐使用原因主要有两点。第一使能有效期间输出透明输入毛刺会直接影响输出时序分析困难。第二在硬件描述语言综合过程中如果代码对某些分支没有明确赋值综合工具很可能生成意外锁存器造成功能错误。因此在编写寄存器传输级代码时应尽量避免锁存器的无意生成。5. 基本存储单元之二触发器触发器是边沿敏感的存储器件。与锁存器不同触发器只在时钟信号的上升沿或下降沿这一短暂时刻采样输入并更新输出在其余时间保持输出不变。边沿触发特性使触发器能够在时钟有效沿附近屏蔽输入毛刺更加适合构成稳定可靠的同步时序电路。5.1 D触发器D触发器是最常用的触发器。它的特性方程非常简单Qn1等于D即次态直接等于输入D。由于输入与次态一一对应不存在不确定输入组合设计者可以把D端看成是想要写入的状态值。这种简洁性使D触发器在寄存器、数据通路、同步状态机中被广泛使用。从内部结构看D触发器通常由主从两个D锁存器级联构成。在时钟低电平期间主锁存器透明跟随输入在时钟上升沿瞬间主锁存器所存的值传递给从锁存器出现在输出端同时主锁存器与输入隔离。正是这种主从配合实现了数据在时钟边沿的一次性采样。下面给出一个带异步复位的上升沿D触发器的Verilog描述。// 上升沿D触发器带异步低电平复位 module d_ff ( input wire clk, input wire rst_n, input wire d, output reg q ); always (posedge clk or negedge rst_n) begin if (!rst_n) q 1b0; // 异步复位 else q d; // 时钟上升沿采样输入 end endmodule5.2 JK触发器JK触发器是针对SR锁存器禁止状态做出的改进。J端相当于置位控制K端相当于复位控制。当J为1、K为0时次态置1当J为0、K为1时次态清0当J和K都为0时状态保持当J和K都为1时输出翻转即次态等于现态取反。JK触发器的这种“双1翻转”特性使它非常适合实现计数器和各类分频电路。JK触发器的特性方程为Qn1等于JQn加KQn。从方程可以看出当J和K同时为1时次态恰好等于Qn实现翻转。与SR锁存器相比JK触发器在输入组合上没有任何禁止状态功能更加完备。5.3 T触发器T触发器可以看成JK触发器在J等于K时的特例。当T为1时触发器在每个时钟有效沿翻转一次当T为0时触发器保持状态不变。T触发器的特性方程可以写成Qn1等于T异或Qn。由于一位二进制计数器的规律正是每个计数脉冲翻转一次因此T触发器天然适合构成二进制计数器的每一位。实际芯片中独立的T触发器并不常见更多时候是用JK触发器或D触发器配合逻辑实现。下表汇总了常用存储器件的主要特性。器件类型触发方式特性方程或行为典型用途SR锁存器电平敏感置位、复位、保持SR1禁止消抖、基本存储演示D锁存器电平敏感使能有效时输出跟随输入总线保持、数据锁存D触发器边沿敏感Qn1D寄存器、状态机、数据通路JK触发器边沿敏感Qn1JQnKQn计数器、分频器T触发器边沿敏感Qn1T异或Qn二进制计数器位5.4 触发器的动态特性触发器在理想模型下只在时钟边沿采样但实际器件存在建立时间、保持时间和传播延时等动态参数。建立时间是指时钟有效沿到来之前输入数据必须提前稳定的最短时间保持时间是指时钟有效沿之后输入数据必须继续保持的最短时间。如果输入数据在建立时间或保持时间窗口内发生变化触发器可能进入亚稳态输出既不是0也不是1而是在中间电平持续一段时间后才随机稳定到某个值。传播延时是指时钟有效沿到输出发生改变之间的延时。此外还有复位恢复时间、最小脉冲宽度等指标。在实际电路设计中设计者需要参考器件数据手册确保所有路径的时序满足建立时间与保持时间要求。这些内容与时序分析中的静态时序分析密切相关是数字电路工程化的重要基础。6. 时序电路分析的基础三大方程时序电路分析是根据给定的电路图推导出电路的状态转换规律并用状态表、状态图或时序图描述其功能。分析是设计的基础只有看懂已有电路的行为才能进一步自己设计满足要求的电路。分析时序电路的核心工具是三大方程驱动方程、状态方程和输出方程。6.1 驱动方程驱动方程描述每个触发器输入端的逻辑表达式即每个触发器的D、J、K、T等激励信号与电路外部输入以及所有触发器现态之间的关系。写驱动方程时一般从电路图的每个触发器输入端开始沿着组合逻辑路径反向追踪直到用外部输入变量和各触发器输出变量把激励信号表示出来。例如如果某个D触发器的D端连接到一个与门与门的输入是外部输入X和另一个触发器输出Q0那么驱动方程就是D等于X与Q0。6.2 状态方程状态方程描述每个触发器次态与现态以及外部输入的关系。得到驱动方程后将其代入对应触发器的特性方程中即可得到状态方程。例如对于D触发器特性方程为Qn1等于D因此只要把驱动方程代入D端即可。对于JK触发器则要把J和K的驱动方程代入Qn1等于JQn加KQn的式子中再经过化简得到状态方程。6.3 输出方程输出方程描述电路外部输出与外部输入以及触发器现态之间的关系。对于Moore型电路输出只与现态有关对于Mealy型电路输出同时与输入和现态有关。写输出方程时从输出端出发反向追踪组合逻辑直达外部输入和触发器输出。三大方程共同构成了电路结构到电路功能之间的桥梁后续的状态表和状态图都由此推导得到。初学者最常见的错误是在写驱动方程时忽略某些输入变量或者在代入特性方程时搞错下标对应关系。建议养成固定习惯先对每个触发器命名并编号再按编号逐个写出驱动方程代入特性方程得到状态方程最后统一写输出方程。每一步都检查变量是否齐全能够有效减少差错。7. 同步时序电路的分析方法7.1 通用分析步骤同步时序电路的分析可以归纳为以下步骤。第一步根据电路图写出每个触发器的驱动方程。第二步将驱动方程代入相应触发器的特性方程得到状态方程。第三步写出电路的输出方程。第四步根据状态方程和输出方程列出状态转换真值表。第五步由状态转换真值表画出状态图或时序图并总结电路功能。其中列状态转换真值表的常用方法有两种。第一种是枚举法把n个触发器的所有2n种状态组合和所有输入组合都代入状态方程与输出方程逐项求得次态和输出。枚举法不容易遗漏但计算量随状态数指数增长。第二种是递推法从一个确定的初始状态出发代入方程得到次态再以次态为新的现态继续推导直到所有状态都被覆盖。递推法效率较高但需要保证初始状态选择合适并确认没有遗漏的分支。画状态图时通常以每个状态为节点以箭头表示状态转移箭头旁标注“输入/输出”或者直接标注输出。对于没有输入的计数器状态图退化为一个环形结构对于带输入的检测器状态图会呈现分支与合并。总结功能时应尽量用简洁准确的语言描述电路例如“四进制加法计数器”“重叠式110序列检测器”等。7.2 实例一两个D触发器构成的电路考虑一个由两个上升沿D触发器构成的电路触发器输出分别为Q1和Q0输入分别为D1和D0。设D1等于Q0D0等于Q1取反电路没有外部输入和外部输出只观察状态变化。写出驱动方程D1等于Q0D0等于Q1。由于使用的是D触发器状态方程直接为Q1n1等于Q0nQ0n1等于Q1n。假设初态Q1Q0为00代入状态方程得到次态为10再以10为现态得到次态为11由11得到01由01回到00。四个状态构成一个循环00、10、11、01、00。该电路是一个四进制计数器只是状态顺序不是自然二进制序而是格雷码序。这个例子说明即使电路只用了两个触发器只要驱动方程不同计数顺序也会不同。7.3 实例二带外部输入的电路当电路存在外部输入时状态转换关系需要用输入条件进行划分。设某电路有一个输入X、一个D触发器和一个输出Z。D端连接异或门异或门输入为X和Q输出Z由X与Q经过与门产生。驱动方程为D等于X异或Q状态方程为Qn1等于X异或Qn输出方程为Z等于X与Qn。当X为0时Qn1等于Qn电路保持当X为1时Qn1等于Qn电路翻转。输出Z只在X等于1且Q等于1时为1。因此该电路可以理解为一个受输入X控制的翻转器同时输出Z指示输入与状态同时为高。该实例说明引入外部输入后状态表需要按照输入取值分别列次态和输出状态图的每条转移边都要标注对应的输入条件。8. 异步时序电路的分析要点异步时序电路没有统一时钟各触发器的时钟信号来源可能不同。有的触发器由外部时钟直接驱动有的由其他触发器的输出驱动有的甚至由组合逻辑产生。分析异步电路时除了写出三大方程外还必须列出每个触发器的时钟方程明确其时钟端连接在哪个信号上、在什么边沿有效。计算次态时只有当某个触发器的时钟信号出现有效跳变时该触发器才按照状态方程更新如果时钟信号没有出现有效跳变即使该触发器的激励输入发生变化它仍然保持原状态。这一点与同步电路截然不同。同步电路中所有触发器共享同一时钟因此每个有效沿都同时触发所有触发器异步电路则必须逐个判断时钟是否有效。以异步二进制加法计数器为例最低位触发器直接由外部脉冲触发每个外部脉冲有效沿翻转一次次低位触发器以最低位输出的下降沿作为时钟因此最低位由1变0时次低位翻转更高位依次类推。这种逐级时钟传递方式实现了二进制计数。由于每一个触发器翻转都依赖前一级输出变化各级之间存在传输延时高位翻转滞后于低位因此异步计数器的时序不如同步计数器规整最高位变化最慢。分析异步电路时最直观可靠的方法是画时序图。将各触发器输出波形按照因果关系逐位画出观察哪些跳变会作为下一级触发器的时钟从而判断每级是否翻转。画时序图的过程虽然繁琐但能够有效避免在时钟条件判断上的错误。8.1 异步电路分析实例设一个电路包含两个T触发器两个T端都固定接高电平即始终处于允许翻转状态。第一个触发器由外部时钟下降沿触发第二个触发器由第一个触发器输出的下降沿触发。分析时先看最低位每个外部时钟下降沿最低位翻转一次。最低位从1变0时产生下降沿驱动高位翻转。因此电路状态依次为00、01、10、11再回到00构成自然二进制加法计数器。值得注意的是如果第二级触发器改为由Q1的上升沿触发则状态顺序会改变。这充分说明异步电路的分析必须结合触发器的边沿类型。对于复杂异步电路建议先写出每个触发器的时钟方程和状态方程再按照“先确定各级时钟是否有有效沿再决定是否更新状态”的规则逐步推导。9. 时序电路设计的总体流程时序电路设计可以看作分析的逆过程。设计任务通常是根据一段文字描述的功能要求得到能够实现该功能的逻辑电路图。设计比分析更依赖经验但遵循固定步骤可以显著降低出错概率。同步时序电路设计的一般步骤如下。第一步分析设计要求明确电路的输入、输出和状态含义必要时画出原始状态图。第二步进行状态化简合并等价状态减少状态数量。第三步进行状态编码为每个状态分配一组二进制代码。第四步选择触发器类型并根据状态转换关系确定每个触发器的输入激励。第五步写出激励方程和输出方程并尽可能化简。第六步根据方程画出逻辑电路图必要时检查自启动能力。这六个步骤构成一个完整闭环。初学者最容易忽视第一步和第六步直接跳入方程推导。实际上状态的定义是否准确直接决定整个设计的正确性而自启动检查则决定电路在受到干扰进入无效状态后能否自行恢复。下面几节将依次展开状态化简、状态编码、触发器选型等关键环节并用若干例题串联整个流程。10. 状态图与状态表的建立状态图是设计的起点也是沟通文字功能要求与逻辑实现的桥梁。建立状态图的过程本质上是把“设计要求”翻译为“状态、输入、次态、输出”四个集合及其关系的过程。10.1 确定输入输出和状态含义首先明确电路有哪些输入信号、哪些输出信号。例如设计一个序列检测器输入通常是一个串行数据X输出通常是一个检测结果Z。然后思考电路需要“记住”哪些信息以便对后续输入做出正确响应。需要记住的每一种不同历史情况都可以成为一个候选状态。以检测序列110为例电路需要记住当前已经连续匹配的位数尚未收到有效开始位、已收到一个1、已收到两个1、已收到完整110。这四种情况对应四个状态。对于其他设计例如计数器状态由计数值直接给出对于交通灯控制器状态由各方向灯的组合给出。10.2 建立原始状态图确定候选状态后按照输入的所有可能取值从每个状态画出转移到次态的箭头并标注输出。建立原始状态图时不必过度考虑状态是否冗余重点是完整、正确地反映设计要求。例如检测110时从“已收到一个1”的状态如果输入为1则进入“已收到两个1”如果输入为0则回到“尚未收到有效开始位”。在输入为0时输出为0只有完整检测到110时才输出1。原始状态图建立后应逐项检查是否覆盖了所有输入组合是否有明确的次态和输出是否有遗漏的状态转移。这个阶段宁可状态多、描述详细也不要为了简洁而遗漏功能。后续的状态化简会专门处理冗余状态问题。11. 状态化简与等价状态11.1 为什么需要状态化简状态数量直接影响触发器数量。n个触发器最多表示2n个状态因此状态越多需要的触发器可能越多电路越复杂成本越高。从文字描述直接得到的原始状态图往往包含冗余状态其中一些状态在外部观察者看来完全相同完全可以合并。状态化简的目标是找到一个与原始状态图功能等价但状态数目最少的状态图。两个状态的等价定义为在所有可能的输入序列作用下它们产生的输出序列完全相同并且它们的次态也等价或相同。这意味着如果电路处于两个等价状态中的任意一个外部无法通过输入输出行为区分它到底处于哪个状态。因此这两个状态可以合并为一个状态而不改变电路功能。11.2 隐含表化简法状态化简的常用方法之一是隐含表法。其步骤如下。首先列出除相同状态对之外的所有状态两两组合形成一张三角形表格。其次逐对检查在相同输入下的输出是否一致如果输出不一致直接标记为不等价如果输出一致则记录这对状态的次态对这些次态对称为该状态对的等价条件。然后反复扫描表格如果某状态对的任何一个次态对已经被标记为不等价那么该状态对也不等价将其标记。直到不再产生新标记为止。最终未被标记的状态对就是等价状态对。根据等价状态对可以进一步找出最大等价类把每个最大等价类中的状态合并成一个新状态从而得到化简后的状态图。隐含表法系统性强适合状态数量较多的情形。对于只有三五个状态的简单电路也可以直接观察状态图合并等价状态但判断标准必须严格合并后的状态必须在任意输入序列下都保持相同的输出和次态行为。11.3 状态化简实例设某原始状态机有五个状态A、B、C、D、E。通过逐个比较可以发现状态A和C在相同输入下输出相同并且次态也对应为同一状态或等价状态因此A与C等价可以合并。再比较其余状态对若不再有其他等价对则化简后状态数由五个减少为四个。实际题目中折半或减少一个状态的情况很常见。通过状态化简可以降低后续编码和逻辑实现的复杂度。12. 状态编码状态化简之后需要给每个状态分配一组二进制代码这一步称为状态编码或状态分配。不同编码方案会影响激励方程和输出方程的复杂程度进而影响最终电路的规模。状态编码没有唯一正确答案但合理的选择能够明显简化电路。12.1 状态编码的基本原则状态编码通常遵循几个直观原则。第一初始状态建议编码为全零例如00或000这样上电复位时容易把电路置于确定状态。第二相邻状态尽量分配相邻代码即两个有直接转移关系的状态最好只有一位二进制数不同。第三输出相同的状态尽量分配相邻代码以利于输出函数化简。第四转移频率高的状态对应分配相邻代码从而在化简激励方程时产生更多共享项。以三状态电路为例若状态A、B、C之间的转移关系为A到B、B到C、C到A可以把A编码为00、B编码为01、C编码为11。这样A到B和B到C的转移都只改变一位只有C到A改变两位。若把C编码为10则B到C改变两位、C到A改变一位逻辑化简结果很可能不同。选择哪种方案需要结合具体方程综合判断必要时可以尝试几种编码后比较。12.2 编码与触发器数量的关系若化简后有m个状态则至少需要n个触发器满足2n大于等于m。当m恰好等于2的幂次时所有代码组合都被有效状态使用不存在无效状态当m小于2n时会存在若干未被使用的无效代码这些代码构成无效状态。无效状态并非无关紧要因为电路在受到干扰时可能进入无效状态。因此编码后需要检查电路的自启动能力即无论电路进入哪个无效状态都要能在有限时钟周期内回到有效循环。13. 触发器选型与激励表状态编码完成后需要选择使用哪种触发器实现状态寄存器并求出每个触发器的激励输入。激励表描述的是为了实现从现态Qn到次态Qn1的指定转换触发器输入端需要施加什么信号。不同类型触发器的激励表不同。13.1 D触发器激励表对于D触发器由于Qn1等于D激励表极其简单无论现态如何只要把要求的次态直接送到D端即可。因此D触发器的激励方程与状态方程形式完全相同设计最方便。正是这种直观性使D触发器成为现代数字系统中最常用的触发器。13.2 JK触发器激励表对于JK触发器需要根据现态到次态的转换确定J和K的取值。若要求0保持不变即0变0则J可取0K任意若要求0变为1则J必须为1K任意若要求1变0则J任意K必须为1若要求1保持则J任意K可取0。利用K的无项进行化简往往能够得到较简单的激励方程。13.3 T触发器激励表对于T触发器状态保持时T为0状态翻转时T为1。因此只要观察每个触发器在状态转移中是否需要翻转就能写出T激励。若某位在转移前后相同T取0若不同T取1。T触发器的激励表同样简洁在计数器设计中较为方便。13.4 激励方程的化简得到激励表后对每个触发器的每个激励输入分别画卡诺图利用真值表中出现的任意项进行化简得到最简激励方程。输出方程也一并按卡诺图化简。最后根据化简后的激励方程和输出方程画出逻辑电路图。对于复杂设计可以借助逻辑综合工具完成化简但手算练习有助于理解化简过程。14. 同步时序电路设计实例14.1 例一设计同步四进制加法计数器要求设计一个同步四进制加法计数器状态按自然二进制顺序循环00、01、10、11、00。电路没有外部输入只要时钟作用下自动循环。状态图就是一个四状态环形。状态编码已由题意给出。使用D触发器实现。观察低位Q0的变化规律00到01时Q0由0变101到10时Q0由1变010到11时Q0由0变111到00时Q0由1变0。可以看到Q0在每个状态转换中都翻转因此D0等于Q0取反。观察高位Q1Q1在计数从01到10时由0变1从11到00时由1变0其他状态保持不变。整理后可得到D1等于Q1异或Q0。电路只需两个D触发器加一点组合逻辑即可实现。该设计也可以使用T触发器完成令T0恒为1T1等于Q0。因为低位每个周期翻转高位只在低位为1时准备翻转。相比D触发器方案T触发器方案更加直观地体现了计数规律。两种实现的对比有助于理解不同触发器激励表带来的设计差异。14.2 例二设计一个重叠式序列检测器要求设计一个能够检测输入序列110的电路。输入信号X串行进入当检测到连续输入110时输出Z为1否则为0允许重叠检测。前文已经建立四个状态S0表示尚未收到有效位S1表示已收到一个1S2表示已收到11S3表示已收到完整110。状态转移如前所述从S3接收1时转到S1而不是S0以实现重叠检测。使用两个D触发器编码四个状态例如S0为00、S1为01、S2为10、S3为11。按照状态转换关系写出状态方程和输出方程代入D触发器得到激励方程并化简即可画出电路。设计的关键是正确理解重叠检测的含义在序列110110中应检测到两次110第二次检测的起始位置与第一次检测的末位重叠了一位1。类似题目还包括检测101、检测1001等原理相同。完成纸面设计后建议用硬件描述语言仿真验证。15. 计数器设计专题15.1 同步计数器的一般设计方法计数器是最常用的时序电路之一可以用来统计脉冲个数、产生定时信号、构建分频器和地址发生器。同步计数器因各触发器同时受统一时钟控制而得名其设计完全可以套用同步时序电路通用流程。设计模N同步计数器本质上就是构造一个包含N个有效状态的环形状态图。通常采用自然二进制编码。例如模六计数器的有效状态依次为000、001、010、011、100、101然后回到000而110和111为无效状态。对于无效状态有两种处理策略一是设计成自启动电路使电路一旦进入无效状态也能在有限时钟内回到有效循环二是加入复位逻辑通过上电复位或人工复位强制恢复到初始状态。无论采用哪种方式设计完成后都应检查自启动能力。列状态表时如果状态转换由计数规律直接给出可以不必画复杂状态图直接写出各触发器在每个状态下的次态。利用激励表求出各触发器激励输入后画卡诺图化简。无效状态通常在卡诺图中作为任意项处理这有助于简化逻辑但处理不当也可能使电路在无效状态下死锁。因此需要单独分析无效状态的自启动路径。15.2 利用集成计数器构成任意进制计数器实际工程中很少从门电路开始搭建计数器而是使用中规模集成计数器例如74LS161同步四位二进制加法计数器。利用同步置数端或异步清零端可以方便地构成任意进制计数器。反馈清零法是在计数到某个数值时通过译码产生清零信号使计数器立刻回到全零状态。例如用74LS161构成模六计数器当输出为0110即十进制6时产生异步清零信号使计数器瞬间回到0000。由于0110只短暂出现计数循环实际为0到5共六个状态实现了模六计数。反馈清零法结构简单但异步清零信号存在短暂毛刺且清零瞬间可能影响可靠性。同步置数法则利用置数控制端当计数到达某个值时在下一个时钟沿把计数器置为指定初值。相比异步清零同步置数没有清零瞬间的过渡毛刺时序更可靠是更推荐的工程做法。集成计数器设计的关键在于正确译码出反馈状态并恰当地连接清零或置数控制端。例如用74LS161构成模六计数器既可以清零到0000也可以置数后从某个初值开始计数。16. 序列检测器的Mealy型与Moore型设计状态机按照输出与输入的关系可分为Mealy型和Moore型。Mealy型状态机的输出不仅取决于当前状态还与当前输入有关Moore型状态机的输出只取决于当前状态。二者的差异直接影响状态图、状态表和输出时序。16.1 Mealy型序列检测器以检测110为例Mealy型实现中输出标注在状态转移边上表示该输出伴随特定输入和状态转移产生。例如从S2接收0转移到S3时输出Z为1其余转移输出为0。Mealy型状态机通常状态数较少例如检测长度为k的序列Mealy型往往只需k个状态。但其输出随输入变化可能在输入变化期间产生毛刺。如果输出需要严格与时钟对齐Mealy型输出的时序特性需要特别处理。16.2 Moore型序列检测器Moore型实现要求输出只与状态有关因此需要一个额外状态专门表示“已检测到完整序列”。检测110时设S0为未收到有效位S1为已收到1S2为已收到11S3为已收到110并输出1。状态数比Mealy型多一个但输出在状态稳定后保持波形规整、毛刺少。如果输出在时钟边沿后被寄存器锁存则可以获得完全对齐的时序。选择Mealy还是Moore通常需要权衡状态数量和输出时序。对于输出需要稳定且与时钟同步的工程场景Moore型更常用对于希望减少状态数量的教学或简单场景Mealy型也有优势。下面给出一个Moore型110检测器的Verilog描述。// Moore型110序列检测器 module seq_detector_moore ( input wire clk, input wire rst_n, input wire x, output reg z ); localparam S0 2b00; localparam S1 2b01; localparam S2 2b10; localparam S3 2b11; reg [1:0] state, next_state; always (posedge clk or negedge rst_n) begin if (!rst_n) state S0; else state next_state; end always (*) begin case (state) S0: next_state x ? S1 : S0; S1: next_state x ? S2 : S0; S2: next_state x ? S2 : S3; S3: next_state x ? S1 : S0; default: next_state S0; endcase end always (*) begin z (state S3); end endmodule17. 寄存器传输级设计方法与HDL描述现代数字电路设计通常使用硬件描述语言如Verilog或VHDL以寄存器传输级方式描述电路。虽然本专题侧重原理但掌握规范的HDL描述方法对工程实践非常必要。17.1 两段式状态机两段式状态机把组合逻辑与时序逻辑分开书写。第一段用时序逻辑描述状态寄存器的更新只响应时钟有效沿和异步复位第二段用组合逻辑根据当前状态和输入产生次态和输出。两段式结构比把所有逻辑混合在一个always块中清晰也便于综合工具处理。但其输出可能来自组合逻辑毛刺仍然存在。17.2 三段式状态机三段式状态机进一步把输出逻辑单独写出通常用时序逻辑寄存输出。第一段负责状态更新第二段负责次态组合逻辑第三段负责输出寄存。三段式状态机的输出在时钟沿后才改变时序稳定适合对输出质量要求高的设计。三段式代码稍长但可读性和工程可靠性更好是推荐的状态机编码风格。17.3 编码规范与复位策略在HDL中状态机的状态通常使用localparam或枚举定义避免直接散落二进制常数。状态机应覆盖所有状态分支并在case语句中添加default分支防止生成锁存器。复位信号建议优先使用同步复位减少异步信号毛刺风险如果确实需要异步复位也要保证复位信号干净。此外HDL只负责实现设计真正的难点仍然在于状态图、状态编码和激励表推导。初学者不应跳过纸面推导直接写代码否则容易出现状态遗漏、编码冲突和输出时序错误。建议先完成状态图再翻译为HDL最后通过仿真波形验证。18. 寄存器与移位寄存器基础寄存器是数字系统中用于暂存一组二进制数据的器件由多个触发器组成。每个触发器保存一位数据所有触发器共用一个时钟信号。在时钟有效沿到来时寄存器将输入数据一次性锁存从而实现多位数据的同时存储。带使能端的寄存器还能在控制信号无效时保持原值这在多路复用数据通路中非常重要。移位寄存器是一种特殊寄存器它在时钟作用下能够把数据逐位左移或右移。根据输入输出方式移位寄存器分为串入串出、串入并出、并入串出和并入并出四种类型。串入串出移位寄存器可以用于延时线使数据经过若干时钟周期后输出串入并出可用于串行到并行转换并入串出可用于并行到串行转换并入并出则常作为通用移位寄存器。移位寄存器的应用非常广泛。在通信系统中它用于数据格式转换在运算电路中它与加法器、乘法器配合完成串行运算在测试领域线性反馈移位寄存器可以产生伪随机序列。分析移位寄存器时关键是写出每个触发器的串行输入来源例如右移时高位触发器的D端接低位触发器的输出Q左移时低位触发器的D端接高位触发器输出。理解移位方向与连线关系是移位寄存器设计的基础。19. 时序电路中的竞争冒险与毛刺时序电路虽然比组合电路更加稳定但在信号翻转过程中仍然可能产生毛刺。毛刺是指信号在较短时间内的非预期跳变它可能导致下游组合逻辑误动作也可能在特定条件下被触发器错误采样。毛刺的主要来源是组合逻辑内部不同路径的传播延时不一致。一个信号经过级数不同的逻辑路径后在输出端汇合时路径延时差异会造成短时间的错误电平。例如一个信号和它的取反信号若同时到达一个与门理论上输出恒为0但实际由于反相器延时取反信号会稍晚到达于是与门两个输入在极短时间内同时为1产生一个窄脉冲。这种由信号竞争造成的尖峰就是典型的毛刺。在同步时序电路中只要毛刺不出现在时钟有效沿附近一般不会影响触发器采样结果。因为触发器只关心建立时间和保持时间窗口内的信号稳定性窗口之外的变化会被忽略。因此同步设计天然具有对组合逻辑毛刺的屏蔽能力。但这并不意味着同步电路完全不受毛刺影响如果毛刺恰好落在时钟采样窗口内同样可能导致误采样。减少毛刺的方法包括合理控制逻辑级数减少路径延时差异用卡诺图尽可能消除竞争项在设计中避免不必要的信号翻转对关键异步信号加入同步器。特别要注意异步清零和异步置数信号上的毛刺因为这些信号不受时钟约束可能在任何时刻直接改变电路状态。工程上更推荐使用同步复位和同步控制信号。20. 亚稳态与跨时钟域问题亚稳态是触发器在实际工作中可能出现的一种不确定状态。当时钟有效沿到来时如果输入数据恰好在建立时间或保持时间窗口内发生变化触发器内部节点可能停在介于高电平和低电平之间的中间值既不是明确的0也不是明确的1。经过一段时间后这个亚稳态会随机稳定到0或1但稳定所需时间不可预测。亚稳态无法从根本上消除只能通过设计手段降低其发生概率和危害。最基本的措施是对输入信号添加多级同步器通常使用两级触发器串联。第一级触发器虽然仍可能进入亚稳态但经过一个时钟周期的时间很大概率能够恢复稳定第二级触发器再锁存时输出已经稳定的概率大幅提高。多级同步器常用于跨时钟域信号传递。例如将一个慢时钟域的控制信号送入快时钟域时由于两个时钟之间没有固定相位关系信号变化可能偶然落在快时钟采样沿的建保窗口内导致亚稳态。通过两级触发器同步后可以显著降低问题概率。跨时钟域设计还需要注意数据总线的一致性单纯对多位数据分别同步可能造成采到中间值因此通常结合握手协议、格雷码或异步先入先出队列来处理。21. 常见错误与注意事项初学时序电路时以下几类错误非常常见需要格外注意。第一混淆锁存器和触发器忽略电平敏感与边沿敏感的区别容易在使能信号有效期间错误地使输出连续跟随输入变化从而破坏同步电路的稳定采样特性。第二状态定义不明确。设计状态机时没有认真梳理电路需要记忆的历史信息导致状态遗漏或状态冗余最终逻辑实现与原始设计要求不一致。第三省略状态化简或状态编码环节直接根据原始状态图接线使电路规模偏大、激励方程复杂甚至出现无效状态死锁。第四在列状态表或画状态图时遗漏输入组合特别是有外部输入时只考虑部分输入取值造成状态转移关系不完整。第五把异步电路照同步电路的方法分析没有先判断每个触发器的时钟是否出现有效跳变而是默认所有触发器同时更新导致次态推导错误。第六忽视触发器动态参数。在高速设计中不考虑建立时间、保持时间和传播延时也不检查异步复位信号上的毛刺导致电路实际工作不可靠。第七HDL编码不完整。case语句缺少default分支、组合逻辑分支赋值不全可能综合出意外锁存器状态编码使用散落的二进制常量可读性差且容易出错。避免上述错误的关键是严格遵循分析或设计的固定流程并在每一步完成后及时检查。分析电路时先对每个触发器命名并编号再依次写出驱动方程、状态方程和输出方程最后用状态表或状态图验证推导结果对异步电路还要补充时钟方程并优先通过时序图确认各级触发器的翻转条件。设计电路时从明确输入输出和状态含义开始经过状态化简、状态编码、触发器选型、激励方程化简最终画出逻辑电路并检查自启动能力。只有把纸面推导做扎实再进入HDL编码和仿真验证才能真正掌握时序逻辑电路的分析与设计方法。
返回列表