共计 1301 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
刚接触数字电路时,我在用 16- 4 编码器控制七段数码管时经常遇到两个头疼的问题:一是当多个输入信号同时有效时,数码管显示的数字会乱跳;二是明明输入信号已经消失,数码管还会短暂显示之前的数字(残影现象)。通过 Logisim 仿真可以明显看到这些现象:

当输入信号 D3 和 D5 同时有效时,输出在 5ms 内出现 3 次跳变
硬件设计
优先级编码真值表
设计带优先级的 16- 4 编码器时(D15 优先级最高),真值表如下:
| 有效输入 | B3 | B2 | B1 | B0 |
|---|---|---|---|---|
| D15 | 1 | 1 | 1 | 1 |
| D14 | 1 | 1 | 1 | 0 |
| … | … | … | … | … |
| D0 | 0 | 0 | 0 | 0 |
门电路实现
在 Logisim 中用原生门搭建的典型方案:
- 第一级用 OR 门合并相同优先级的输入
-
例如 B3 = D15 + D14 + D13 + D12
-
第二级用 AND-NOT 组合实现优先级覆盖
- 例如 B2 = (D11+D10+D9+D8) ・!B3
注意黄色标注的关键信号路径
代码对照
等效的 Verilog 行为级描述(可综合):
module encoder_16x4(input [15:0] din,
output reg [3:0] dout
);
always @(*) begin
casex(din)
16'b1XXXXXXXXXXXXXXX: dout = 4'b1111;
16'b01XXXXXXXXXXXXXX: dout = 4'b1110;
// ... 其他优先级
default: dout = 4'b0000;
endcase
end
endmodule
测试代码建议加入 10ns 的输入变化间隔:
initial begin
#10 din = 16'b0000000000000001;
#10 din = 16'b0000000000000010;
// ...
end
调试技巧
时序图工具
Logisim 的时序窗口(Window→Timing Diagram)特别有用:
- 右键点击信号线选择 ”Add to Diagram”
- 调整时钟频率到 1kHz 左右观察信号
- 黄色箭头标识信号传播路径
消除毛刺
当信号跳变时产生的毛刺,可通过并联电容滤波。计算公式:
$$ C = \frac{-t_{glitch}}{R \cdot ln(V_{th}/V_{dd})} $$
例如:
– 假设毛刺宽度 $t_{glitch}=5ns$
– 上拉电阻 $R=1k\Omega$
– 阈值 $V_{th}=0.5V_{dd}$
– 计算得 $C≈7pF$
避坑指南
输入悬空问题
未连接的输入引脚在 Logisim 中会显示为蓝色,表现为随机高低电平。解决方法:
- 对所有未使用输入接下拉电阻
- 在 Verilog 中设置 default case
数码管极性
常见两种驱动方式:
- 共阳极:编码器输出需接反相器
- 共阴极:直接连接即可
延伸思考
如果要扩展为 32 点阵管驱动系统:
- 增加 5 -32 译码器级联
- 采用扫描显示技术(分时复用)
- 添加 BCD 译码模块时注意:
case(bcd_in) 4'd0: seg = 7'b0111111; //... endcase
通过这个项目,我深刻体会到硬件设计就像搭积木——每个门电路的位置、走线的路径都会影响最终效果。建议初学者一定要多使用 Logisim 的仿真功能,它能直观展示信号是如何在电路中流动的。下次我准备尝试用这个编码器做一个小型计算器,你们有什么建议吗?
