想象你是一位餐饮老板,要开一家智能餐厅。你不会冲进后厨直接炒菜,而是先选址、量场地、画设计图;接着安排施工队进场装修;装修快完工时,在后台搭一个沙盘,把点餐、上菜、结账的整套流程彩排一遍,录成视频反复查看,发现问题就改;一切顺利后,才正式开门迎客。从选址到开业,每一环都有专门的工具和流程。 FPGA 开发就像开这家智能餐厅。Quartus 是设计师手里的“设计事务所”,负责从创建工程、编写代码到编译下载的全流程管理;ModelSim 是后厨的“沙盘彩排室”,让你在真实开店之前把电路逻辑演练千百遍。这篇文章用最生活化的比喻,带你走完从工程创建、仿真验证到板级下载的每一步:创建工程(选址)、编码编译(施工)、仿真调试(彩排)、器件下载(开业),最后用计数器和状态机两个实例亲手“炒出”两道硬菜。学完之后你会发现,所谓 FPGA 开发,不过是一套把想法变成硬件的标准流程。

岗位关联

掌握 Quartus 与 ModelSim 全流程,是 FPGA 开发者的核心基本功。它能帮你从“会写代码”进阶到“能交付硬件”,在芯片验证、通信、工控等领域获得扎实的工程能力。

目录
  1. 可视化演示
  2. 工程创建流程(选址画图)
  3. 设计与编译(施工与验收)
  4. 仿真库配置(沙盘搭建)
  5. 波形调试分析(看彩排录像)
  6. 器件编程下载(开门营业)
  7. 计数器实例(煮蛋计时器)
  8. 状态机实例(完整服务流程)
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

工程创建流程(选址画图)

开一家智能餐厅,第一步不是招厨师,而是选址和画图。Quartus 的 New Project Wizard(新建工程向导)就像一个“开店登记处”:你在这里告诉系统餐厅开在哪个位置(工程目录)、叫什么名字(工程名)、准备用多大的店面(器件型号),系统会为后续所有环节搭好框架,后续的代码、仿真、下载都在这个框架里运行。

器件选择对应“店面规模”。FPGA 芯片种类繁多,Intel 的 Cyclone 系列像街边小店,性价比高,适合入门学习;Arria、Stratix 系列像大型商场,性能强劲但价格昂贵。选错器件就像奶茶店租了写字楼大堂,预算和空间全浪费了。EDA 工具设置这一步则相当于提前和沙盘供应商(ModelSim)签好合作意向,让仿真工具与设计工程无缝衔接。

新建工程向导通常有四个关键步骤:第一,设置工程名称与目录,Quartus 会生成 .qpf 工程文件,相当于拿到营业执照;第二,选择目标器件,比如 Cyclone IV 系列的 EP4CE10F17C8;第三,设置 EDA 工具关联,把 ModelSim 指定为仿真器;第四,添加已写好的设计文件,像把设计图纸放进项目文件袋。完成这些,餐厅的“皮囊”就准备好了。工程创建时还需要关注时钟频率,因为后续仿真和时序分析都围绕它展开:

拿到执照、画好图纸,餐厅的皮囊有了,下一步就是请施工队进场——把设计图变成真正的厨房。

Tclk=1fclk\displaystyle T_{clk} = \frac{1}{f_{clk}}
时钟周期和频率互为倒数,就像餐厅翻台时间和翻台率成反比。
  1. T_clk 时钟周期一个时钟上升沿到下一个上升沿之间的时间跨度,单位是秒。
    TclkT_{clk}
  2. 等式关系周期与频率互为倒数,周期越长,频率越低,电路跑得越慢。
    Tclk=1fclkT_{clk} = \frac{1}{f_{clk}}
  3. f_clk 时钟频率每秒包含多少个时钟周期,单位是赫兹(Hz)。50MHz 表示每秒有 5 千万个周期,对应周期 20ns。
    fclkf_{clk}

设计与编译(施工与验收)

图纸画好后,施工队进场。编写 Verilog 代码就是“画施工图”:用 module 到 endmodule 描述一个电路模块,就像施工图上画出每个房间的布局和管线走向。Quartus 里的 Analysis & Synthesis(分析与综合)环节则兼具施工和监理双重角色,一边把代码变成电路结构,一边检查有没有“违章搭建”。

编译综合流程按四个阶段推进:首先是 Analysis & Elaboration(图纸会审),检查语法和模块引用是否正确;然后是 Synthesis(按图施工),把 RTL 代码翻译成由查找表、触发器等基本元件组成的网表;接着 Fitter(房间分配)把元件布局到 FPGA 内部的物理位置上;最后 Assembler(打包归档)生成可以下载的配置文件。如果某个环节出错,Quartus 会在“监理报告”(编译报告)中用红笔圈出问题,双击错误信息就能跳到对应的代码行。

编译报告不只是错误清单,还包括资源占用率、引脚使用情况、时序分析结果。比如报告告诉你“组合逻辑路径延迟 12ns”,而时钟周期只有 10ns,就意味着设计可能来不及稳定——这就像厨房出菜速度跟不上客流节奏。设计是否能在一个时钟周期内完成运算,取决于关键路径的组合逻辑延迟:

厨房建好并通过验收,下一步不是急着开业,而是先彩排——带着设计进入 ModelSim 仿真环境。

tcomb≤Tclk−tsetup\displaystyle t_{comb} \le T_{clk} - t_{setup}
组合逻辑延迟必须留够余量,给数据的“入座”和“离席”时间。
  1. t_comb 组合逻辑延迟信号经过与门、或门等组合电路从输入到输出所需的时间,就像菜品从备菜到出锅的时间。
    tcombt_{comb}
  2. ≤ 必须满足的约束表示“不能超过”,一旦超过时序就崩溃,餐厅就会乱套。
    ≤\le
  3. T_clk 时钟周期两个相邻时钟上升沿之间的总时间,是全流程的“营业时段”。
    TclkT_{clk}
  4. t_setup 建立时间数据必须在时钟沿到来前保持稳定的最短时间,相当于顾客入座需要的时间。
    tsetupt_{setup}
  5. 差值 T_clk - t_setup把“入座时间”从“营业时段”中扣除,剩下才是真正允许组合逻辑消耗的时间。
    Tclk−tsetupT_{clk} - t_{setup}

仿真库配置(沙盘搭建)

餐厅开业前,在后厨大厅搭一个 1:1 的沙盘,用模型厨师把点餐到出餐的流程完整走一遍。ModelSim 就是这个沙盘。在 ModelSim 中,第一步是建立仿真库(work 库)——沙盘的城市地图。设计文件必须被“翻译”成仿真工具认识的元素放进库里,才能参与演练。

测试平台(testbench)是彩排剧本。它本身不是要上板的电路,而是用来“指挥”设计的脚本:什么时候按复位键、什么时候送数据、什么时候检查输出。比如 initial begin rst_n = 0; #20 rst_n = 1; end 表示“开场先按复位,20 个时间单位后松开”。产生时钟则用 always #10 clk = ~clk,让时钟每 10 个时间单位翻转一次,形成周期 20 的方波。

把 RTL 文件和 testbench 都编译进 work 库之后,就可以选择行为仿真(Behavioral Simulation)模式运行。这个模式不关心真实器件的物理延迟,只验证功能逻辑——相当于沙盘上只看流程对不对,不看厨师走路快慢。仿真时长的设置与时钟周期直接相关:

沙盘彩排结束后,真正的重头戏是看录像——逐帧检查每个信号在每个时刻的表现。

Tsim=N×Tclk\displaystyle T_{sim} = N \times T_{clk}
想验证 N 个时钟周期,就要让仿真持续 N 个周期的时间。
  1. T_sim 总仿真时长仿真从开始到结束覆盖的总时间长度,就像彩排录像的时长。
    TsimT_{sim}
  2. N 时钟周期个数需要验证的节拍数。比如计数器循环一圈需要 16 拍,N 就至少设为 16。
    NN
  3. T_clk 单个时钟周期一个完整的高低电平循环用时。
    TclkT_{clk}

波形调试分析(看彩排录像)

彩排不能只看结果,要反复看录像回放。ModelSim 的波形窗口(Wave Window)就是这台录像机,记录着每个信号每个时刻的高低电平变化。把时钟、复位、输出信号拖进波形窗口,就像导演选择机位:时钟是全景机位,复位是近景机位,数据总线是特写机位。

波形调试的核心操作包括:添加信号(将内部寄存器、状态变量拖入窗口)、缩放波形(放大看毛刺细节,缩小看整体趋势)、使用游标测量时间差(红色游标指到两个时刻,窗口自动显示间隔)。当仿真时间轴上有异常翻转时,波形会直观地暴露出来,比如数据在时钟沿附近抖动——这往往是时序违规的征兆。

断点调试是更精细的手段:在 testbench 中设置断点,仿真运行到断点处自动暂停,然后单步执行,像录像一帧一帧地放。此时可以在 ModelSim 的命令行用 $display 打印关键变量的当前值,相当于在录像画面上叠加字幕。数据能否被可靠地打入寄存器,取决于建立时间约束:

彩排录像满意了,才敢正式开业——把设计下载到真实的 FPGA 芯片上。

tsetup≤tdata−tclk_q\displaystyle t_{setup} \le t_{data} - t_{clk\_q}
数据到达时间必须比寄存器的建立时间要求更早,如同顾客必须提前到场才能准时入席。
  1. t_setup 建立时间寄存器对数据到达的最早时刻要求,是“必达底线”。
    tsetupt_{setup}
  2. t_data 数据到达时刻数据信号从源头寄存器出发,经过组合逻辑后到达目标寄存器输入端的时刻。
    tdatat_{data}
  3. t_clk_q 时钟到输出延迟时钟上升沿到来之后,源寄存器输出端才真正更新数据的延迟,是“出发时间”。
    tclk_qt_{clk\_q}
  4. t_data - t_clk_q 净数据时间数据实际可用于传输的有效时间窗口,必须不小于建立时间。
    tdata−tclk_qt_{data} - t_{clk\_q}

器件编程下载(开门营业)

彩排通过,正式开业。下载电路前,先要给信号分配物理引脚,这相当于给服务员指定出入口和站位:时钟接哪个引脚、复位接哪个开关、LED 接哪个灯位。Quartus 的 Pin Planner(引脚规划器)就是“排班表”,把设计里的 clk、rst_n、led 等信号逐一绑定到芯片的物理引脚上。

引脚分配完成后,执行全编译。Quartus 会把设计打包成一个 .sof 位流文件——芯片的“开业配置包”,里面包含电路在 FPGA 内部的所有连接信息。接下来打开 Programmer(编程器),通过 USB-Blaster 下载线以 JTAG 方式把 .sof 写入 FPGA。JTAG 接口就像一把万能钥匙,不仅能下载配置,还能在线调试。

下载成功后,FPGA 立即开始工作。板级验证是整个流程的点睛之笔:拨动拨码开关观察 LED 亮灭,用示波器测引脚信号,确认设计与真实硬件行为一致。下载耗时取决于位流文件大小与链路速率:

开业成功,餐厅可以接单了。下面用两道菜练手:先做最简单的煮蛋计时器,再挑战完整的服务流程。

tcfg=DcfgRlink\displaystyle t_{cfg} = \frac{D_{cfg}}{R_{link}}
位流数据量越大、下载链路越慢,配置时间就越长,就像庞大菜单需要更长时间录入收银机。
  1. t_cfg 配置下载耗时把位流文件写入 FPGA 所需的全部时间。
    tcfgt_{cfg}
  2. D_cfg 位流数据量.sof 文件包含的比特总数,工程越大、资源占用越多,数值越大。
    DcfgD_{cfg}
  3. R_link 链路速率下载线缆每秒能传输的比特数,USB-Blaster 的传输速率决定了“录入速度”。
    RlinkR_{link}

计数器实例(煮蛋计时器)

第一道菜是“煮蛋计时器”:按一下复位,计时清零重新开始;每来一个“滴答”(时钟脉冲),计时加一。这就是计数器,FPGA 世界里的"Hello World"。一个 4 位计数器能从 0 数到 15,数满自动回卷,就像计时器走到 9 分 59 秒后跳回 0。

RTL 设计用 always 块描述时序逻辑,异步复位优先,使能时每个时钟上升沿加一。testbench 则负责产生 20ns 周期的时钟和复位激励,并运行仿真观察波形。ModelSim 波形中可以看到:复位释放后,计数值在每个上升沿后递增 1,从 0、1、2……一直到 15 再回到 0,形成熟悉的阶梯波形。核心逻辑可以浓缩为一个递推关系:

计时器做好了,从“单点小工具”升级到“完整服务流程”——这就是状态机的用武之地。

qnext=(qcur+1) mod 2W\displaystyle q_{next} = (q_{cur} + 1) \bmod 2^{W}
计数加一后按位宽取模,超出范围就自动回卷,像里程表归零一样自然。
  1. q_next 下一时刻计数值下一个时钟上升沿到来并稳定后,计数器输出的新值。
    qnextq_{next}
  2. q_cur 当前计数值此刻寄存器中保存的数值。
    qcurq_{cur}
  3. 加一模运算先加一,再对 \(2^W\) 取余数,本质是把超出的部分丢弃,模拟位宽溢出。
    (qcur+1) mod 2W(q_{cur} + 1) \bmod 2^{W}
  4. 2^W 计数模数W 位二进制能表示的状态总数,4 位对应 16。
    2W2^{W}

状态机实例(完整服务流程)

餐厅的服务流程:空闲 → 点餐 → 上菜 → 结账 → 回到空闲。每个阶段有明确的任务,也有明确的“下一站”。状态机(FSM)就是把这套流转规则数字化:当前处于哪个状态,收到什么输入,就去往哪个下一个状态。它像一张服务流程图,贴在后厨墙上,所有人都按规矩走。

工程中最常用的是三段式状态机:第一段是状态寄存器(时序逻辑),负责记住“现在在哪一站”;第二段是次态逻辑(组合逻辑),根据当前状态和输入算出“下一站去哪”;第三段是输出逻辑,决定“当前这一站干什么”。三段分开写,代码清晰、时序收敛好,出现问题时也容易定位。

仿真测试状态机时,要刻意遍历所有状态转移路径:复位后应在空闲态,按下“点餐”按钮后进入点餐态,上菜完成后进入结账态……把状态变量添加到波形窗口,用助记符显示状态名,一眼就能看出跳转是否符合流程图。状态跳转的本质是一个函数关系:

从选址到开业,从煮蛋计时器到完整服务流程,你已经走通了 FPGA 开发的全链路。再把 Quartus 与 ModelSim 这套工具链练熟,就能独立交付一个又一个“智能餐厅”了。

Snext=δ(Scur,xin)\displaystyle S_{next} = \delta(S_{cur}, x_{in})
下一个状态 = 转移函数(当前状态,输入信号),像“口渴 + 看到水吧 → 走向水吧”。
  1. S_next 下一个状态状态寄存器在下一个时钟沿到来后存入的新状态。
    SnextS_{next}
  2. δ 状态转移函数一段组合逻辑构成的“导航员”,根据规则决定去向。
    δ\delta
  3. S_cur 当前状态此刻状态寄存器中保存的状态编码。
    ScurS_{cur}
  4. x_in 输入信号来自外界的激励,比如按钮按下、传感器触发。
    xinx_{in}

AI 应用场景

仿真验证中的AI回归测试

阶段:验证自动化

解决的问题:人工编写测试平台耗时且覆盖率低,一个状态机往往要写几十条测试用例。AI 可以扫描 RTL 代码,自动生成测试激励与断言,并批量跑回归仿真。

具体案例:某团队用 AI 辅助工具扫描 3000 行 RTL 代码,自动生成 50 条测试用例,把状态机分支覆盖率从 55% 提升到 92%,节省了三周人工工作量。这就像给沙盘彩排配了一位“自动导演”,剧本自己写、走位自动排。

波形智能诊断定位毛刺

阶段:调试分析

解决的问题:ModelSim 导出的波形文件动辄上千万个时间点,人眼搜索异常信号非常慢。AI 算法可以对信号翻转事件做聚类分析,自动标记异常毛刺与疑似亚稳态信号。

具体案例:工程师从 ModelSim 导出 VCD 波形后,AI 把 10 万条信号翻转自动分成 4 类,聚焦到 3 处毛刺,最终定位到某段组合逻辑的竞争冒险。这相当于给彩排录像配了 AI 剪辑师,自动把精彩(问题)片段剪出来。

RTL代码可综合性检查

阶段:设计编码

解决的问题:初学者容易写出 initial、#延时 等不可综合语句,仿真能过、上板不工作。AI 静态扫描 RTL 源码,在编码阶段就提示不可综合结构并给出改写建议。

具体案例:AI 插件在 VS Code 中实时提示“第 12 行使用 initial 不可综合,建议改用 always 描述”,并一键生成改写后的时序逻辑。这就像施工监理戴着 AI 眼镜进场,一眼就能看出哪面墙是违章搭建。

Python 演示

python44 行
# 用Python行为模型模拟ModelSim中的计数器仿真流程class CounterModel:    """4位计数器行为模型,模拟RTL时序逻辑"""     def __init__(self, width=4):        self.width = width        self.max_val = (1 << width) - 1        self.reset()     def reset(self):        self.cnt = 0     def clock_edge(self, rst_n, en):        """每个时钟上升沿调用一次, 模拟always块"""        if rst_n == 0:            self.cnt = 0        elif en:            self.cnt = (self.cnt + 1) & self.max_val        return self.cnt  def simulate(clk_cycles=16, check_cycle=None, check_value=None):    """运行仿真并记录波形数据, 类似ModelSim的run命令"""    ctr = CounterModel(width=4)    waveform = []    rst_n = 0    en = 1    for cycle in range(clk_cycles):        if cycle == 2:            rst_n = 1  # 第2拍释放复位        ctr.clock_edge(rst_n, en)        q = ctr.cnt        waveform.append((cycle, rst_n, en, q))        if check_cycle is not None and cycle == check_cycle:            assert ctr.cnt == check_value, "cycle={}, cnt={}".format(cycle, ctr.cnt)    return waveform  if __name__ == "__main__":    wf = simulate(clk_cycles=16, check_cycle=9, check_value=8)    print("cycle  rst   en   q")    for row in wf:        print("{:5d} {:5d} {:4d} {:4d}".format(*row))    print("仿真通过! 计数器在cycle=9时输出8")
目的:用纯 Python 行为模型复现 ModelSim 中 4 位计数器的“时钟驱动 + 复位释放 + 加法回卷”过程,并自动断言验证输出。
  1. class CounterModel定义计数器行为模型,对应 Quartus 工程中的 RTL 模块。
  2. def clock_edge(self, rst_n, en)模拟时钟上升沿触发,只在沿到来时更新寄存器。
  3. self.cnt = (self.cnt + 1) & self.max_val加一后用掩码截断,等价于对 2 的位宽次方取模。
  4. if cycle == 2: rst_n = 1第 2 拍释放复位,对应 testbench 中的复位激励时序。
  5. assert ctr.cnt == check_value自动化断言,相当于在 ModelSim 中写 $display 加条件检查。
  6. if __name__ == "__main__":程序入口,运行后输出仿真记录表格。

常见误区

误区代码编译下载到板子上,LED 亮了就认为功能正确,觉得 ModelSim 仿真纯属浪费时间。

正解板上只能看到外部引脚状态,内部寄存器、状态机的值全看不见。仿真像开业前的沙盘彩排,所有内部信号都透明可见。先仿真定位问题,再上板验证,效率反而最高。

为何常见:LED 反馈直观,波形窗口学习成本高,初学者自然想绕过“麻烦”的仿真。

误区在 testbench 里写 `initial rst_n = 0;`,结果波形全是 0,以为设计代码写错了。

正解低有效复位必须经历“拉低 → 保持 → 拉高释放”的过程。复位一直拉低相当于餐厅一直关门,逻辑自然不工作。正确激励是 initial begin rst_n = 0; #20; rst_n = 1; end。

为何常见:把复位当成固定电平,忽略了它是一个需要“事件驱动”的激励信号。

误区ModelSim 仿真通过了,直接把同样代码拿去综合下载,结果板上不工作,还以为是工具坏了。

正解initial、#延时、$display 都是仿真专用语句,综合器会忽略或直接报错。可综合代码必须用 always @(posedge clk) 描述时序逻辑。仿真代码和上板代码要分开管理。

为何常见:仿真工具非常宽容,能跑通不代表能综合,两类工具的“执法标准”不同。

误区仿真波形和预期完全一致,就觉得设计百分之百正确,直接拿去板级下载。

正解功能仿真通过只说明逻辑功能正确,还要检查建立保持时间、分析竞争冒险毛刺,必要时跑时序仿真。功能正确与时序收敛是两回事。

为何常见:功能仿真的结果直观可见,时序问题要到布局布线后或上板时才暴露,肉眼难察觉。

面试题

Q1. 在 Quartus 中,使用新建工程向导的第一步通常是?

单选题 · easy

  • A.编写 Verilog 代码
  • B.登记工程名称与目录← 正确答案
  • C.运行波形仿真调试
  • D.下载生成位流文件

答案:B。新建工程向导首先配置工程名称与目录,生成 .qpf 工程文件,相当于餐厅先选址登记。编写代码、仿真、下载都是后续环节,顺序上排在登记之后。

Q2. Quartus 编译后用于 JTAG 下载的位流文件后缀是?

单选题 · easy

  • A.文件后缀为 .v
  • B.文件后缀为 .sof← 正确答案
  • C.文件后缀为 .do
  • D.文件后缀为 .qpf

答案:B。.sof 是 SRAM 对象文件,用于 JTAG 直接配置 FPGA。.v 是 Verilog 源码,.do 是 ModelSim 脚本,.qpf 是 Quartus 工程文件,均不是位流文件。

Q3. ModelSim 中测试平台(testbench)的主要作用是?

单选题 · mid

  • A.自动生成配置位流
  • B.为设计提供激励并检查输出← 正确答案
  • C.代替 FPGA 完成布局布线
  • D.对 PCB 板进行电气测试

答案:B。testbench 像彩排剧本,负责产生时钟、复位等激励,并检查设计输出是否符合预期。位流生成靠 Quartus,布局布线靠 Fitter,电气测试靠示波器,都不是 testbench 的职责。

Q4. 以下哪些属于 ModelSim 中的仿真调试手段?

多选题 · mid

  • A.添加波形观察信号← 正确答案
  • B.设置断点单步执行← 正确答案
  • C.使用断言自动检查← 正确答案
  • D.修改 FPGA 引脚分配

答案:ABC。波形观察、断点单步、断言检查都是仿真调试的常见手段,分别对应看录像、逐帧播放、自动报警。引脚分配属于 Quartus 器件编程阶段,与仿真调试无关。

Q5. 下列 ModelSim 语句中,能正确产生周期为 20ns 的时钟激励的是?

单选题 · mid

  • A.always #10 clk=~clk 周期二十纳秒← 正确答案
  • B.always #20 clk=1 一直输出高电位不翻转
  • C.assign clk=1 组合逻辑持续高电平
  • D.initial clk=0 仅初始化一次不变

答案:A。always #10 clk=~clk 每 10ns 翻转一次,半个周期 10ns,整周期 20ns。B 语句只置高不翻转,C 是组合逻辑常高,D 只执行一次,都无法产生周期信号。

Q6. 寄存器建立时间 t_setup 的含义是?

单选题 · hard

  • A.数据在时钟沿前必须保持稳定的最短时间← 正确答案
  • B.数据在时钟沿后必须保持稳定的最短时间
  • C.时钟从低电平跳变到高电平所需的时间
  • D.信号从输入端传播到输出端的总延迟

答案:A。建立时间指数据必须先于时钟沿到达并稳定,如同顾客必须在演出开始前入座。选项 B 描述的是保持时间,C 是时钟边沿转换时间,D 是组合逻辑传播延迟。

Q7. Quartus 工程中属于“输入”的设计文件类型包括?

多选题 · mid

  • A.Verilog 源码 .v 输入← 正确答案
  • B.时序约束 .sdc 输入← 正确答案
  • C.器件位流 .sof 输出
  • D.编译报告 .rpt 输出

答案:AB。.v 源码和 .sdc 时序约束是工程师提供的设计输入,好比菜谱和营业要求。.sof 位流是编译生成的输出,.rpt 编译报告也是工具产生的输出文件。

Q8. 计数器实例中,异步复位信号 rst_n 正常计数时应接什么逻辑?

单选题 · easy

  • A.高电平复位释放← 正确答案
  • B.低电平保持复位
  • C.随机电平不干扰
  • D.始终为低零电平

答案:A。rst_n 是低有效复位,正常计数时应为高电平,让复位处于释放状态。若一直为低,计数器永远被清零,就像计时器一直被按着复位键。

Q9. 三段式状态机中,负责计算“下一个状态”的逻辑属于哪一段?

单选题 · hard

  • A.时序逻辑状态寄存器
  • B.组合逻辑次态转移方程← 正确答案
  • C.组合逻辑输出方程
  • D.时序逻辑输出寄存器

答案:B。三段式状态机中,状态寄存器用时序逻辑记住当前状态,次态逻辑用组合逻辑根据当前状态和输入算出下一状态,输出逻辑负责产生输出。S_next=δ(S_cur,x_in) 正是第二段的职责。

Q10. 仿真波形中发现输出存在毛刺,哪些方法有助于排查?

多选题 · hard

  • A.检查组合逻辑竞争冒险← 正确答案
  • B.检查复位信号亚稳态← 正确答案
  • C.波形窗口放大定位毛刺← 正确答案
  • D.修改引脚分配重新上板

答案:ABC。毛刺常由竞争冒险(同一信号多条路径延迟不同)或亚稳态(信号在时钟沿附近跳变)引起,放大波形是定位毛刺时刻的基本操作。修改引脚分配与毛刺成因无关,属于上板阶段的事。