1、在设备内部找到的组件上大多印有品牌名称和型号,如何获取这些组件的关键特性信息,若因散热器难以触及 CPU 又该如何处理?
通过搜索组件上的品牌和型号获取正式产品数据表,进而识别部件关键特性。若因散热器难以触及 CPU,可在主板数据表上找其品牌和型号。
2、What can you do to dig for similar information without voiding the warranty on many machines, and what commands can be used in Linux and how to find similar information in Windows?
你还可以在不破坏许多机器保修的情况下,通过使用能为你检测硬件的软件工具来挖掘类似信息。例如:
Linux 系统 :可以尝试以下命令:
lscpu
cat /proc/cpuinfo
lshw
free
hwinfo
lspci
lsusb
nvidia-smi
clinfo
Windows 系统 :从开始菜单运行“设置”程序,然后在系统设置中查找类似信息。
3、打开设备后,需要做什么?若设备内部的品牌和型号编号与软件显示不一致,应该怎么做?
打开设备后要检查内部品牌和型号编号与软件显示是否一致,若不一致需研究原因。
4、如果你习惯打开台式电脑查看其内部结构,那么可以买一些更小的螺丝刀,然后对一台旧笔记本电脑也进行同样的操作。请分析这种做法是否合理并说明理由。
这种做法有一定合理性,但也存在风险。
合理性在于台式电脑和笔记本电脑内部结构有一定相似性,打开台式电脑查看内部结构的经验可以在一定程度上应用到笔记本电脑上,且使用更小的螺丝刀是考虑到笔记本电脑内部零件较小,更适合操作。
然而,笔记本电脑内部结构更为紧凑和精密,有许多特殊的连接和固定方式,在拆解过程中如果操作不当,很容易损坏电脑部件,如排线断裂、卡扣损坏等,所以在进行操作前,最好先了解该笔记本电脑的具体拆解方法和注意事项。
5、习惯打开笔记本电脑后,尝试打开手机或游戏机需要做什么,不同设备打开有哪些特点,以及存在什么特殊情况?
习惯打开笔记本电脑后,可买更小的螺丝刀尝试打开手机或游戏机。
部分手机用梅花螺丝刀打开,部分需网上花几美元买维修套件; 日本游戏机用日式螺丝,也可花几美元订购维修套件。
有些设备因用胶水粘合,难以拆解。
6、如何了解算盘算术以及这对理解现代CPU操作有什么帮助?可以通过访问哪个网址获取算盘模拟器,哪个网址获取使用教程?
可以通过使用算盘模拟器(若有真正的算盘也可使用)和教程来了解算盘算术。学习在算盘上进行这些操作有助于理解现代CPU中的操作。
算盘模拟器: 点击访问 算盘使用教程: 点击访问
7、将你电话号码的后三位作为一个数字,前三位作为第二个数字,然后在算盘上把它们相加。
算盘加法操作说明
首先在算盘上设置代表前三位数字的算珠状态。
然后,将后三位数字视为要进行的增量次数,按照在算盘上加1的规则进行操作:
从最右边的列开始,若该列下框的珠子未全部升起,每次加1就将下框的一个珠子从底部推到顶部; 若下框的五个珠子都已升起,则把它们全部推回原位,同时将该列上框的一个珠子从顶部推到底部; 若上框的两个珠子都已降下,则把它们推回原位,并将左边一列下框的一个珠子升起。
重复此操作后三位数字对应的次数,此时算盘的状态就代表两数相加的结果。
8、取同一对数字,用较大的数减去较小的数。例如,有一对数字 5 和 3,计算它们的差值。
步骤说明:
先找出这对数字中的较大数和较小数。 然后用较大数减去较小数,得到差值。
示例:
对于数字 5 和 3: 较大数:5 较小数:3 差值为:5 – 3 = 2
9、了解如何在你的计算机上输入 Unicode 字符。例如,在许多 Linux 系统中,你可以按下并释放 SHIFT – CTRL – U,然后输入一系列十六进制数字,如 131bc,以在命令行或编辑器中输入一个古埃及数字。
在许多 Linux 系统中,按下并释放
,然后输入一系列十六进制数字(如
SHIFT + CTRL + U
),即可在命令行或编辑器中输入对应的 Unicode 字符。
131bc
10、获取你熟悉区域的街道、航空和卫星照片,并在上面绘制一个千立方体、兆立方体、吉立方体、太立方体、拍立方体、艾立方体和泽立方体,例如,千立方体的每条边长为10米。
此问题需按以下步骤操作:
获取照片 :通过地图软件(如百度地图、谷歌地图)或相关地理信息网站获取指定区域的街道、航空和卫星照片。 确定尺寸 :明确各立方体边长,千立方体边长10米,兆立方体边长10000米等。 绘制立方体 :可使用图像处理软件(如Adobe Photoshop、Illustrator)或地理信息系统软件(如ArcGIS),依据尺寸和照片比例尺在照片上绘制立方体。
11、从https://www.fourmilab.ch/babbage安装Fourmilab分析引擎模拟器,或使用其网络界面。
从 Fourmilab 分析引擎模拟器 安装,或使用其网络界面。
12、是否鼓励人们尝试参观制造工厂?部分工厂在什么情况下可能提供参观服务?制造工厂是否只位于硅谷?在哪里可以获取国际工厂名单?
鼓励人们尝试参观半导体制造工厂。部分工厂在以有组织团体(如学生社团)名义申请时可能提供参观服务。制造工厂不止位于硅谷,例如英国就有几家。可访问 国际工厂名单 获取相关信息。
13、从https://github.com/logisim – evolution/logisim – evolution安装并运行LogiSim Evolution。
从指定链接 https://github.com/logisim-evolution/logisim-evolution 安装并运行 LogiSim Evolution。
14、创建一个项目,尝试创建一些门电路以及连接它们的导线。通过点击一个组件的输出端,再点击另一个组件的输入端来连接组件。点击组件或导线以激活它们。使用 DEL 键删除组件,使用 ESC 键删除最后添加的导线。按下“仿真”按钮来运行仿真。导线上的电压用黑色表示 0,红色表示 1。一些组件可以通过右键点击来编辑其属性。请简述在这个项目中如何进行组件连接、删除操作以及查看导线电压状态。
操作说明
组件连接
通过点击一个组件的输出端,再点击另一个组件的输入端来连接组件。
删除操作
使用 DEL 键删除组件。 使用 ESC 键删除最后添加的导线。
查看导线电压状态
导线上的电压用 黑色 表示 0, 红色 表示 1。
15、在LogiSim中,仅使用与非门来构建其他类型的门。
使用与非门构建基本逻辑门的方法
可以仅使用与非门来构建标准的非门、与门和或门。以下是具体构建方法:
1. 构建非门
方法 :将与非门的所有输入连接在一起。 原理 :因为与非门的逻辑是先进行与运算,再进行非运算。当所有输入相同时,与运算的结果就取决于这个相同的输入值,再经过非运算就实现了非门的功能。
2. 构建与门
方法 :可以通过两个与非门实现。 步骤 :
1. 先将两个输入信号通过一个与非门。
2. 然后将这个与非门的输出作为另一个与非门的输入(两个输入都接这个输出)。 原理 :根据逻辑运算规则,双重否定即肯定,这样就实现了与门的功能。
3. 构建或门
方法 :需要三个与非门。 步骤 :
1. 先对两个输入信号分别进行非运算(用两个与非门,将每个输入信号分别连接到一个与非门的两个输入端)。
2. 然后将这两个非运算的输出作为第三个与非门的输入。 原理 :根据逻辑运算规则,这样就实现了或门的功能。
16、构建并测试一个8位行波进位加法器。使用它通过补码来执行减法和加法运算。
以下为构建并测试8位行波进位加法器,利用补码进行加减法运算的步骤:
构建8位行波进位加法器
行波进位加法器由多个全加器级联而成,每个全加器对一位进行加法运算,并将进位传递到下一位。
全加器逻辑
全加器有三个输入(两个加数位和一个进位输入)和两个输出(和位与进位输出)。其逻辑表达式如下:
和位 $ S = A ⊕ B ⊕ C_{in} $ 进位输出 $ C_{out} = AB + BC_{in} + AC_{in} $
8位行波进位加法器实现
将8个全加器级联,将前一个全加器的进位输出连接到下一个全加器的进位输入。
使用补码进行加减法运算
加法
直接使用8位行波进位加法器对两个8位二进制数进行相加。
减法
要计算 $ A – B $,可将 $ B $ 转换为其补码形式,再与 $ A $ 相加。补码转换步骤如下:
对 $ B $ 的每一位取反。 加1。
测试
测试用例设计
设计多种测试用例,涵盖正数相加、负数相加、正数减负数、负数减正数等情况。
验证结果
将测试用例的输入接入8位行波进位加法器,观察输出结果,并与预期结果进行对比。
示例代码(Python)
# 定义全加器
def full_adder(a, b, cin):
s = a ^ b ^ cin
cout = (a & b) | (b & cin) | (a & cin)
return s, cout
# 定义8位行波进位加法器
def ripple_carry_adder(a, b):
cin = 0
result = []
for i in range(8):
s, cin = full_adder(int(a[i]), int(b[i]), cin)
result.append(str(s))
result.append(str(cin))
return ''.join(result[::-1])
# 补码转换
def twos_complement(num):
inverted = ''.join('1' if bit == '0' else '0' for bit in num)
one = '0' * 7 + '1'
return ripple_carry_adder(inverted, one)
# 加法测试
a = '00000010' # 2
b = '00000011' # 3
sum_result = ripple_carry_adder(a, b)
print(f'加法结果: {sum_result}')
# 减法测试
a = '00000100' # 4
b = '00000010' # 2
neg_b = twos_complement(b)
sub_result = ripple_carry_adder(a, neg_b)
print(f'减法结果: {sub_result}')
此代码实现了8位行波进位加法器,利用补码进行加减法运算,并给出了测试示例。
17、使用时钟作为输入,构建并测试一个计数器。
可以构建一个4位二进制计数器,以时钟作为第一列输入,计数器会对时钟脉冲数进行计数。使用 LogiSim Evolution 工具来构建,利用其内置的生成时序图工具(
)测试计数器,还可使用硬件逻辑分析仪从面包板捕获和显示类似数据。
Simulate ▸ Timing diagram
18、用一个2位计数器和译码器构建一个交通灯定序器。用它按照英国的标准顺序点亮红、琥珀色和绿色灯泡,顺序为:(1)红色(停车);(2)红色和琥珀色一起亮(准备出发);(3)绿色(通行);(4)琥珀色(准备停车)。这大致就是CPU控制单元的工作方式。
交通灯定序器构建步骤
要构建此交通灯定序器,可按以下步骤操作:
1. 2位计数器
2位计数器有4个状态(00、01、10、11),可对应交通灯的4种状态。计数器在时钟信号驱动下依次循环这4个状态。
2. 译码器
将2位计数器的输出作为译码器的输入。2位输入的译码器有4个输出端。
3. 状态对应
状态00(计数器输出) :译码器对应输出端连接红色灯泡电路,点亮红灯。 状态01 :对应输出端同时连接红色和琥珀色灯泡电路,使红、琥珀色灯同时亮。 状态10 :对应输出端连接绿色灯泡电路,点亮绿灯。 状态11 :对应输出端连接琥珀色灯泡电路,点亮琥珀色灯。
4. 循环运行
在时钟信号作用下,计数器不断循环4个状态,译码器根据计数器输出依次点亮相应灯泡,实现交通灯按标准顺序循环切换。
19、探索随机存取存储器(RAM)模块。使用模块选项指定RAM的字长和地址长度。可以通过右键单击,然后点击“编辑内容”,使用内置的十六进制编辑器手动编辑RAM的内容。在“布线”菜单中可以找到的分离器,用于对数据和地址的电线组进行捆绑和解捆绑。可以使用探针或发光二极管(LED)作为输出;可以使用常量、双列直插式封装(DIP)开关或引脚作为输入。
RAM模块探索指南
模块配置
使用模块选项指定: 字长
地址长度
内容编辑
右键选择“编辑内容”,使用内置的十六进制编辑器手动编辑RAM内容。
电线组处理
使用布线菜单中的 分离器 处理电线组。
输出设备
可使用:
探针
LED
输入设备
可使用:
常量 DIP开关 引脚
20、在LogiSim中设计并构建一个自然数乘法器。这可以通过遵循常规乘法算法来完成,但要采用二进制形式。你可以使用移位器将其中一个输入乘以所有不同的2的幂,然后使用加法器将第二个数中存在的那些幂相加。使用与门来启用和禁用相关的幂。与架构中常见的情况一样,你可以选择使用所需结构的多个硅副本,或者使用单个副本加上时序逻辑来多次运行它。
在LogiSim中设计并构建自然数乘法器的步骤
可按以下步骤在LogiSim中设计并构建自然数乘法器:
遵循常规乘法算法,以二进制形式进行计算。 利用移位器将其中一个输入乘以所有不同的2的幂。 用加法器把第二个数中存在的那些幂相加。 使用与门来控制相关幂的启用和禁用。 架构方面,可选择使用所需结构的多个硅副本,或者使用单个副本加上时序逻辑来多次运行它。
21、处理复杂程度的时序逻辑时会出现什么问题?硬件中类似于调试器的工具是什么?LogiSim Evolution有什么相关功能?时序逻辑和组合逻辑的触发特点分别是什么?硬件逻辑分析仪有什么作用?
时序逻辑与调试工具
处理复杂程度的时序逻辑时,围绕触发时序产生硬件错误是非常容易且常见的。在职架构师需花费大量时间调试时序问题。
硬件中类似于调试器的工具是时序图,它是一种绘制系统中多根导线随时间变化状态的图表。LogiSim Evolution有一个内置工具来生成这些时序图,可用于测试Baby中的一些时序子电路。
时序逻辑通常在时钟信号从0上升到1的瞬间触发,而组合逻辑则始终处于活动状态。
硬件逻辑分析仪可以捕获并显示来自面包板的类似数据,它们可以独立工作,也可以将数据发送到电脑进行分析。
22、组装测试程序(包括图灵的除法程序),并在LogiSim Baby中运行它们。使用提供的Python汇编器,将第3行的for_logisim标志设置为True。将输出保存到一个文本文件中,然后通过右键单击RAM并选择“加载图像”,将其作为RAM图像加载到LogiSim中。你可以通过点击时钟手动逐步执行CPU周期,或者通过菜单栏中的“模拟” ▸ “自动计时”将其设置为自动计时。图灵的程序将36除以5,得到结果7(二进制为111),该结果会用零填充后存储在地址28中,因此它显示为E0000001(十六进制)。尝试编辑第29到31行以执行不同的除法运算。
首先,将 Python 代码中第 3 行的 `for_logisim` 标志设置为 `True`。
接着使用此 Python 汇编器来组装测试程序(包含图灵的除法程序),把输出保存为文本文件。
在 LogiSim 里,右键点击 RAM 并选择 “加载图像”,载入保存的文本文件。
可以手动点击时钟逐步执行 CPU 周期,也能通过菜单栏的 **“模拟” ▸ “自动计时”** 让其自动计时。
图灵程序对 36 除以 5 进行运算,结果 7 会以零填充后存于地址 28,显示为 `E0000001`(十六进制)。
可编辑代码的第 29 到 31 行来进行不同的除法运算。
23、“小家伙”(The Baby)是一台非常小型、简单的计算机,但通过修改设计,有可能将其扩展成一台相当成熟的现代机器。请说明扩展“小家伙”计算机的操作步骤。
可按以下步骤操作:
增加RAM大小,需在设计里增大地址大小; 可用常规LOAD指令替代LDN指令,若要保留旧代码兼容性,可保留LDN并新增LOAD指令; 用完整二进制补码整数ALU替代单一减法模块,创建额外指令触发加、减、乘、除操作; 研究曼彻斯特一号和费伦蒂一号计算机扩展到商业化的方式,在LogiSim中进行仿真。
24、设计一个最简单的汇编程序,使基本流水线陷入混乱,让其运行速度像非流水线系统一样慢。尝试扩展这个程序,尽可能地干扰每种处理冒险的策略。在实际中,这样的程序出现的可能性有多大,应该采取什么措施来避免它们?
设计使流水线运行缓慢的程序
可以编写包含大量相互依赖的指令,例如:
频繁的读写同一内存地址,制造 数据冒险 大量使用条件分支语句,制造 分支冒险 安排多个阶段同时竞争资源的指令,制造 结构冒险
例如 :
连续的写后读、写后写指令 频繁的条件跳转指令
扩展程序干扰冒险处理策略
对于编程避免冒险 :可让指令依赖关系复杂,使重新排序指令难以实现 对于停顿策略 :可让冒险频繁出现,使停顿时间累积过长 对于重做工作策略 :可让分支频繁跳转,导致大量工作被丢弃重做 对于急切执行策略 :可让分支结果难以预测,使大量不必要的分支被执行
实际中出现的可能性
这种程序在实际中出现的可能性较低。因为:
程序员通常会尽量避免编写复杂、低效的代码 编译器也会对代码进行优化
避免措施
程序员 :应提高编程技能,了解架构知识,合理安排指令顺序 编译器 :应不断优化,增强检测和处理冒险的能力 架构设计 :可以采用更先进的技术,如多线程、多核等,减少冒险对性能的影响
25、再次扩展它,使得从另一个地址加载数据可以读取模拟开关的状态。你可以通过将随机存取存储器(RAM)的大小减少两个地址,然后在总线上添加一个新的数字逻辑输入/输出(I/O)模块来实现,该模块会监听这些地址并做出相应的操作。
可通过将随机存取存储器(RAM)的大小减少两个地址,然后在总线上添加一个新的数字逻辑输入/输出(I/O)模块来实现,该模块会监听这些地址并做出相应的操作,以达到从另一个地址加载数据读取模拟开关状态的目的。
26、尝试找出你自己电脑中每种类型内存(包括缓存、随机存取存储器(RAM)和二级存储设备)的大小和速度。如果你能打开电脑,查看内部,找到它们并找出其制造商和型号编号,然后在网上查找它们的数据手册。大多数操作系统都有可显示有关其内存有用信息的实用工具;例如,Linux系统可以使用lscpu或cat /proc/cpuinfo命令查看缓存信息,使用free -h命令查看RAM信息,使用lsblk命令查看二级存储设备信息。
可以按以下步骤操作来获取电脑中各类内存的大小和速度信息:
若能打开电脑,查看内部找到内存设备,记录其制造商和型号编号,然后在网上查找对应的数据手册获取详细信息。
若不打开电脑,可借助操作系统自带的实用工具,如在 Linux 系统中:
用
或
lscpu
查看缓存信息 用
cat /proc/cpuinfo
查看 RAM 信息 用
free -h
查看二级存储设备信息
lsblk
27、在浏览器中打开下载的emulator.html以运行Easy6502,接着输入并运行示例6502程序,之后模拟器会有什么显示?
模拟器会在右侧显示寄存器的内容。
28、Nick的个人教程可以在下载的tutorial.html文件中找到。该教程提供了更多6502编程的详细信息,并逐步引导编写一款复古贪吃蛇类型的游戏。请学习相关知识理解这款游戏的运行原理,然后尝试对其进行修改,既可以更改游戏规则,也可以将其转变为另一款复古游戏,如《太空侵略者》或《俄罗斯方块》。此外,在这个模拟器中编写的代码可以移植到C64或其他基于6502的机器上,但需要额外做一些工作,用特定设计的调用替换图形和输入输出部分。请说明该教程的作用、对游戏的操作要求以及代码移植的情况。
Nick的个人教程在下载的`tutorial.html`里,它详细介绍6502编程,还能引导编写复古贪吃蛇游戏。要学习理解游戏原理并修改它,可改规则或转成其他复古游戏,模拟器代码能移植到C64等6502机器,但要替换图形和I/O调用。
29、Nowadays, we can do C64 programming and assembling on a modern machine, then just run the resulting executable machine code on a C64 emulator, such as the open source VICE emulator, which can be installed locally. To get started, where should we install the Dasm assembler from?
如今,我们可以在现代机器上进行 C64 编程和汇编,然后在 C64 模拟器(如可本地安装的开源 VICE 模拟器 )上运行生成的可执行机器代码。要开始操作,请从 Dasm 汇编器官网 安装 Dasm 汇编器。
30、将汇编代码放入一个文件,例如 hello.asm。若使用 Dasm 为 C64 生成可执行文件,需要在文件开头添加哪两行代码,并且这两行代码的缩进要求是什么?
将汇编代码存于类似
的文件中。为让 Dasm 为 C64 生成可执行文件,需在文件开头添加以下两行,且要精确缩进八个空格:
hello.asm
processor 6502 ; 为 das 定义处理器家族
org $C000 ; 代码的内存位置
31、使用什么命令可以将代码汇编成 C64 程序(.prg)?
使用命令
把代码汇编成 C64 程序(
dasm hello.asm -ohello.prg
)。
.prg
32、能否将.prg文件导入到C64模拟器中,若可以,举例说明能导入的C64模拟器有哪些,对于SID程序在部分模拟器中有什么特殊情况?
可以将
文件导入到 C64 模拟器中,能导入的 C64 模拟器如位于 https://c64emulator.111mb.de 的基于 JavaScript 的在线模拟器,或者 VICE 模拟器。对于 SID 程序,一些模拟器(如上述 JavaScript 模拟器)默认禁用声音,需要手动开启。
.prg
33、If you have access to a real physical C64 and tape drive, how can you load your .prg files on the physical machine and what can you do during the process?
You can try using a program such as
available at https://github.com/Zibri/C64 to convert your
tap2wav.py
files to tape images (
.prg
) and then to sound waves (
.tap
). Then record the
.wav
to a physical tape to load to the physical machine. During the process, you can inspect the
.wav
and
.tap
files to see the binary data (0s and 1s).
.wav