MHRD
28 ratings
MHRD文本中文翻译
By 小绘精灵
对游戏内的来信以及器件说明进行翻译
2
3
   
Award
Favorite
Favorited
Unfavorite
手册——介绍
介绍
============

本手册将会告诉您为了开始创建硬件器件所需要的一切,本章将简要概述您所要进行的工作, 而其他章节将为您提供有关特定主题的详细信息。此外,该手册还包含一个可能对您有所帮助的教程。

作为硬件工程师,您的任务是为创建硬件器件的设计方案。 您将获得要设计的硬件器件的规范,并且将进行验证测试以证明您的设计方案能正常工作。

请注意,在“资源管理器”窗口中,您将找到一个“任务”文件夹,其中包含您必须完成的所有设计方案和一个“已完成”文件夹,其中包含您自己完成的部分,且可以简单地用于自己的其他设计方案。

设计规范始终包含您必须设计的器件的接口规范,图形表示和行为描述。
-接口规范是输入和输出的列表,每个接口通过一个单独的ID标识
-图形表示可帮助您图形化器件外观,但是不包含任何其他信息
-行为描述包含有关器件应该执行的操作的文本描述, 它还为您提供了一个完整或不完整的示例列表,说明了器件应该为给定的一组输入生成哪些输出值。

创建设计后,您必须通过集成到Microhard开发环境中的仿真器来验证其正确性。 验证过程包括以下步骤:
-检查设计是否符合接口规范
-检查设计是否符合语法规范
-检查设计是否通过所有验证测试

如果在前两个步骤验证失败,将显示相应的错误消息。 如果一个或多个验证测试失败,将为您提供包含所有测试及其结果的列表。

如果您在创建设计时遇到问题,请尝试以下方法:

1.仔细阅读元件规格。
1a。如果其中包含对其他器件或手册的引用,请阅读相应的器件规格或手册章节。
2.在一张纸上画出一个设计方案。您可以将任何已完成的硬件器件用作新设计的一部分。
3.一旦您认为您的设计正确,就开始根据语法规范将其写在工作区的“设计”选项卡中。
4.按CTRL + ENTER开始验证过程
4a。如果收到错误消息,请仔细检查错误消息,然后返回到步骤3,以解决设计中的问题。
4b。万一一个或多个测试失败,请选择一个失败的测试,并尝试计算将其输入值应用于设计时会发生什么,以及为什么设计的输出值与测试中的预期输出值不同。之后返回第2步解决此问题。
5.如果您已完成此步骤:恭喜!您已经成功地为硬件创建了设计。

本手册中包含的教程应能帮助您准备好完成第一个实际任务。
手册——语法
本章节部分名词翻译来自Verilog相关教材

设计语法
=============

本章介绍了用于创建设计的语法,并通过遵循语法规范展示一些示例来帮助您理解语法。


引脚(Pins):
-----

输入(Inputs)和输出(Outputs)可使用任意指定的标识符,如:
Inputs: inPin1, inPin2, abc;
Outputs: outPin1, outPin2, outPin3, outPin4, def;

器件(Parts)由任意指定的标识符与后跟全大写器件类型组成:
Parts: myNand NAND, myNot NOT, anotherNand NAND, andAnAnd AND;

线网(Wires)可以相互连接:
Wires:
inPin1 -> outPin1, //inputs to outputs
inPin1 -> myNot.in, //inputs to part-inputs
myNot.out -> outPin2, //part-outputs to outputs
myNot.out -> myNand.in1, //part-outputs to part-inputs
1 -> outPin3, //constants to output
0 -> myNand.in2; //constants to part-inputs

只有“1”和“0”可以视作常量使用。如果有任意一个引脚没有被线网连接,它将被自动赋予一个“0”输入。

总线(Busses):
-------

到目前为止我们所有示例都仅涉及单个引脚。如果设计必须使用许多引脚,则可以使用总线代替。 要定义包含多个引脚的总线,可以编写:
Inputs: inBus1[8], inBus2[8], inBusWide[16], inPin1;
Outputs: outBus1[8], outBus2[8], outBusWide[16], outPin;
本例中inBus1是总线宽度为8(意味着它包含8个独立的引脚)的总线,而inBusWide总线宽度为16。

在“线网”部分中指定线网时,相同大小的总线可以连接:
inBus1 -> outBus1

总线内的单个引脚也可以选择和连接:
inBus1[3] -> outPin
本行将inBus1的第三个引脚连接到outPin。请注意,inBus1[3]在“线网”部分代表一个引脚,而在“输入”和“输出”部分则定义了一个总线宽度为3的总线。还要注意,引脚的编号以“1”开头(而不是从零开始的索引)。

不仅可以选择引脚,还可以选择总线的子总线:
inBus1 -> outBusWide[9:16]
inBus1[1:8] -> outBusWide[9:16]
这两行含义相同。这会将inBus1[1]与outBusWide[9]连接,将inBus1[2]与outBusWide[10]连接,以此类推,直到将inBus1[8]与outBusWide[16]连接起来。

单个引脚也可以连接到(子)总线(反之亦然)。在这种情况下,引脚连接到该(子)总线的所有引脚:
inPin1 -> outBus1[2:4] //connects to sub-bus [2:4]
inPin1 -> outBus2 //connects to complete bus

使用总线时,重要的是要知道正确的数值表示法。假设您有一条总线“bus[8]”,其值为“00001111”。这意味着引脚“bus [1]”的值为“1”,引脚“ bus[8]”的值为“0”。因此,当数值以二进制数字形式写入时,您将从右到左通过单独的引脚读取。


格式规范:
---------------------

设计由“输入”,“输出”,“器件”和“线网”部分组成:
[design] = [input_section] [output_section] [part_section] [wire_section]

每个部分均以相应的部分标识符开头,后跟冒号及其对应元素中的一个或多个,并以分号结尾:
[input_section] = "Inputs:" [input] (, [input])* ";"
[output_section] = "Outputs:" [output] (, [output])* ";"
[part_section] = "Parts:" [part] (, [part])* ";"
[wire_section] = "Wires:" [wire] (, [wire])* ";"

输入和输出可以是单个引脚(在这种情况下,它们由一个简单的标识符组成)或总线(在这种情况下,必须指定其总线宽度):
[input] = [input_pin_id] | ([input_bus_id][bus_size])
[output] = [output_pin_id] | ([output_bus_id][bus_size])

标识符必须以字母开头,然后可以选择任意数量的字母或数字:
[input_pin_id] = [id]
[output_pin_id] = [id]
[input_bus_id] = [id]
[output_bus_id] = [id]
[id] = [letter] ([letter | digit])*
[letter] = "a"|...|"Z"
[digit] = "0"|...|"9"

总线的大小在方括号中给出,每个数字至少有一位数字:
[bus_size] = "[" [number] "]"
[number] = [digit]+

器件可以写为器件标识符和器件类型对,器件类型始终为大写:
[part] = [part_id] [part_type]
[part_id] = [id]
[part_type] = [uppercase_letter] ([uppercase_letter | digit])*
[uppercase_letter] = ("A"|...|"Z")

线网具有起点和终点,起点和终点可以是常规引脚、器件的总线:
[wire] = [start] "->" [end]
[start] = [pin_value] | [input_pin] | [input_bus] | [part_id]"."[output_pin] | [part_id]"."[output_bus]
[end] = [output_pin] | [output_bus] | [part_id]"."[input_pin] | [part_id]"."[input_bus]

引脚可以是对引脚标识符的引用,也可以是总线内的特定引脚:
[pin_value] = "0" | "1"
[input_pin] = [input_pin_id] | [input_bus_id][pin_selection]
[output_pin] = [output_pin_id] | [output_bus_id][pin_selection]
[pin_selection] = "[" [number] "]"

总线可以是对总线标识符的引用,也可以是总线内部的一组引脚:
[input_bus] = [input_bus_id] | [input_bus_id][bus_selection]
[output_bus] = [output_bus_id] | [output_bus_id][bus_selection]
[bus_selection] = "[" [number] ":" [number] "]"
手册——时序逻辑
时序逻辑
================

本章介绍了时序逻辑的相关内容。

如果您更改与非门的输入值,它不会立即更改其输出值,而是需要很短的时间进行重新调整。扩展开来,其实对于所有基于与非门的硬件器件来说都是如此。

进行验证时,可以考虑使用时钟。每个时钟周期仅执行一次测试,并且时钟周期相距足够远,因此整个硬件器件都有时间稳定其输出。

显而易见的是,对于非时序逻辑器件(如与非门),每个时钟周期以及因此的测试完全独立于先前的时钟周期。

但是,D触发器或DFF器件具有记忆能力,其输出值是最后一个时钟周期的输入值。因此,其输出值完全独立于当前时钟周期的输入值,而是仅依赖于上一个时钟周期的输入值。这使得我们能够设计存储器件。

但是,这也意味着无法再在单个测试步骤或时钟周期中完成测试,而是必须将所有测试步骤视为一个时序。因此,您可能会发现期望输出值“ x”的测试步骤,这仅表示该测试步骤的输出值无关紧要。
手册——符号系统
符号系统
==================

本章介绍了在Microhard开发环境中使用的不同数字符号系统的方方面面。


二进制符号:
----------------

在硬件器件(例如加法器)的上下文中写入数字时,将使用二进制表示法。这样,每个二进制数字对应一个引脚。请注意,当我们写数字时,我们总是在右边写最低有效数字,在总线中,该数字也将是索引为“ 1”的引脚。


将数字从二进制转换为十进制:
-------------------------------------------

要将数字从二进制表示转换为十进制表示,我们需要为每个数字确定一个值并将这些值相加。我们为每个数字分配的值是:
x * 2 ^ i
其中x是值(1或0),而i是位置(从零开始从右到左索引)。

例如,二进制数“ 1010”将转换为以下形式:

i: 3210
x: 1010

结果: 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 10


将数字从十进制转换为二进制:
-------------------------------------------

从十进制转换为二进制表示法时,我们需要采用相反的方法。
(译者注:我建议直接百度短除法...)

1.我们需要找到满足2 ^(n + 1) > x的n的最小值。
2.现在我们检查我们的数字是否大于或等于2 ^ n。
2a。 如果是这样,我们从x减去2 ^ n并记下二进制数字“ 1”。
2b。 否则,我们不会更改x并写下二进制数字“ 0”。
3.我们从n中减去1,而当n> = 0时,我们回到步骤2。

对于x = 10(十进制):
1. n = 3,因为2 ^ 3 <10 <2 ^ 4
2. 10> = 2 ^ 3,所以我们的第一个数字是“ 1”,则x = 10-2 ^ 3 = 2
3. 2 <2 ^ 2,所以我们的第二个数字是“ 0”
4. 2> = 2 ^ 1,所以我们的第三个数字是“ 1”,则x = 2-2 = 0
5. 0 <2 ^ 0,所以我们的最后一位是“ 0”
6.得到的二进制数为“ 1010”


负二进制数的表示法:
------------------------------------

当我们构建对数字进行运算的硬件元素时,它们具有固定的总线宽度。 因此,即使数字“ 1”可以用一位表示,我们在4位加法器中也有3个备用位(精确值是“ 0001”)。

负数可以通过采用最左边的位并将其用作指示数是否为负来表示。 但是,更好的方法是使用二进制补码形式。 如果最左位为“ 0”,则此数字为正或零;如果最左位为“ 1”,则数字为负。 要使数字为负数,我们采用其正数形式,将所有位取反,然后在结果数上加“ 1”。 这样做的主要优点是,在将数字相加时,我们不必关心它们是正数还是负数, 下一节中所述的加法将始终有效并提供正确的结果。

二进制加法:
----------------------
对二进制数进行加法运算和十进制数加法一样容易。 您可以在彼此下方写下两个数字并将其相加,如果结果> 1,则必须使用一个进位(就像十进制中两个数字相加>=10时一样)。

例如,可以像这样将二进制数“ 1010”(十进制值10)和二进制数“ 11”(十进制值3)相加:

1010
+ 0011
==========
1101(十进制13)
X

请注意,在标记为“ x”的列中,1 + 1 = 0 +进位,这将添加到下一列中。 当对负数使用二进制补码形式时,这适用于正,负和混合操作数。


十六进制表示法:
---------------------

在使用16位总线的情况下,我们会使用十六进制表示法。 十六进制表示法与十进制表示法相互转换的方式和与二进制转换的方式相同,但是不要使用“ 2 ^?”,而应使用“ 16 ^?”。 同样的,由于十六进制系统以一位数字表示16个值,但是现在我们只有10个数字(0到9),因此我们将A,B,C,D,E,F用作值10、11、12、13、14,15 。此外,当我们写一个十六进制数时,我们总是在其前面写0x,这样我们就不会将它与十进制数混淆。十六进制表示法的另一个优点是,它可以很好地分解为二进制表示法。4个二进制数字可以用1个十六进制数字精确表示。因此不需要涉及与十进制之间复杂的转换。
来信1——欢迎
欢迎登船!

一个人曾经说过:巨人不是我们认为的那样,那些看似给他们力量的品质往往是他们巨大弱点的根源。

我们Microhard坚信,市场上可用的现代CPU远比它们所擅长的复杂得多。科技行业的巨头们通过复杂的指令集和向下兼容来换取处理遗留问题的效率。这些情况为Microhard提供了一个机会,通过提供低成本、高效率的CPU替代产品,来颠覆科技行业。我很高兴能为您赢得硬件工程师的称赞。

您的工作将是设计构建CPU所需的各种硬件元件。我们将为您提供必须设计的元件的规格和验证测试。如果您感到迷茫或不知所措,请不要慌张……请务必记住以下三个技巧:

1.如果您不知道该怎么办:请阅读手册和规格!
2.创建设计时:将其画在一张纸上!没有人只看他的屏幕就能创造出很棒的东西...
3.如果您的设计有问题:请仔细检查错误消息和失败的测试,以找出问题所在

请牢记这些……它们将很快派上用场,而不是以后派上用场!

您的首要任务是开发一个非门,您可以在左侧资源管理器中的“任务/”文件夹下找到该任务,也许您想先查阅手册...

我期待着与你一起合作,
祝好
来信2——我们需要更多引脚
很高兴看到您掌握了工作中的一切!

到目前为止,您构建的元件效果很好,但是我们需要开发这些元件的总线版本。 设计这些元件应该是一件微不足道的任务,因为您可以重用到目前为止开发的元件...但是,请确保您首先了解设计编辑器的总线语法!

请查阅手册中有关总线语法的部分。

继续努力,
祝好
来信3——你遇到Ted了吗(工具人就绪)
今天给您来带来了个好消息!

我知道制作已完成器件的总线版本可能会很乏味,而且我们也不想把您的时间浪费在重复性工作上……很高兴我能够聘请一名实习生,他会为您提供帮助!

泰德(Ted)是个新手,因此不要指望他提出任何原始设计,但是他将帮助您创建与您已经创建的总线版本相似的任何总线版本。

泰德(Ted)得到工作,您得到乐趣!
祝好
(老资本家了)
来信4——甜美的D触发器
对于CPU来说,如果无法保存驱动它的程序或它产生的结果,那么即使它是世界上最好的CPU也一文不值。

到目前为止,您设计的所有器件都有一个共同点,就是没有内存,我们必须改变这一点。 这就是为什么我让一位商业伙伴采购一些甜美的D触发器!

设计时序元件时,请确保您考虑了时序方面的内容……查看手册中有关时序逻辑的章节,并查看“已完成/”文件夹下D触发器的规格表。

祝好
来信5——主保佑你!
干得漂亮! 我们正在一步一步扩大CPU市场,一个设计一个设计地...

您可能知道CPU执行的实际计算是由其ALU(算法逻辑单元)完成的,令人兴奋的事情是:我们基本上将构建自己的ALU所需的东西都准备好了, 您只需要连接他们就可以。

为了避免重蹈覆辙的风险:请确保您首先在纸上完成您的设计!

祝好
来信6——美好的事情即将发生
我们已经接近大功告成了!

我们终于获得了构建Microhard CPU所需的所有器件!我们的CPU(大致而言)由一个ALU和几个寄存器组成, 剩下的就是将这些器件连接起来,这件事说起来容易做起来难。

构建CPU是一个两步过程...首先,您应该设计解码器,其次是CPU本身。但是,为了能够理解每个器件,您必须了解两者以及它们如何共同工作。首先您需要研究我们提供的两个器件的手册。

这是我们为了占领市场上所需要完成的最后一步!一切归功于一役!我们都将希望和梦想交在您手中!这可能会改变世界!

放松点,
祝好
来信7——结束了?
太棒了!

我从一开始就知道我们可以把赌注押在您身上!没有您,我们不会走得那么远,但是这件事还没有结束。毫无疑问,您创造了出色的产品,而人们只是还不知道而已。但我已经做好了一切准备,我们可以尽快开始出货,并且我们的市场和销售部门已经全力以赴进行推广。

我们需要一段时间才能使Microhard CPU脱颖而出,因此现在没有什么需要您做的。

您为什么不休假并过几个月再回来,这是你应得的!同时,我将确保提出给您一些新想法。

期待与您再次交谈,
祝好

(附:待续...)
额外来信
那么...你已经构建了一些基本的逻辑门,但CPU不是单靠与门和或门搭建起来的!不要误会我的意思……离开他们谈CPU就是在搭空中楼阁,但我们可以将他们封装成更加强大的逻辑门!

我为您提供了一些器件规范,使我们的器件能够累加数字并提供条件逻辑……通过创建新的设计,很快我们将拥有ALU(算术逻辑单元)!

祝好
(这个是我在游戏文件里找到的,不懂在游戏中是否出现过)
3 Comments
IRendy 9 Apr, 2022 @ 2:39am 
好!
再也不卡了 15 Dec, 2021 @ 1:19am 
nice
Advanced Micro Devices 26 Oct, 2021 @ 9:38am 
good job