nand2tetris 硬件模拟器中的错误

问题描述 投票:0回答:1

我目前正在上一门涵盖 nand2tetris 工具等的课程,我的第一份作业是实现一些芯片,但它们似乎都不起作用,我尝试的每个芯片都会收到一条错误消息。这是我第一次处理这样的事情,所以我会感谢任何反馈和更正。

Chip 1 - 它应该将输入乘以 2,错误:在工作文件夹和内置文件夹中找不到 Chip out[0]

    IN in[16];
    OUT out[16];
    
    PARTS:
    out[0] = 0;
    out[1] = in[0];
    out[2] = in[1];
    out[3] = in[2];
    out[4] = in[3];
    out[5] = in[4];
    out[6] = in[5];
    out[7] = in[6];
    out[8] = in[7];
    out[9] = in[8];
    out[10] = in[9];
    out[11] = in[10];
    out[12] = in[11];
    out[13] = in[12];
    out[14] = in[13];
    out[15] = in[14];
}

芯片 2 - 应该返回两个输入不同的位数,错误:第 6 行:diff[0],内部节点的子总线可能无法使用

    IN a[16], b[16];
    OUT out[16];
    
    PARTS:
    Xor(a=a[0], b=b[0], out=diff[0]);
    Xor(a=a[1], b=b[1], out=diff[1]);
    Xor(a=a[2], b=b[2], out=diff[2]);
    Xor(a=a[3], b=b[3], out=diff[3]);
    Xor(a=a[4], b=b[4], out=diff[4]);
    Xor(a=a[5], b=b[5], out=diff[5]);
    Xor(a=a[6], b=b[6], out=diff[6]);
    Xor(a=a[7], b=b[7], out=diff[7]);
    Xor(a=a[8], b=b[8], out=diff[8]);
    Xor(a=a[9], b=b[9], out=diff[9]);
    Xor(a=a[10], b=b[10], out=diff[10]);
    Xor(a=a[11], b=b[11], out=diff[11]);
    Xor(a=a[12], b=b[12], out=diff[12]);
    Xor(a=a[13], b=b[13], out=diff[13]);
    Xor(a=a[14], b=b[14], out=diff[14]);
    Xor(a=a[15], b=b[15], out=diff[15]);
    
    Add16(in = diff, out = out);
} 

芯片 3 - 返回从 MSB 开始的一行中零的数量,错误:第 8 行,无法将门的输出引脚连接到部件

    IN in[16];
    OUT out[16];      

    PARTS:
    
    And(a=in[15], b=true, out=out[0]);  
    And(a=in[14], b=out[0], out=out[1]); 
    And(a=in[13], b=out[1], out=out[2]); 
    And(a=in[12], b=out[2], out=out[3]);
    And(a=in[11], b=out[3], out=out[4]);
    And(a=in[10], b=out[4], out=out[5]);
    And(a=in[9], b=out[5], out=out[6]);
    And(a=in[8], b=out[6], out=out[7]);
    And(a=in[7], b=out[7], out=out[8]);
    And(a=in[6], b=out[8], out=out[9]);
    And(a=in[5], b=out[9], out=out[10]);
    And(a=in[4], b=out[10], out=out[11]);
    And(a=in[3], b=out[11], out=out[12]);
    And(a=in[2], b=out[12], out=out[13]);
    And(a=in[1], b=out[13], out=out[14]);
    And(a=in[0], b=out[14], out=out[15]);

}

我对此很陌生,所以我知道它们不是最优化甚至正确的解决方案,但这些是我唯一的想法。

hdl nand2tetris
1个回答
0
投票

我建议你仔细阅读NAND2Tetris这本书的附录,了解HDL的格式和限制。

例如,您不能像在芯片 1 中那样直接连接输入和输出。部件列表必须完全相同,即连接在一起的部件(子芯片)列表。所以每个输入和输出之间必须至少有一个部分。正在生成“错误:在工作和内置文件夹中找不到芯片 out[0]”,因为 HDL 编译器期望看到芯片列表,因此它期望第一个标记(“out[0]”)是一个芯片名称,不存在这样的芯片。

转向芯片 2,错误消息准确地告诉您问题所在:您无法从多个芯片的输出创建内部总线。但是,您可以让每个芯片生成单个位输出(即:diff0、diff1,...),然后指定它们连接到芯片输入总线的哪个位(即:Add16(in[0]= diff0,in[1]=diff1,...)。此外,Add16 将两个数字相加,据我所知,这不是您想要计算的。

最后,在芯片 3 中,您所做的事情与芯片 2 中相同,但使用的是输出总线而不是内部总线,而且,看起来您正在尝试输出一个位位置而不是位数.

© www.soinside.com 2019 - 2024. All rights reserved.