使用Nand2Tetris硬件模拟器加载.hdl文件报错求助
搞定Hardware Simulator里Add16.hdl的"zab无对应源引脚"报错
嘿,我来帮你解决这个头疼的报错!你遇到的zab无对应源引脚问题,说白了就是代码里引用了一个压根没定义的信号zab——要么是手滑拼错了,要么是信号传递的链条断了。结合你贴的Add16代码片段,咱们一步步排查:
最可能的原因:信号名拼写失误
直接定位到第22行的代码,大概率是你把之前用的carry信号(比如你前面用的c、d、e、f这类单字母信号)不小心写成了zab。比如本来应该写c=f,结果手滑写成了c=zab,模拟器找不到这个叫zab的信号来源,就报错了。
解决办法:
- 打开Add16.hdl跳转到第22行,仔细看这一行的FullAdder调用语句
- 对比前后几行的信号命名(你前面都是用c、d、e这种连续的单字母),把写错的
zab改成正确的信号名就行
另一种可能:信号传递链断了
如果zab是你打算用的某个carry信号,但你前面的FullAdder根本没输出这个信号,就直接在第22行用了。比如前面的FullAdder没有把carry输出到zab,却在后面调用时写了c=zab,模拟器自然找不到它的来源。
解决办法:
- 顺着carry信号的传递链往前查:从第一个HalfAdder的
carry=c开始,挨个检查每个FullAdder的carry输出是不是正确传给了下一个的c输入 - 保证每一步的carry信号都有明确的来源,比如前一个FullAdder输出
carry=g,下一个就用c=g,以此类推
给你个规范的参考写法
为了避免拼写错误,你可以给carry信号按顺序编号,比如c0到c15,这样不容易搞混:
HalfAdder(x=x[0], y=y[0], sum=out[0], carry=c0); FullAdder(x=x[1], y=y[1], c=c0, sum=out[1], carry=c1); FullAdder(x=x[2], y=y[2], c=c1, sum=out[2], carry=c2); // ... 一直写到x[15]对应的FullAdder
最后再检查两个点
- 确认你的FullAdder.hdl引脚定义没问题:FullAdder必须有
x、y、c(输入进位)、sum、carry(输出进位)这几个引脚,别把名字拼错了 - 扫一遍Add16里所有的PARTS调用,确保每个参数都对应已有的信号——要么是输入的x/y数组,要么是前面部件输出的信号
内容的提问来源于stack exchange,提问作者George Strawbridge
相关产品推荐
相关产品推荐

