Nand2Tetris项目Mux4Way16芯片HDL实现无法在HardwareSimulator正常运行
Mux4Way16 故障排查与修复
*注意Nand2Tetris的位向量索引规则:sel[2]中sel[1]是最高位(MSB),sel[0]是最低位(LSB),对应官方定义的真值表:
- sel[1]sel[0] = 00 → 输出a
- sel[1]sel[0] = 01 → 输出b
- sel[1]sel[0] = 10 → 输出c
- sel[1]sel[0] = 11 → 输出d*
现有代码的核心问题
直接代入4种sel组合计算你当前代码的输出,和官方要求对比就能发现矛盾:
| sel[1] | sel[0] | 你代码的输出 | 官方要求输出 | 匹配度 |
|---|---|---|---|---|
| 0 | 0 | a | a | 匹配 |
| 0 | 1 | c | b | 不匹配 |
| 1 | 0 | b | c | 不匹配 |
| 1 | 1 | d | d | 匹配 |
错误根源有两点:
- 用
Xor(sel[0], sel[1])生成的finalSel没有实际分层逻辑作用,无法区分「前两路a/b」和「后两路c/d」的组选择边界 - 最后一级组选择Mux错用了低位
sel[0]作为控制信号,组间选择必须用高位sel[1]
正确实现方案
四选一多路选择器采用标准树型分层选择结构,分两层完成选择:
- 组内选择:用低位
sel[0]同时控制两个独立Mux16,分别从{a,b}、{c,d}两组中选出对应的值 - 组间选择:用高位
sel[1]控制最后一级Mux16,从第一步的两个组结果中选出最终输出
对应可直接运行的HDL代码:
PARTS: // 组内选择:sel[0]控制a/b、c/d的选择 Mux16(a=a, b=b, sel=sel[0], out=abResult); Mux16(a=c, b=d, sel=sel[0], out=cdResult); // 组间选择:sel[1]控制两组结果的选择 Mux16(a=abResult, b=cdResult, sel=sel[1], out=out);
内容的提问来源于stack exchange,提问作者Meni
相关产品推荐
相关产品推荐

