数字电路测试题
本题库覆盖数制与补码、逻辑门/布尔代数/卡诺图、组合逻辑、触发器、寄存器与计数器、建立/保持时间与亚稳态、三态总线、逻辑电平标准、存储器、电平转换、FPGA/Verilog 入门、时钟与复位设计。题型分为「概念判断」「填空」「计算」「简答与情景」四组。
核对口径:时序题一律写清"用最大延迟还是最小延迟、偏斜对谁不利";数字题给公式 → 代入 → 结果 → 单位;电平题给具体门限(V_{IH}、V_{OL})而不是"一般能行"。
一、概念判断
判断:8 位有符号补码能表示的范围是 −128 ~ +127。
正确。判据:n 位补码范围是 -2^{n-1}\sim+(2^{n-1}-1)。代入 n=8:-128\sim+127,共 256 个值。
多出来的负端 -128 对应补码 10000000,它没有对应的正数(+128 超出范围)。补码的价值在于把减法化为加法、符号位参与运算,且 0 只有一种表示(原码/反码都有 ±0 两个零)。
详见 数制与补码。
判断:组合逻辑电路的输出只取决于当前输入,与历史输入无关;时序逻辑则与历史有关。
正确。判据:组合逻辑无记忆元件(无状态),输出 Y=f(X);时序逻辑含存储元件(触发器/寄存器),输出 Y=f(X,\text{state}),而状态是历史的结果。
例:加法器、译码器、MUX 是组合逻辑;计数器、状态机、移位寄存器是时序逻辑。判据的工程含义:组合逻辑的延迟可以用一条最长路径表示,时序逻辑还多了"时钟沿"这个时间基准。
判断:D 触发器在时钟上升沿把 D 端的值打入 Q;其余时间 Q 保持不变。
正确。判据:边沿触发(edge-triggered)——只在时钟有效沿采样 D 并更新 Q,其他时刻保持。这是同步设计的基本单元。
两个必须一起记住的前提:① 采样成立的前提是 D 在时钟沿前后满足建立/保持时间,否则进入亚稳态;② 触发器还有 t_{co}(clock-to-Q)延迟,Q 不是"瞬间"变化,这正是时序分析里要算进去的一项。
详见 触发器。
判断:建立时间 t_{su} 是指时钟沿到来之后数据必须保持稳定的时间;保持时间 t_h 是时钟沿之前数据必须稳定的时间。
错误,二者说反了。判据:建立时间(Setup Time)t_{su} 是时钟有效沿之前数据必须稳定的最小时间;保持时间(Hold Time)t_h 是时钟有效沿之后数据必须继续稳定的最小时间。
记忆锚点:"建立"在沿前,"保持"在沿后,两者合起来构成以时钟沿为中心的采样窗口(aperture)。数据在窗口内变化就可能进入亚稳态。
详见 时序分析:建立/保持与亚稳态。
判断:亚稳态(Metastability)发生时,触发器输出会长时间停在逻辑 0 与 1 之间的不确定电平,可能最终随机落到某一电平。
正确。判据:触发器内部正反馈环路的初始压差 \Delta V_0 太小,输出停在逻辑阈值附近,既不满足 V_{OH} 也不满足 V_{OL};收敛时间按指数规律分布、不可预测,最终随机落到 0 或 1。
工程含义:亚稳态不能"根除",只能把失效概率压到可接受——用两级同步器让第一级承受亚稳态、第二级隔一个周期再采样,按 MTBF 计算(MTBF=\dfrac{e^{t_r/\tau}}{T_0f_{clk}f_{data}})。跨时钟域必须用同步器、握手或异步 FIFO。
详见 时序分析:建立/保持与亚稳态。
判断:三态门(Tri-state)输出有三种状态:0、1、高阻;多个三态输出可并接在同一总线上,但同一时刻只能有一个被使能。
正确。判据:第三态是高阻(Hi-Z),相当于断开。总线共享靠分时使能。
若两个三态门同时使能且输出相反,会形成 0 与 1 直通的短路路径,电流可达数百 mA,轻则总线波形异常,重则烧毁输出级。所以三态总线必须有严格的仲裁/使能逻辑,上电与复位期间所有使能应为无效,并加总线保持或上拉/下拉防止悬空。
详见 三态总线与上下拉。
判断:3.3V 的 CMOS 输出可以直接驱动 5V 的 CMOS 输入。
错误(一般不能直接用)。判据是门限电压:5V CMOS 输入的 V_{IH}=0.7V_{DD}=3.5\ \text{V},而 3.3V CMOS 输出的 V_{OH}\approx V_{DD}-0.2\sim0.4\ \text{V}=2.9\sim3.1\ \text{V}<3.5\ \text{V},不保证被判为高电平,会出现随机误判。
能直接驱动的是TTL 门限的 5V 器件:74LS/74HCT 等的 V_{IH}=2.0\ \text{V},3.3V 输出够用。所以"3.3V 能不能驱动 5V"必须查对方的 V_{IH},而不是看"都是 CMOS"。
反向(5V 输出 → 3.3V 输入)更危险:5V 高电平可能超过 3.3V 器件的绝对最大额定值,需要电平转换或确认引脚是否 5V tolerant(且 tolerant 通常只保证不损坏,不保证速度)。
判断:同步设计中,所有触发器共用同一时钟、同一复位,是避免亚稳态与时序混乱的首选做法。
正确(但有前提)。判据:同步设计的关键是所有寄存器由同一时钟、或由同一 PLL 产生且相位关系确定的时钟驱动,这样数据路径延迟可以在统一时间基准上计算、静态时序分析(STA)才有意义。
两点修正:① 复位不一定要"同一"——多复位域很常见,推荐"异步置位、同步释放"(async assert / sync deassert),避免复位撤销时落入亚稳态;② 同步设计不能消除亚稳态,异步输入仍必须经过同步器,跨时钟域仍必须做 CDC 处理。
判断:异步 FIFO 的读写指针用二进制码跨时钟域传递是安全的,因为二进制计数器每个时钟只加 1。
错误。判据不是"数值只加 1",而是"同时翻转的位数":二进制码在进位时可能多位同时变化,例如 0111→1000 是 4 位全变;跨域采样时各位的到达时刻与同步器延迟不同,会采到从未出现过的混合值。
格雷码(Gray Code)每步只变一位,跨域采样最多得到"旧值"或"新值"(差 1 个计数值),所以异步 FIFO 的读写指针先转格雷码再同步。但注意格雷码只解决"单 bit 跳变",多位数据仍不能逐位同步,必须用握手或异步 FIFO 保证整组数据的原子性。
二、填空
n 位二进制计数器共有 ____ 个状态;n 级二进制计数器(每级二分频)最高位 Q_{n-1} 的输出频率为 ____。
状态数 2^n;最高位输出频率 f/2^n(最低位 Q_0 为 f/2)。
判据:每级触发器都是一次二分频,第 k 级(从 0 计)输出 f/2^{k+1};n 级串联后最高位就是 f/2^n。例如 8 位计数器在 1MHz 时钟下,最高位 Q_7 的频率是 10^6/256=3.906\ \text{kHz}。
注意"模"的用法:模 2^n 计数器有 2^n 个状态、计满 2^n 次回零;"模 2 计数器"专指一只 T 触发器(输出 f/2),两者别混。
详见 寄存器、计数器与分频。
ROM/RAM/SRAM/DRAM/Flash/EEPROM 中,掉电数据保留的是 ____;需刷新(Refresh)的是 ____;非易失存储器中可按字节改写的是 ____。
掉电保留:ROM、Flash、EEPROM(非易失)。需刷新:DRAM(电容漏电,必须周期性刷新)。非易失存储器中按字节改写:EEPROM(Flash 按扇区/块擦除,不能单字节改写)。
判据:SRAM 用 6 管双稳态锁存,快、易失、不需刷新;DRAM 用 1T1C 电容存储,密度高、必须刷新;Flash 靠浮栅电荷,擦除粒度大(扇区/块),写入前要先擦;EEPROM 支持字节级擦写,但容量小、寿命有限(约 10⁵~10⁶ 次)。
详见 存储器。
格雷码(Gray Code)相邻两码只差 ____ 位,适合 ____,避免组合逻辑冒险产生的尖峰。
只差一位。适合旋转编码器、异步 FIFO 指针、状态机的状态编码等场合,避免二进制跳变时多位同时翻转产生的毛刺(glitch)与跨域采样错误。
判据:格雷码的汉明距离恒为 1,所以任一时刻只有一根线在变,采样端要么拿到旧值、要么拿到新值,不会拿到"混合值";代价是格雷码不能直接做算术运算,需要先转二进制。
详见 数制与补码。
Verilog 中 always @(posedge clk) 块描述 ____ 逻辑;assign 连续赋值描述 ____ 逻辑。
always @(posedge clk) 描述时序(寄存器)逻辑;assign 描述组合逻辑。
判据(编码规范):时序块内用非阻塞赋值 <=,组合块(always @(*))内用阻塞赋值 =;同一个信号不能既在时序块又在组合块里赋值;组合块的所有分支都要赋值(或写 default),否则综合出隐含锁存器。
复位分 ____ 复位与 ____ 复位;推荐 ____ 复位以 ____。
异步复位(立即生效,不依赖时钟)与同步复位(时钟沿生效)。推荐异步置位、同步释放:复位到达时立即生效(不依赖时钟,掉电/时钟未稳时也能复位),释放时经两级同步器对齐到时钟沿,避免恢复/移除时间(recovery/removal)违例与复位撤销时的亚稳态。
判据:纯同步复位在时钟未起振时无法复位;纯异步复位在撤销沿可能违反 recovery/removal,导致不同触发器退出复位的时间不一致,状态机进入非法状态。两者结合才稳。
详见 时钟与复位设计。
三、计算
把十进制 −13 表示为 8 位补码。
公式:负数补码 = 其绝对值的原码按位取反再加 1(等价于 2^8-13)。
代入:+13 的 8 位原码是 00001101;取反得 11110010;加 1 得 11110011。
结果:-13 的 8 位补码 = 11110011(十六进制 0xF3)。
验算:按权展开 11110011=-128+64+32+16+0+0+2+1=-13 ✓;或用 2^8-13=256-13=243=11110011_2 ✓。
详见 数制与补码。
用卡诺图化简:F=\sum m(0,1,2,3,4) 的 3 变量函数,写出最简与或式。
变量约定:3 变量 A、B、C,最小项 m_i 的下标为 ABC 的二进制值:m_0=000、m_1=001、m_2=010、m_3=011、m_4=100。
分组:
- m_0\sim m_3 四个相邻格全为 1,A=0 恒定、B、C 变化,合并得 \bar{A}。
- m_4(100)与 m_0(000)相邻,A 变化、B=0、C=0 恒定,合并得 \bar{B}\bar{C}。
结果:F=\bar{A}+\bar{B}\bar{C}(2 项、3 个文字)。
验算:m_0 被两项覆盖(\bar A=1、\bar B\bar C=1),m_1\sim m_3 由 \bar A 覆盖,m_4 由 \bar B\bar C 覆盖;m_5\sim m_7 两项都为 0 ✓。判据:卡诺图圈 2 的幂个相邻 1,圈越大项越少;圈可以重叠,但每个 1 至少被圈一次。
某触发器数据路径延迟 t_{co}=1\text{ns},组合逻辑延迟 t_{logic}=8\text{ns},布线延迟 2\text{ns},建立时间 t_{su}=1\text{ns}。求最高时钟频率。
建立方程——公式:T\ge t_{co}+t_{logic}+t_{route}+t_{su}(未计偏斜与抖动,题中未给出,按 0 处理并注明)。
代入:T\ge1+8+2+1=12\ \text{ns}。
结果:f_{max}=\dfrac{1}{T}=\dfrac{1}{12\times10^{-9}}=83.3\times10^{6}\ \text{Hz},即 83.3MHz。
判据:这个 83.3MHz 是理论极限,实际设计目标应不超过它的 90%~95%(约 75~79MHz),留出 PVT 与批次波动余量。
保持检查(不能沿用上面的数):保持看的是同一条时钟沿,且必须用最小延迟(快角):t_{co,min}+t_{logic,min}+t_{route,min}\ge t_h+t_{skew}。题目给的全是最大延迟,不能直接代入——这是时序分析里最常见的错。举例:若快角下三项之和为 2ns、t_h=0.5\text{ns}、t_{skew}=0.3\text{ns},则 2\ge0.8,保持满足。
详见 时序分析:建立/保持与亚稳态。
4 位二进制计数器,输入时钟 1MHz。输出 Q_0、Q_2、Q_3 的频率各是多少?
公式:第 k 级输出 f_{Q_k}=\dfrac{f}{2^{k+1}}(每级二分频)。
代入与结果:
- Q_0:1\ \text{MHz}/2=500\ \text{kHz}
- Q_2:1\ \text{MHz}/2^{3}=125\ \text{kHz}
- Q_3:1\ \text{MHz}/2^{4}=62.5\ \text{kHz}
判据:Q_0\to/2、Q_2\to/8、Q_3\to/16;4 位计数器走完 16 个状态回到起点,所以最高位周期是时钟的 16 倍。
详见 寄存器、计数器与分频。
16 位地址总线能寻址多少字节存储器?某 SRAM 芯片容量 32K×8 位,地址线几根?数据线几根?
16 位地址——公式:2^{16}=65536 个地址单元。按每单元 1 字节计,寻址 64KB(若数据总线是 16 位,则是 64K×16 位 = 128KB,所以"能寻址多少"必须先定数据宽度)。
32K×8 位 SRAM——容量 32\text{K}=2^{15},所以地址线 15 根(A0~A14);每个单元 8 位,所以数据线 8 根(D0~D7)。
结果:地址线 15 根、数据线 8 根;总容量 32\times1024\times8\ \text{bit}=256\ \text{Kbit}=32\ \text{KB}。
判据:存储容量 = 字数 × 位宽,地址线数 =\log_2(\text{字数}),数据线数 = 位宽;"32K×8"里的 32K 是字数(2^{15}),不是总位数。
详见 存储器。
某同步路径:t_{co}=1\text{ns},t_{logic,max}=6\text{ns},t_{route}=2\text{ns},t_{su}=1\text{ns},对建立不利的时钟偏斜 0.5\text{ns},抖动 0.2\text{ns}。求最高时钟频率。
建立方程——公式:T\ge t_{co}+t_{logic,max}+t_{route}+t_{su}+t_{skew}+t_{jitter}。
代入:T\ge1+6+2+1+0.5+0.2=10.7\ \text{ns}。
结果:f_{max}=\dfrac{1}{10.7\times10^{-9}}=93.5\times10^{6}\ \text{Hz},即 约 93.5MHz。
判据:偏斜与抖动各吃掉 0.5ns 与 0.2ns,合计 0.7ns,相当于把频率从 1/10=100\ \text{MHz} 拉低到 93.5MHz——约 6.5% 的频率损失。工程上还要再留 5%~10% 设计裕量,实际目标不超过约 85MHz。
偏斜方向:若收端时钟比发端晚到(正偏斜),对建立有利,此时偏斜项取负;但同一个偏斜对保持不利,所以建立/保持必须用"最坏角"分别算,不能用一个带符号的偏斜同时套两式。
详见 时序分析:建立/保持与亚稳态。
四、简答与情景
情景:一个异步按键信号直接接到某时钟域的 D 触发器输入,产品偶发死机。最可能的原因?如何修复?
现象:平均几小时到几天死机一次,示波器抓不到;温度、电压变化时概率改变。
原因:按键是异步信号(且机械抖动),相对时钟的到达时刻随机,一旦落入建立/保持窗口就触发亚稳态——第一级输出停在中间电平或收敛时间不定,后级逻辑采到非法值,状态机跑飞。这是典型的 CDC(跨时钟域)缺陷,不是"按键坏了"。
修复(按顺序):
- 消抖:RC 滤波 + 施密特触发器,或软件消抖(20ms 量级)。
- 两级同步器:异步信号先进两级触发器(同一时钟域),第一级承受亚稳态、第二级隔一个周期再采样。
- 关键控制信号加安全恢复:状态机加非法状态自恢复、看门狗兜底。
判据:单 bit 慢变信号用两级同步器即可;多 bit 数据或快速事件必须用握手/异步 FIFO,不能逐位同步。
详见 时序分析:建立/保持与亚稳态、GPIO。
简答:为什么 FPGA 设计推荐同步设计、避免组合环路与锁存器?
同步设计的判据:所有寄存器由同一时钟驱动,路径延迟可以用一条不等式约束(T\ge t_{co}+t_{logic}+t_{route}+t_{su}+t_{skew}+t_{jitter}),静态时序分析(STA)能穷举所有路径给出裕量;异步逻辑没有统一时间基准,无法做 STA。
组合环路(combinational loop)的判据:输出经组合逻辑又回到自己的输入,没有寄存器打断,方程可能无解或振荡,综合工具直接报错。
锁存器(latch)的判据:组合 always/if/case 分支不全时,工具为了"保持原值"推断出电平敏感锁存器;锁存器对毛刺透明、时序分析复杂、跨时钟域极易出错。做法:所有分支都赋值、写 default、用 always @(*) 并在块首给默认值。
现象:仿真全过、综合报告里有 latch 推断警告、上板后偶发错误。原因:某个分支漏赋值,锁存器在组合逻辑里"记住"了上一步的值,毛刺被锁住并传播。解决:把警告当错误处理,补齐 else/default,并在块首给所有输出赋默认值。
情景:3.3V MCU 的 UART TX 要接 5V 串口设备,直接连接出现乱码。原因?解决方案?
现象:波特率设置正确、线序正确,但收到乱码或时好时坏;降低波特率有时能改善。
原因:电平不匹配。5V CMOS 输入的 V_{IH}=3.5\ \text{V},3.3V 输出的 V_{OH} 只有约 3.0V,被判为不定,接收端在 0/1 之间随机判决——波特率越高、采样点越靠近边沿,误码越多。反方向(5V TX → 3.3V RX)还可能超过 3.3V 引脚的绝对最大额定值,造成过压损伤。
解决:
- 专用电平转换芯片(如 TXB010x 系列、74LVC1T45),双向、带方向控制,速度够。
- 分立 MOS 管双向电平转换(一只 NMOS + 两侧上拉),成本低,适合低速 UART。
- 确认对方门限:若 5V 器件是 TTL 门限(V_{IH}=2.0\ \text{V},如 74HCT、MAX232 的 TTL 侧),3.3V 可以直接驱动。
- RX 方向必须防过压:串电阻 + 钳位二极管,或选 5V tolerant 引脚(仍需查数据手册确认)。
- 若两边都是 RS-232 电平(±12V),中间必须加收发器,不能直连。
详见 电平转换、串口与 RS-232。
简答:什么是门控时钟(Gated Clock)?它省电但有什么风险?
定义:用使能信号控制时钟是否到达某个模块,模块空闲时停止时钟,省掉触发器翻转与时钟树的动态功耗。
判据与风险:
- 毛刺:用组合逻辑(与门/或门)直接"与"时钟,使能信号的毛刺会变成时钟毛刺,触发器误触发。必须用集成时钟门控单元(ICG,带锁存器的专用单元),让使能在时钟低电平期间锁存。
- 偏移与时钟树:门控单元插入后时钟到达时间改变,破坏原本平衡的时钟树,可能引入 hold 违例。
- STA 与测试:门控时钟让时序分析、扫描测试(DFT)复杂化,工具需要识别 ICG 并做时钟门控检查。
- 复位/唤醒:门控后模块内寄存器停止更新,唤醒后需要重新同步或复位。
现象:为了省电用手写"与门"门控时钟,功能仿真正常,上板后偶发误触发、寄存器写了不生效。原因:使能信号上的毛刺被"与"进时钟,产生窄脉冲;同时门控单元改变了时钟到达时间,破坏了时钟树平衡。解决:改用库里的 ICG 单元或综合工具自动插入的门控(由带使能的时序块推断),FPGA 里用 CE 端口代替门控时钟。
做法:优先用综合工具自动插入的时钟门控(always @(posedge clk) 带使能,工具会推断 ICG),不要手写门控时钟;FPGA 里用 CE(时钟使能)端口而不是门控时钟。