如何阅读 CPU 电路图(以 6502 为例)
开篇
你是否曾对 CPU 的工作原理充满好奇,以及简单的晶体管又是如何组成逻辑门,进而构建出复杂的逻辑电路实现?本文将以知名的 6502 CPU 的电路图为例,介绍如何阅读 CPU 电路图,并向你演示如何从晶体管电路还原出逻辑门电路。通过这篇文章的引导,你将能够揭开 CPU 复杂设计的面纱,一窥其内部运作的奥秘。
示例图
首先,让我们先大致了解一下 6502 CPU 的晶体管电路图。目前我能找到的电路图有两个。一个是一份 PDF 文档(6502 Schematic.pdf),这份文档中的电路图虽然没有详细到每根线都画出来,但关键组件的电路图都有,算是很简洁的一份电路图。另一份是电路图是 GitHub 上有人整理的一个 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 其它部分的原理也感兴趣,欢迎阅读我的后续文章。
参考
如何阅读 CPU 电路图(以 6502 为例)的更多相关文章
- 以CapsNet为例谈深度学习源码阅读
本文的参考的github工程链接:https://github.com/laubonghaudoi/CapsNet_guide_PyTorch 之前是看过一些深度学习的代码,但是没有养成良好的阅读规范 ...
- Linux系统排查2——CPU负载篇
本随笔介绍CPU负载的排查手段. 查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数, 可运行:运行态,占用CPU,或就绪态,等待CPU调度. ...
- 根据dba_hist_osstat统计CPU占用情况
在11g里面,视图dba_hist_osstat用来记录OS级别的time时间指标.视图dba_hist_osstat_name显示了相关的指标名称. SYS@/dzgddb> select * ...
- Linux系统排查——CPU负载篇
本随笔介绍CPU负载的排查手段. 查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数, 可运行:运行态,占用CPU,或就绪态,等待CPU调度. ...
- Docker CPU Usage
背景 当一台机器上跑有多个 Docker Container 的时候,我们需要知道,哪些容器占用了多少资源.采集这些指标,来让我们可以更加好的分配资源给每个 Container. 获取容器CPU使用率 ...
- spring中的单例和多例
单例 对象在整个系统中只有一份,所有的请求都用一个对象来处理,如service和dao层的对象一般是单例的. 为什么使用单例:因为没有必要每个请求都新建一个对象的时候,浪费CPU和内存. 多例 对象在 ...
- CPU参数指标说明
%user %user表示CPU一共花了多少比例的时间运行在用户态空间或者说是用户进程(running user space processes) 典型的用户态空间程序有:Shells.数据库.web ...
- Java单例和多例
背景:最近在学习韩老师的笔记时候发现不是很了解单例和多例,于是通过网上查找资料的方式去学习. 设计模式:最佳的实践,是软件开发人员在软件开发过程中面临一般解决方案,也就是开发的经验总结. 单例模式(S ...
- 天啦噜!知道硬盘很慢,但没想到比 CPU L1 Cache 慢 10000000 倍
前言 大家如果想自己组装电脑的话,肯定需要购买一个 CPU,但是存储器方面的设备,分类比较多,那我们肯定不能只买一种存储器,比如你除了要买内存,还要买硬盘,而针对硬盘我们还可以选择是固态硬盘还是机械硬 ...
- j2EE经典面试题
1. hibernate中离线查询去除重复项怎么加条件? dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 2. http协议及端口,sm ...
随机推荐
- 从零体检一个魔塔社区模型(modelscope)最简单demo
从社区拿一个模型,比如以下这个链接 https://www.modelscope.cn/models/iic/cv_mobilenet-v2_bad-image-detecting 它的代码样例如下 ...
- Gradle工程编译报错:Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierImpl.getModuleIdentifier()Lorg/gradle/api/artifacts/ModuleIdentifier;
1.背景 从git上拉取代码后,编译报错如下: Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierIm ...
- 从零到一:用Go语言构建你的第一个Web服务
使用Go语言从零开始搭建一个Web服务,包括环境搭建.路由处理.中间件使用.JSON和表单数据处理等关键步骤,提供丰富的代码示例. 关注TechLead,复旦博士,分享云服务领域全维度开发技术.拥有1 ...
- Java类和对象 小白版
一.类 一.类的定义 具有同种属性的对象称为类.定义了它所包含的全体对象的公共特征和功能,对象就是类的一个实例化. 类的三种常见成员:属性.方法.构造器 二.类的编写 1.类名的定义: 2.类属性(特 ...
- 07-canvas绘制虚线
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- C#使用泛型方法将Datatable转换成List对象集合
在项目中遇到需要将Datatable转换成对象的需求,通过dr[0]取下标这种获取,如果数据的顺序发生了改变则需要改变全部,工作量大 foreach (DataRow dr in dt.Rows) { ...
- LaTeX 插入矢量图
首先将矢量图保存为 PDF 格式. 使用 pdfcrop 工具裁剪 PDF 页面空白: pdfcrop <input.pdf> [output.pdf] 在 .tex 文件中使用 grap ...
- 5个必知的高级SQL函数
5个必知的高级SQL函数 SQL是关系数据库管理的标准语言,用于与数据库通信.它广泛用于存储.检索和操作数据库中存储的数据.SQL不区分大小写.用户可以访问存储在关系数据库管理系统中的数据.SQL允许 ...
- three.js添加3d模型
three官方的几何体也就那么几个,想要生成各种各样的模型,其难度十分之大,这时引入外部模型也不失为一种选择.具体引入办法如下. 导入依赖 点击查看代码 import * as THREE from ...
- sicp每日一题[1.45]
Exercise 1.45 We saw in Section 1.3.3 that attempting to compute square roots by naively finding a f ...