概述
你真的有很多选择。我将总结我对如何翻译指令的看法,但我也会提供一些我刚开始时的选择。
我的看法
首先,从二进制输入的角度来思考是最容易的。假设您有一个 16 位微处理器。(也就是说,指令以 16 位二进制编码。)考虑一个将数字放入寄存器的汇编操作 SET。例如:
SET(R1, 12) // Stores 12 into register 1
让我们任意选择(因为即使在任何标准架构中,选择也确实是任意的)选择将 SET 指令翻译成以下 16 位二进制值 I:
0001 0001 0000 1100
基本上,我只是制定了一个约定。但这里是我如何分解它。我选择让位 I[15:12](以大端符号表示)表示特定指令。我选择让整数 1 对应指令 SET。现在我已经决定了那个约定,我可以说如果我有一个 SET 指令,让位 I[11:8] 对应于寄存器。(显然这意味着我将只有 16 个寄存器:4^2=16)。最后,我让位 I[7:0] 对应于我要存储在给定寄存器中的数据。让我们再看一下二进制的 SET(R1, 12) (为了清楚起见,我用换行符分隔每组四个):
if I = 0001 0001 0000 1100
I[15:12] = 0001 (binary) = 1 (decimal) = SET instruction
I[11:8] = 0001 (binary) = 1 (decimal) = R1 since I[15:12] correspond to SET.
I[7:0] = 0000 1100 (8-bit binary) = 12 (decimal) = value to store in R1.
如您所见,微处理器中的其他一切都变得非常简单。假设您在 RAM 中存储 4 行指令。你有一个附在时钟上的计数器。计数器通过 RAM 中的行计数。当时钟“滴答”时,一条新指令从内存中出来。(即下一条指令从 RAM 中出来——尽管在插入 JUMP 语句后这可能有点随意。) RAM 的输出通过多个位选择器。您选择位 I[15:12] 并将它们发送到控制单元 (CLU),它会告诉您要传达的指令。即 SET、JUMP 等。然后根据找到的指令,您可以决定允许写入寄存器或添加寄存器,或者您选择在架构中包含的任何其他内容。
现在幸运的是,已经为您选择了机器指令二进制值的任意约定(如果您想遵循它们)。这正是指令集架构 (ISA) 所定义的。例如MIPS、HERA等。为了清楚起见,您在设计电路时创建的实际实现被称为微架构。
学习资源
文本
哈里斯和哈里斯的书是本科计算机体系结构课程最著名的教材之一。这是一个非常简单和有用的文本。整个事情都可以在这里免费获得一些随机学校的PDF格式。(快速下载!)我发现它非常有帮助。它涵盖了基本电路、离散数学主题,当你读到第 7 章时,构建微处理器已经是小菜一碟了。读完那本书后,我花了大约 3 天时间完成了一个 16 位微处理器。(当然,我有离散数学的背景,但这并不是很重要。)
另一本超级有用且非常标准的书是Hennessy 和 Patterson的书,它也可以从一些随机学校以 PDF 格式提供。(快速下载!)哈里斯和哈里斯的书是基于这本书的简化。这本书讲得更详细。
开源微处理器
那里有大量的开源微处理器。当我构建我的第一个微处理器时,能够参考它们对我非常有帮助。带有 Logisim 文件的文件特别好用,因为您可以以图形方式查看它们,然后像这样单击并弄乱它们。以下是一些我最喜欢的网站和特定的国会议员:
4位:
16 位:
Open Cores - 我真的不明白这个网站。我申请了一个帐户,但他们还没有真正回来......不是一个大粉丝,但我想如果你有一个帐户,那一定很棒。
工具
逻辑西姆
如前所述,Logisim是一个很好的资源。布局完全是图形化的,您可以通过选择一条线很容易地在任何时间点按位查看正在发生的事情。它是用 Java 编写的,所以我很确定它可以在您想要的任何机器上运行。这也是图形计算机编程语言的一个有趣的历史观点。
模拟
在 Logisim 中,您可以模拟正在运行的实际软件。如果您有一个编译器可以将二进制文件编译到您的目标 ISA,那么您可以简单地将二进制文件或十六进制文件加载到 Logisim RAM 中并运行程序。(如果你没有编译器,编写一个四行汇编程序并自己手动翻译它仍然是可能的,也是一个很好的练习。)模拟是整个过程中最酷和最令人满意的部分!:D Logisim 还提供了一个CLI来以编程方式执行此操作。
高密度脂蛋白
生成/设计微架构的更现代形式是通过使用硬件描述语言 (HDL)。最著名的例子包括 Verilog 和 VHDL。这些通常(令人困惑!)以 Ada 和 C/C++ 等顺序语言为模型。然而,这是迄今为止首选的设计方法,因为模型/设计的验证得到了更好的定义。在我看来,推理文本表示比用图形检查要容易得多。正如程序员不能很好地组织代码一样,硬件开发人员也不能很好地组织微架构图形设计的图形布局。(尽管这个论点当然可以应用于 HDL。)以文本方式记录仍然比以图形方式记录更容易,并且通常使用 HDL 进行更模块化的设计。
如果您有兴趣学习这一点,这里有大量的本科硬件课程,包括开放课程和实验室工作,讨论和学习使用 HDL 描述电路和微架构。你可以通过谷歌搜索找到这些。或者您也可以尝试通过下一步学习 HDL - 将 C/C++ 代码转换为 HDL 的工具。如果您有兴趣,那么Icarus Verilog是一个很好的 Verilog 开源编译器和模拟器。
模拟
使用 Icarus Verilog 之类的工具,您还可以轻松地模拟从二进制文件运行的真实程序。您只需将微处理器包装在另一个 Verilog 脚本中,该脚本通过某些总线将文件或字符串加载到 RAM 中。小菜一碟!:D
HLS
近年来,高水平综合(HLS)也在市场上获得了重要的立足点。这是将 C/C++ 代码转换为实际电路的过程。这是非常不可思议的,因为现有的 C/C++ 可以(但不总是)转换为硬件。
(我说并非总是如此,因为并非所有 C/C++ 代码都是可合成的。在电路中,比特流同时存在于任何地方。在软件中,我们认为代码是顺序的。如果你正在尝试,这是一种糟糕的思考模式设计硬件!!)
但正如您可能猜到的那样,这种能力对于优化硬件上代码的某些方面(例如矩阵运算或一般数学)来说是不可思议的。但是,这与您相关,因为您可以使用 HLS 工具查看如何将点积的 C 实现(例如)转换为 HDL。我个人觉得这是一个很好的学习方式。
模拟
HLS 仿真与仿真 HDL 一样简单,因为高级代码只是简单地转换为HDL。然后,您可以完全按照我上面解释的方式对其进行模拟和运行测试。