ARTICLE DETAIL

资讯详情

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

数字电路实验三:时序电路设计从零到一(状态图、触发器与计数器)

数字电路实验三:时序电路设计从零到一(状态图、触发器与计数器) 简介实验三时序电路设计实验报告面向数字逻辑与FPGA方向学习者基于Vivado环境完成时序电路从设计到验证的全流程实践。资源围绕实验目的展开帮助读者掌握时序电路原理、设计语言及工具用法适合课程实验、期末复习或自学入门。压缩包共232个文件体积约928KB内容以Vivado工程文件为主包含.v源码、.xpr工程、.tcl脚本、.bat批处理、log仿真日志、rpt综合报告及xml配置等文件覆盖工程创建、综合、仿真与验证多个环节目录结构清晰。目前已有690人学习下载。资源中既有完整工程与源码也有仿真脚本和运行日志可对照验证时序逻辑功能还可参考综合与实现报告排查问题适合初次接触Vivado时序电路设计的读者快速上手。 时序电路设计实验基本是数字电路课里一个分水岭。前面做组合逻辑实验大家搭几个门电路就能亮灯一到时序电路就集体翻车输出乱跳、状态锁死、波形对不上问题千奇百怪。这个实验标题看着普通但里面把触发器、时钟、状态机、竞争冒险这些核心概念一次性串了起来做一遍比看十遍书都管用。这篇文章就是把“实验三——时序电路设计实验报告”这个题目展开来写从设计思路、器件选型、具体的状态图推导到最终在面包板上接线的实操过程以及我踩过的一些坑全部整理出来。适合正在准备数字电路实验的学生也适合刚接触时序逻辑、想自己搭一个计数器或移位寄存器的硬件爱好者。如果你只是想把实验报告编得像样那更得看因为我会把每一步为什么这么做讲透不是光给你一个能抄的结论。1. 实验任务拆解与设计思路1.1 这个实验到底在验证什么先说清楚时序电路和组合电路的本质区别。组合电路输出只取决于当前输入接好线就稳定了时序电路不一样输出不仅跟当前输入有关还跟电路之前的状态有关也就是说它带“记忆”。而这个记忆功能是通过触发器实现的。触发器在时钟边沿到来时采样输入、更新状态所以整个电路的行为不再是一通电就定死而是在时钟驱动下按节奏变化。实验三的典型任务就是设计一个同步时序逻辑电路最常见的载体是计数器比如模4计数器或者模8计数器。它要求你从需求出发画出状态转换图写出状态表再根据触发器类型推导出激励方程最后搭出实际电路来验证。这个过程覆盖了时序电路设计的完整链路所以几乎所有教材和实验课都会拿计数器开刀。很多同学会疑惑为什么不能直接用74LS161这种现成计数器芯片非要自己拿触发器和逻辑门搭我后来想明白了一个道理现成芯片只能让你会“用”不能让你会“设计”。实验真正想让你掌握的是怎样把一个抽象的状态转换需求变成一组具体的触发器输入方程。这个能力后面做状态机、做CPU都会反复用到属于数字逻辑里最核心的思维训练。1.2 方案选型触发器怎么选、时钟怎么给设计同步时序电路第一个选择就是用什么触发器。实验里最常见的两种是D触发器和JK触发器。D触发器输入方程最简单Q次态直接等于D端的值画卡诺图、写表达式都很直观所以实验箱上一般给的都是74LS74这种双D触发器芯片。JK触发器功能最全有保持、置0、置1、翻转四种状态理论上能简化组合逻辑但激励方程写起来更绕对新手反而容易出错。我自己的建议是实验阶段无脑选D触发器把精力放在状态转换推导上。等你把D触发器的流程走熟了再回头去看JK触发器的设计就会发现无非是用JK特性方程反推激励表逻辑上是一样的只是多一步转换。实验报告里如果老师允许选型选D触发器也最容易把每一步写清楚。时钟怎么接也是个大问题。实验箱上的时钟源一般有两种一种是连续脉冲频率可调一种是单脉冲按一下出一个边沿。我的经验是刚开始调试计数器时一定先用单脉冲每按一次观察一次状态变化确认状态转换符合预期后再切到连续脉冲看整体效果。直接上连续时钟计数器飞快跳变LED只能看到模糊的乱闪出了问题根本不知道是哪一步错的。另外如果实验箱支持手动复位尽量把复位信号也做成独立按键方便随时把电路拉回初态。2. 实验准备与接线要点2.1 器件、工具与平台怎么凑齐做时序电路实验物料清单比组合逻辑要多一点。基础配置包括双D触发器74LS74一片异或门74LS86一片做模4计数器时用来产生D1信号电阻、按键开关、LED若干面包板或者实验箱。如果做更复杂一点的移位寄存器可能还需要与门、非门这些按电路图去门电路芯片里挑就行。工具方面万用表是必须的主要用来查短路和断路。示波器或逻辑分析仪条件允许的话借一台调试时序电路时能看到真实波形比自己对着LED猜状态高效得多。我见过不少人在面包板上插线插完一通电发现不工作结果排查了半天发现是一根杜邦线内部断了。所以强烈建议动手前先把所有线用万用表通断档测一遍别嫌麻烦这能省掉一半的玄学问题。如果你走的是仿真路线软件上选择也很多。学校实验室常用Quartus配ModelSim或者Vivado也有用Logisim做纯逻辑仿真的各有各的好处。我的建议是先用Logisim或Multisim这类轻量工具验证设计逻辑确认状态图和激励方程没问题再上硬件接线。直接拿着没验证过的电路图去插面包板大概率是要反复返工的。2.2 底层时序原理必须吃透做实验之前建立时间、保持时间、传播延迟这几个概念必须搞懂否则出问题的时候根本不知道怎么排查。建立时间指时钟有效边沿到来之前数据输入必须提前稳定的时间保持时间指时钟边沿到来之后数据输入必须继续保持的时间。D触发器在工作时如果数据在时钟边沿附近发生变化落在这两个时间窗口内输出就会进入所谓的亚稳态——既不是0也不是1而是介于两者之间的中间状态稳定时间不定后续电路采样到的值可能对也可能错。实验箱里芯片工作频率很低亚稳态不容易触发但如果你自己用高速时钟驱动电路这个问题就会突然冒出来。传播延迟则是指从时钟边沿到输出稳定之间的延迟包括触发器内部延迟和中间组合逻辑的延迟。同步时序电路设计的前提是在一个时钟周期内所有信号都要在新的时钟边沿到来之前稳定下来。如果组合逻辑链太长延迟叠加超过时钟周期电路就会出错。实验板频率低这个问题不明显但你在设计更高速电路时这条“延迟预算”就是最基本的设计约束。3. 实操过程从状态图到硬件实现3.1 第一步设计一个模4同步计数器我以最经典的模4计数器为例。状态转换要求是00 - 01 - 10 - 11 - 00循环计数。这里的“模4”就是计数值从0到3一共4个状态用两位二进制数表示需要两个触发器。第一步画出状态转换图四个状态分别是S000、S101、S210、S311箭头指向下一个状态构成一个循环。状态表就是把状态转换图翻译成表格形式列出当前状态Q1Q0和次态Q1⁺Q0⁺的对应关系当前状态 Q1Q0次态 Q1⁺Q0⁺0001011010111100这张表是整个设计的起点后面所有推导都是围绕它展开的。很多同学实验时就卡在这一步状态表写错了后面全错。建议画完图后自己顺着箭头走一遍确认每个状态都有且只有一个次态且能从任意状态经过有限步回到循环里。这种自启动问题马上会讲到先记住检查这个。3.2 第二步推导D触发器的激励方程有了状态表D触发器的激励方程写起来非常直接。因为D触发器的次态Q⁺就是D输入所以D1 Q1⁺D0 Q0⁺直接从状态表里把两列次态抄出来再写出逻辑表达式就行。对于D0只有当前状态为00或10时次态为1用卡诺图化简后可得D0 ¬Q0也就是Q0取反。对于D1可以发现它等于Q1和Q0的异或写出来就是D1 Q1 ⊕ Q0。为了验证这个结果可以把四个状态挨个代进去检查一遍Q1Q000时D1D001次态01正确Q1Q001时D1D010次态10正确。全部对应上说明表达式没写错。这一步如果用JK触发器就没这么简单了需要先写出JK触发器的特性方程Q⁺ J·¬Q ¬K·Q然后反推每个状态下J、K端应该置什么值再把激励表进行卡诺图化简。所以我才建议新手实验选D触发器重点放在状态转换逻辑上而不是卡在激励推导这一环。3.3 第三步硬件连线与Verilog实现硬件连线时按照D1 Q1⊕Q0和D0 ¬Q0这两个式子接就行。两个D触发器的时钟端并在一起接同一个时钟源构成同步时序逻辑。Q0接到异或门的一个输入端Q1接到异或门的另一个输入端异或门输出接到D1Q0同时接到非门非门输出接到D0这样一个最简单的模4计数器就搭好了。两个触发器的Q端分别接LED用于观察状态。如果你是在FPGA平台上做Verilog代码会更直观。下面这段就是和上述电路等价的行为级描述module counter_4( input wire clk, input wire rst_n, output reg [1:0] q ); always (posedge clk or negedge rst_n) begin if (!rst_n) q 2b00; else q q 1b1; end endmodule注意这里的写法是直接在时钟边沿完成状态自增和用D触发器自己搭的电路功能一致但省去了底层的门级描述。写代码的时候还要注意always块里的复位是异步复位所以敏感列表里带上rst_nFPGA综合时会把它映射成带异步复位端的触发器。至于从代码到门电路的映射那是综合工具该做的事你只需要保证逻辑功能符合设计。3.4 第四步时序仿真与板级验证仿真分成功能仿真和时序仿真两级。功能仿真只验证逻辑功能不会考虑器件延迟你在ModelSim或者Vivado里跑能看到每个时钟上升沿后q值按00、01、10、11循环变化波形非常干净适合检查设计本身对不对。时序仿真则会代入真实器件的延迟模型能看到输出变化比时钟边沿稍微滞后一点因为触发器有传播延迟综合后的门电路也有延迟。如果设计存在竞争冒险问题波形上就可能在边沿附近看到毛刺。板级验证时建议先接单脉冲每按一次按键看一次LED状态确认四个状态完全按预期循环然后切换到连续脉冲观察计数效果。如果实验箱带数码管或LCD还可以把计数结果显示出来更直观。实际做的时候我还习惯把复位按键和时钟按键分开接这样随时可以中断在任意状态方便对照状态表逐项检查。4. 常见问题与排查技巧实录4.1 计数器状态乱跳或锁死先查复位和时钟这几类现象实验课上出现的频率最高。状态乱跳最常见的原因是复位信号没接好。很多实验箱的复位按键按下输出低电平平时高电平如果你把复位端悬空触发器的复位端可能被噪声干扰导致状态莫名其妙变化。所以复位端一定要接明确的高电平或低电平不能悬空。还有一种状态锁死的情况是按键没有做消抖。如果你用单脉冲按键作为时钟按下和释放的瞬间会产生好几个脉冲触发器可能一次采样了多个边沿计数器一下子跳过好几个状态。此时需要检查按键是否带硬件消抖电路没有的话最简单的办法是按下去以后稍等几秒再松开或者改用实验箱自带的单脉冲信号源它内部一般已经处理好了抖动问题。4.2 仿真波形正常但实物不工作多半是供电和接触问题这是最容易让人崩溃的场景仿真里波形完美一上硬件就全乱。先查电源用万用表确认芯片VCC引脚和GND引脚电压是否正常。74LS系列芯片供电电压是5V如果实验箱电源输出不稳或者某个芯片没接到5V整个电路就会处于“薛定谔状态”。再查共地时钟源的地、芯片的地、实验箱的地必须接在一起否则信号根本没参考电平时序电路自然无法工作。最后查接触面包板最怕接触不良一根线松了或者断在面包板内部从外面看不出来。拿万用表逐段量信号电平对比正常状态就能快速锁定位点。4.3 无效状态导致的自启动问题最容易被忽略设计计数器时如果只用到了部分状态剩余状态没有被处理电路就有可能在意外进入无效状态后死循环永远回不到正常计数序列。拿模4计数器来说两个触发器一共只有4个状态全部被用了所以不存在这个问题。但如果你设计的是模3计数器状态从00 - 01 - 10 - 00循环剩下一个状态11没有定义电路一旦因为干扰进入11下一步走去哪就完全随机了。如果11的次态还是11计数器就锁死在无效状态里。解决办法是在填写状态表时把无效状态也列进去然后把它导向有效循环中的任意状态比如让11的次态等于00。多这一步“自启动检查”就能保证电路从任何状态都能回到正常工作序列。这是时序电路设计里很重要的一环也是实验报告里老师特别喜欢考察的一个点。4.4 常见问题排查速查表现象可能原因排查方向输出一直不变时钟没接上、复位被按住查时钟引脚、复位电平状态跳跃乱序按键抖动、触发多个边沿用单脉冲源或硬件消抖仿真正常硬件乱供电问题、共地问题、接触不良万用表逐段量电压偶尔随机翻转亚稳态或干扰提高信号质量、加滤波电容卡在无效状态状态表没处理无效状态补全状态转换表最后再分享一个实际调试小技巧不要只盯着LED闪烁猜测状态。把Q1、Q0接到示波器或逻辑分析仪上和时钟信号一起显示能清楚看到每个沿之后状态是否按预期跳变。如果没有示波器两个LED也够用但一定要配合单脉冲一步步走每按一次就在纸上记录当前Q1Q0走完一个循环再对照状态表检查。这次实验做完我自己最大的体会是时序电路没那么玄乎关键是把“当前状态”和“次态”这两个概念彻底理清剩下的就是按流程推导、验证。如果你在实验里卡住了回到状态表从最基础的一步开始重新检查大概率比自己东拆一根线西碰一下芯片要快得多。希望这篇记录能帮你少走几个弯路一次通过实验。本文还有配套的精品资源点击获取
返回列表