如何阅读 CPU 电路图(以 6502 为例)

news/2025/3/15 4:58:10/文章来源:https://www.cnblogs.com/1bite/p/17461446.html

开篇

你是否曾对 CPU 的工作原理充满好奇,以及简单的晶体管又是如何组成逻辑门,进而构建出复杂的逻辑电路实现?本文将以知名的 6502 CPU 的电路图为例,介绍如何阅读 CPU 电路图,并向你演示如何从晶体管电路还原出逻辑门电路。通过这篇文章的引导,你将能够揭开 CPU 复杂设计的面纱,一窥其内部运作的奥秘。

示例图

首先,让我们先大致了解一下 6502 CPU 的晶体管电路图。目前我能找到的电路图有两个。一个是一份 PDF 文档(6502 Schematic.pdf),这份文档中的电路图虽然没有详细到每根线都画出来,但关键组件的电路图都有,算是很简洁的一份电路图。另一份是电路图是 GitHub 上有人整理的一个 SVG 版本的电路图(下图),这份电路图非常详尽,详细到每根线、每个晶体管都有,是非常好的资源。
cd.svg

MOSFET

仔细研究上面的电路图,可以发现图中一共可总结出两种元件,如下图:

它们都是一种 MOSFET(金属氧化物半导体场效应晶体管),再具体点,它们都是一种 N 型 MOSFET,简称 NMOS。

MOSFET 可以看作一种由电压控制的特制开关,其中 NMOS 在控制电压为高电平(逻辑 1)时导通,低电平(逻辑 0)时断开。

上图中,上部中间的连接端就是控制端。

耗尽型 NMOS

既然都是 NMOS,那 A 和 B 的区别是什么呢?答案是,A 属于增加型 NMOS,而 B 属于耗尽型。

耗尽型 NMOS 的作用是充当负载,为其它 MOS 提供电压电流,相当于一个电阻。充当负载时,它的一个连接端与供电相接(如下图),另一个连接端与控制端连接在一起,使它处于常导通状态。

上图中,小圆圈表示供电。

非门

根据 NMOS 高电平导通的特性,将它的一个端接地,另一个连接端搭配一个耗尽型 NMOS 的负载就可以构成一个非门。

当 X 为高电平时,下面的 NMOS 导通,Y 相当于直接接地,此时 Y 为低电平;当 X 为低电平时,下面的 NMOS 截止,Y 相当与供电连接,此时 Y 为高电平。综上,这个电路是一个非门逻辑电路。

与非门

在非门的下方再串联一个 NMOS,就得到了与非门。

或非门

在非门的旁边再并联一个 NMOS,就得到了或非门。

锁存器

电路图中还有一类非常常见的结构,如下图:

这种结构大概率表达的是一种锁存器 -- D-锁存器。锁存器是一种基本的存储元件,相当于一个 1 比特的内存,在时序逻辑中用于存储和保持状态信息。锁存器的使能端(E 端)常与时钟信号连接,因此若在电路图中看到时钟信号接入了使能端,则这样结构很可能是锁存器。初看之下,这样的结构似乎没有道理,为什么一个开关加上一个非门就能存储数据了?其实这里面涉及一些电学知识,这里就不过多阐述了,我们是为了理解电路图,只需记住这样的结构就行了。

示例

有了上面的基本知识后,我们可以尝试解读一下 CPU 电路图了,看看能不能还原其中的逻辑。以下是 6502 ALU 一个计算单元的电路图(来自 6502 Schematic.pdf),ALU 由 8 个类似的单元串联组成,可完成 8 位二进制数(一个字节)的计算。

根据上面的知识,可以把相应的逻辑门标注出来:

其中只有蓝色框标记的部分不是基础逻辑门,但是应用非门的分析方法,不难得出它是一个与门和或非门的组合:

弄清楚之后,再把方块标记的部分转化成逻辑门表示:

未转化成逻辑门的 NMOS 相当于开关,负责数据通路的选择。其中 x1 ~ x5 是输入选择,x6 ~ x12 负责运算选择,x14 ~ x15 负责输出目的地选择。去除掉这些选择器后,这个 ALU 计算单元的纯逻辑门电路如下:

可以看出,这个单元包含一个全加器,并同时可以进行 “与”、“或”、“异或” 运算。

总结

文本介绍了 NMOS 及提示了逻辑门是如何使用 NMOS 构建的,并用一个实际的例子演示了如何从 NMOS 电路图还原逻辑电路。希望本文可以满足你的好奇心,如果大家对 6502 其它部分的原理也感兴趣,欢迎阅读我的后续文章。

参考

  • balazs schematic
  • 【硬核科普】带你认识CPU第00期——什么是MOSFET

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/822577.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RSA公钥文件解密密文

RSA公钥文件解密密文RSA公钥文件解密密文 做题遇到两个从未见过的文件:flag.enc …

2024-2025-1 20241411王思棋《计算机基础与程序设计》第五周学习总结

班级链接 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP作业要求 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05教材学习内容总结 《计算机科学概论》第六章 一、低级程序设计语言概述 (一)定义与特点 低级程序设计语言是一种更接近计算机硬件的编程语言,…

《计算机基础与程序设计》第五周学习总结

学期(2024-2025-1) 学号(20241412) 《计算机基础与程序设计》第五周学习总结 作业信息个作业属于哪个课程 2024-2025-1-计算机基础与程序设计 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 2024-2025-1计算机基础与程序设计第五周作业 https:…

20222408 2024-2025-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1回答问题 (1)杀软是如何检测出恶意代码的? ①基于特征码的检测:AV软件厂商搜集最全最新的特征码库,并以此来尝试匹配文件中的一个或几个片段②启发式恶意软件检测:根据片面特征推断,包括行为(如连接恶意网站、开放端口、修改系统文件等),外观(文件签名…

习题6.6

import numpy as np matches = np.array([ [0, 1, 0, 1, 1, 1], # 1队 [0, 0, 0, 1, 1, 1], # 2队 [1, 1, 0, 1, 0, 0], # 3队 [0, 0, 0, 0, 1, 1], # 4队 [0, 0, 1, 0, 0, 1], # 5队 [0, 0, 1, 0, 0, 0] # 6队 ], dtype=int) n = matches.shape[0] closure…

[BUUCTF]喵喵喵

[BUUCTF]喵喵喵 分析 题目是一张图片,打开属性,放入010editor,无果;于是想到LSB隐写 解题 发现一张PNG,但开头不太对劲将其保存txt文件,发现放入010editor并不可以修改开头在某位大佬博客中学到一个方法,如下: 首先,在notepad中打开txt文件Alt按列选择左侧复制,放入Cy…

22207223-王颖对于编写pta答题判题程序的总结

目录 一、前言1.1 知识点1.2 题量1.3 难度 二、答题判题程序12.1 设计与分析2.2 踩坑心得2.3 改进建议 三、答题判题程序23.1 设计与分析3.2 踩坑心得3.3 改进建议 四、答题判题程序34.1 设计与分析4.2 踩坑心得4.3 改进建议 五、总结 一、前言 1.1 知识点 (1)题目集1题目集1中…

Java实现答题判题程序

一、前言 本文介绍了如何使用Java设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。本次编程任务通过三次作业实现了从基本的题目管理到完整的测试系统的设计。 第一次作业主要实现了题目信息、试卷信息和答卷…

Hello Web

Hello Web 兄弟们成了!!!我成了!!!在最近一段时间我基本没有发关于Web的博客,但是我一直在学习后端的知识和后端与前端交互的知识!!!从maven到mysql再到jdbc.mybatis,servlet,http,tomcat,终于,终于老子前端的代码可以把数据传到后端的数据库了!!!哈哈哈哈哈哈哈.我一路学习下来…

前三次大作业总结

一、前言 1. 题目一 1.1 知识点 1.1.1 类设计和封装:题目类:设计题号、题目内容和标准答案的基本属性,包含获取和设置方法,支持答案比对方法,用于判断答题是否正确。 试卷类:设计题目列表和题目数量两个属性,包含将题目存储到列表中的方法,能够按题号排序,以便在输出时…

云计算运维-SRE基础篇之安装VMware

一、首先简单总结计算机发展相关历史,详细总结服务器硬件和计算机分类相关知识。 计算机发展简史早期计算工具:从古至今,人类使用过多种计算工具,如算盘、计算尺等。这些工具为后来的机械计算器奠定了基础。 机械计算机时代(17世纪-19世纪):随着技术的发展,出现了更加复…

【Atcoder训练记录】AtCoder Beginner Contest 377

训练情况赛后反思 D题差一点点吧?可能不去乐跑就能写出来了 A题 我们发现 ABC 是字典序单调递增的,字符串先排序再判断是否为 ABC 即可。 #include <bits/stdc++.h> #define int long longusing namespace std;void solve(){string s; cin>>s;sort(s.begin(),s.e…