问题标签 [nand2tetris]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
11191 浏览

hdl - 如何在“Nand to Tetris”课程中为 ALU 设置输出标志?

虽然我标记了这个作业,但它实际上是我自己免费完成的一门课程。无论如何,这门课程叫做“从 Nand 到俄罗斯方块”,我希望这里有人看过或上过这门课程,以便我能得到一些帮助。我正处于使用提供的 hdl 语言构建 ALU 的阶段。我的问题是我的芯片无法正确编译。当我尝试为 ALU 设置输出标志时出现错误。我相信问题是我不能下标任何中间变量,因为当我尝试根据一些随机变量(比如输入标志)将标志设置为真或假时,我没有得到错误。我知道问题不在于我尝试使用的芯片,因为我使用的是所有内置芯片。

到目前为止,这是我的 ALU 芯片:

因此,当我尝试将“out”的下标版本发送到 Or8Way 芯片时,问题就出现了。我尝试使用与“out”不同的变量,但遇到了同样的问题。然后我读到你不能下标中间变量。我想也许如果我将中间变量发送到其他芯片,并且该芯片下标它,它会解决问题,但它有同样的错误。不幸的是,我只是想不出一种方法来设置 zr 和 ng 标志而不下标一些中间变量,所以我真的被卡住了!

请注意,如果我用以下内容替换有问题的行,它将编译(但不会给出正确的结果,因为我只是使用一些随机输入):

有人有想法么?

编辑:这是本书的附录,该附录指定了 hdl 的工作原理。具体看第 5 节,它讨论了总线并说:“内部引脚(如上面的 v)可能没有下标”。

编辑:这是我得到的确切错误:“第 68 行,无法将门的输出引脚连接到部件”。不过,错误消息有点令人困惑,因为这似乎不是真正的问题。如果我只是替换“Or8way(in=out[0..7], out=zr1);” 用“Or8way(in=false,out=zr1);” 它不会产生这个错误,这导致我在附录中查找并发现 out 变量,因为它是作为中间派生的,所以不能下标。

0 投票
7 回答
2380 浏览

assembly - 在装配中实现 eq, lt gt 没有跳转

是否可以仅使用 AND、OR 和 NOT 运算符编写逻辑来比较 2 个操作数并在不使用跳转的情况下返回 true/false (-1, 0)?如果是这样,您能否给我一些提示,因为这对我来说似乎是不可能的。我正在尝试用“计算系统的元素”一书的汇编语言来实现 eq、lt 和 gt 。

0 投票
2 回答
4374 浏览

assembly - nand 2俄罗斯方块ASM“预期表达”

我目前正在尝试完成Nand 到俄罗斯方块课程 ( Fill.asm) 第 4 章中的项目。但是,Assembler 给了我以下错误:

“在第 3 行,预期表达式”

我不确定我做错了什么......但下面是我拥有的代码片段:

谁能告诉我为什么我在第 3 行 ( @sum) 上收到此错误?

0 投票
2 回答
5349 浏览

hdl - 我的 DMux 4 方式有什么问题?

它似乎接近工作,显然只是在第 7 行搞砸了?

我已经按如下方式实现了我的 DMux,我只是把它当作一棵树来使用:

0 投票
3 回答
3255 浏览

assembly - 尝试为 nand2tetris 书构建 PC(计数器),但我在逻辑上遇到了一些问题

这是我的代码:

基本上,来自寄存器的值是递增的,仅当 inc 为 1(通过 Mux 检查)时才被接受,然后通过另一个可能重置它的 Mux,然后是另一个可能会或可能不会写入它的 Mux,具体取决于负载值。然后从中产生的任何值(无论是更改的值还是来自旧寄存器的值)都被放入寄存器中。

我究竟做错了什么?

0 投票
5 回答
3512 浏览

assembly - 实现逻辑右移

所以我正在研究 nand2tetris 项目,我想在软件级别实现右移逻辑,因为硬件不支持它。

我知道右移逻辑是除以二。所以我第一次实现它时会计算在值变为 0 或负数之前我能够从初始值中减去 2 的次数。如果数字为负,则类似。

但是,我发现了一个不起作用的场景。我想右移-27139。那么移位后的二进制值是19199。应该是19198。因此我正在寻找一种新的方法来实现移位。

我可以and重视、or重视addsubtract,这就是我可以支配的一切。

OSFTW

这是我在 Hack 实现的汇编语言中的代码:

0 投票
1 回答
728 浏览

nand2tetris - 如何比较 Jack 中的两个数组(来自 Nand2Tetris 的课程)?

我需要比较 cours Nand2Tetris 中的两个数组

但是退货不好!!!

0 投票
3 回答
950 浏览

vim - 如何将当前行的整数加 1

我正在研究 nand2tetris,我最终得到了很多看起来像这样的文件:

所以我一直在拉第一行,然后使用 15p,然后做了:s/0/i/g15 次(i我需要的索引在哪里)。我注意到我可以用 替换它,但即使在这里,我每次运行命令时都:s/\[\d\]/\[i\]/g手动设置值。i是否有我可以运行的命令,以便i自动计算为\d+1,我可以为每一行重复该命令,而无需手动指定值?

0 投票
2 回答
4854 浏览

algorithm - 如何为 Hack 汇编语言的 'eq' 编写解释器?

我正在阅读和研究计算系统的元素,但我被困在某一点上。示例章节跳过接下来的 5 条指令可以在这里找到。

无论如何,我正在尝试实现一个虚拟机(或一个字节码到汇编翻译器),但我被困在跳过接下来的 5 条指令。

您可以在此处找到汇编符号。

目标是实现一个翻译器,将特定的字节码翻译成这个汇编代码。

我成功完成的一个例子是字节码

翻译为:

正如我所说,Hack 的汇编语言可以在我提供的链接中找到,但基本上是:

嗯,这很简单。根据定义,存储器位置 256 是堆栈的顶部。所以

将被翻译成:

这都很好..

我还想再举一个例子:

被翻译成:

我认为这很清楚。

但是我不知道如何翻译字节码

到大会。eq 的定义如下:

其中三个命令(eq、gt、lt)返回布尔值。VM 将真假分别表示为 -1(减一,0xFFFF)和 0(零,0x0000)。

所以我需要分别向寄存器 A 和 D 弹出两个值,这很容易。但是我应该如何创建一个汇编代码来检查值并在结果为真时压入 1,如果结果为假则压入 0?

Hack Computer 支持的汇编代码如下:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我可以做类似的事情:

如果推入堆栈的 2 个值相等,它将保持值 0 或 !0 如果不相等,但这有什么帮助?我尝试使用 D&A 或 D&M,但这也无济于事..

我也可以引入条件跳转,但我怎么知道要跳转到哪条指令?哈克汇编代码没有“跳过接下来的 5 条指令”之类的东西。

[由 Spektre 编辑] 我看到的目标平台摘要

  • 16 位冯诺依曼架构(地址为 15 位,16 位字访问)
  • 数据存储器 32KW(读/写)
  • 指令(程序)内存 32KW(只读)
  • 本机 16 位寄存器 A,D
  • 通用 16 位寄存器 R0-R15 映射到数据存储器的 0x0000 - 0x000F
  • 这些很可能也用于:SP(R0),LCL(R1),ARG(R2),This(R3),That(R4)
  • 屏幕映射到 0x4000-0x5FFF 的数据存储器(512x256 B/W 像素 8KW)
  • 键盘在 0x6000 处映射到数据存储器(如果最后一次按键,则为 ASCII 码?)

在此处输入图像描述

0 投票
2 回答
2899 浏览

hdl - 逻辑门 XOR HDL 不适用于 Nand2Tetris

我不太清楚为什么我的 Nand2tetris 模拟器一直告诉我第 3 行错误。谁能告诉我以下代码的任何问题: