问题描述
我是一个举世无双的榜样学习者,这意味着对我的学习风格的描述使我不知所措,因为我需要首先看清楚,然后才能实现任何解释。我一直在玩 Nand2Tetris 程序的Hack Assembly Language .asm文件,并创建了一些片段来学习,使用和学习。
我的问题是,例如,如果我想计时,我该如何计时或滴答运行一个功能所需的时间?我正在将DFF门作为一种可能的解决方案,但是对于如何继续使用DFF来完成此任务感到非常困惑,并且需要查看可靠的示例代码。我希望有人能给我一个如何以ASM格式进行编码的代码示例。
例如:
-
def pairUpF[A,B,F[x] <: IterableOps[x,F,F[x]]](as: F[A],nonlastB: B,lastB: B): F[(A,B)] = { val it = as.iterator val builder = as.iterableFactory.newBuilder[(A,B)] def loop(prev: A): Unit = { if (it.hasNext) { builder.addOne(prev -> nonlastB) loop(it.next()) } else builder.addOne(prev -> lastB) } if(it.hasNext) loop(it.next()) builder.result() }
如何存储时间或勾选变量? -
Store TimeStart
我已经完成了这一部分。 -
Count 1-100000
如何存储时间或勾选变量?
如何将Store TimeEnd
转换为易读的内容?
这可能吗?
解决方法
无法以编程方式读取时钟/滴答时间; Hack机器无法获取该信息。
类似地,CPU仿真器没有能力执行此操作,尽管可以选择转储指令跟踪(可能会为将来提供一些建议)。
您当然可以手动跟踪代码并找出执行了多少指令。由于每条指令需要一个周期,因此相对简单。
如果您绝对绝望,我写了一个python版本的CPU仿真器,它在功能单元级别上模拟了机器,这是在中继逻辑中实现Hack CPU的项目的一部分。它可以跟踪说明,并且可能会进行修改以帮助您完成此操作。您可以在这里找到它:https://github.com/RJWoodhead/Relay2Tetris/blob/master/Simulator.md
,@MadOverlord正确指出:
... Hack机器无法获取该信息。
但是,我注意到您正在尝试使用DFF之类的低级门来提出解决方案。大概是因为读取诸如“之类的东西而在看DFF,所以DFF的时钟输入会根据主时钟的信号而不断变化” , Chapter 3,page 42 。我认为您可能误解了此处引用的时钟的本质,并弄清了误解将很有用。
从高度上讲,此时钟代表控制CPU执行操作的时间的离散时间单位,但它不会以人为单位跟踪时间的流逝。以下是 Chapter 3,page 42 的相关摘录:
-
“从“滴答”开始到随后的“ tock”结束之间经过的时间称为周期,每个时钟周期都用来模拟一个离散的时间单位。”
-
“当前时钟相位(滴答声或滴答声)由二进制信号表示”
-
“使用硬件电路,该信号会同时广播到整个计算机平台上的每个顺序芯片。”
此时钟的需要是让计算机的内部硬件有足够的时间使机器的内存进入适当的状态,然后再执行下一个操作。例如,如果将两个数字加在一起,则需要先等待内存中的所有位翻转到适当的位置,然后才能继续并将该加法的结果用于其他操作。硬件操作虽然速度很快,但完成不同任务需要不同的时间长度,因此计算机在两次操作之间必须等待一小段时间。这少量时间是时钟周期之间流逝的离散时间单位 。
另一方面,以人为单位跟踪时间的流逝通常是由另一种称为real-time clock的硬件提供的。这与CPU是分开的,因为CPU不需要其行为,因此只会使CPU的执行效率降低。据我所知,nand2tetris不会以任何有意义的方式为用户建模实时时钟(如果我错了,请纠正我)。
我跳过了很多细节,但是我觉得从这个角度来说,这种思路可能足以帮助您思考为什么您的想法行不通。也许您的想法会奏效,而我想念一些东西,让我知道!
祝你好运。