6502 指令译码器

news/2024/11/17 23:56:20/文章来源:https://www.cnblogs.com/1bite/p/18521817

引言

CPU 要执行指令需要先识别指令,弄清楚要执行的指令是什么类型、需要几个周期、操作数在哪里、目的地在哪里等信息,才能在后续的指令执行过程中打开对应的数据通路。“识别指令”的过程叫译码,完成指令识别功能的机构,叫译码器。

两个译码器

因为 6502 CPU 有一个两级流水线,所以有两个译码器,分别叫前置译码器(Pre-Decoder)和后置译码器。通常说的 6502 译码器实际是指后置译码器。这两个译码器在电路图中位置如下图:


图中,紫色表示前置译码器,蓝色表示后置译码器。我没有在 6502 Schematics.pdf 文件中找到前置译码器,可能是作者没有整理出来。

两个译码器之间的协作关系可以从 Hanson's Block Diagram 中看出来:
Hansons Block Diagram Partial
可以看到,前置译码器在指令寄存器(IR)之前,而后置译码器在 IR 之后。后置译码器负责对正在执行的指令进行译码,而前置译码器则对将要执行的指令进行简单译码。

译码原理

前置译码器与后置译码器都遵循同样的译码原理,观察它们的电路,都长得如下图:
decoder-mechanism
图中,横着的线为输入线,竖着的线为输出线。不难看出,译码器的输出其实是一个多输入或非逻辑。由于或非逻辑只能识别逻辑 1,所以为了能识别逻辑 0,通常还会把原数据取反后加入到输入中。上图中亮绿色的线与它下方的暗绿色线互为反信号。

为了说明译码器原理,让我们看一个简化版本的译码器。下图是一个 4 入 2 出的译码器,我们以它为模型进行说明。
simple-decoder
前面说到,输出是或非逻辑。所以 \(A=\overline{\overline{X_0}+X_1+X_2+\overline{X_3}}\),化简可得 \(A=X_0\overline{X_1}\overline{X_2}X_3\),可知 A 可以识别的输入模式为 1001,即可以识别 0x9。同理可得 \(B=\overline{X_1}X_2\),即 B 可以识别的输入模式为 x10x

前置译码器输入与输出

前置译码器负责对将要执行的指令进行简单译码,因此译码输入是总线数据。总线数据被暂存到前置译码寄存器(PD)中,避免总线数据变化影响译码结果。每个时钟周期,总线数据都会重新加载到 PD 中。下图是前置译码器整理过后的电路图:
pre-decoder-rom
应用前面介绍的分析法,可以得到前置译码器输出如下:

输出 匹配模式 说明
A 1xx000x0 LDX #, LDY #, CPX #, CPY #
B xxx010x1 立即数算术指令
C xxxx10x0 隐式(Implied)寻址指令
D 0xx0xx0x 栈操作指令、流程控制指令及算术指令

译码后,A、B、C、D 又按照 \(\overline{A+B+C\overline{D}}\) 的方式组合出一个新的信号,这个新信号表示指令不属于 2 周期指令。

后置译码器输入与输出

后置译码器负责对正在执行的指令进行译码,因此输入数据是指令寄存器中的内容。此外,它的输入还包含了当前的时钟周期,因此可译出当前指令是什么类型及是第几个周期。6502 Schematics.pdf 已经标注出了译码结果,本文不再赘述。GitHub 上有一个项目-emu russia-对 6502 做了非常彻底的研究,其中当然也包括对译码器的研究。感兴趣的读者可以参考他们的成果,里面有译码器输出的详细说明。

后记

6502 的译码器占据了芯片很大一块地方,是指令识别的核心,粗看之下可能觉得译码器非常神奇或者非常复杂,希望本文的介绍能让你祛魅。回头再想想,其实我们可以把译码器看做成一个只读内存,只不过存储的是一个 130 位的超大数。正是这个原因,有时候 6502 的译码器又叫解码器只读内存(Decoder ROM)。

为了将输入模式对应的指令标识出来,我做了一个小工具:

如果无法看到演示界面,可以点击此处体验。

【说明】:

  1. 输入 “xxxx10x0” 点击 “确定” 即可查看所有匹配的指令。
  2. 工具还支持表达式,例如输入 “1xx000x0 || xxx010x1 || (xxxx10x0 && ~0xx0xx0x)” 再点击 “确定” 即可查看所有满足表达式的指令。

参考

  1. 6502 Schematic.pdf
  2. 6502 Circuit Diagram
  3. EMU rassia - 6502 decoder
  4. 6502 decoder tool

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

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

相关文章

随笔5

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13234这个作业的目标 完成昨天的计划总结:问题 答案昨天完成的工作 完成个人中心和发表博客页面今天计划完成的工作 完成分类模块以及登录部分的接口对接遇到…

随笔4

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13234这个作业的目标 完成昨天的计划总结:问题 答案昨天完成的工作 完成首页的搭建今天计划完成的工作 完成个人中心和发表博客页面遇到的困难 发表页面需要…

Nukem pg walkthrough Intermediate

nmap 扫描 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.157.105 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-17 12:32 UTC Nmap scan report for 192.168.157.105 Host is up (0.071s latency). Not shown: 65529 filtered tcp ports (no-response) PORT …

Scrum冲刺-Day4

Scrum冲刺-Day4 1站立式会议 1.1站立会议照片1.2会议纪要 - Day4成员姓名 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难张易欣 订单模块接口的开发 实现对用户的请求和响应进行处理 需要解决前端和后端之间的数据传递和同步问题苏清仪 分类模块接口的开发 业务逻辑处…

第七天 项目冲刺

情况 前端提出浏览器访问出现错误的问题 定位发现是跨域问题先有前端通过配置代理也能通过,但还是决定再后端也配置一下解决跨域问题由于使用了springSecurity,所有还要在security中开启这个功能 前后端沟通时发现他对我的分类的理解完全不一样,而是类似于这样的于是按照他的…

Scrum冲刺-Day3

1.站立式会议 1.1站立会议照片1.2会议纪要成员姓名 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难张易欣 管理员模块接口的开发 订单模块接口的开发 暂无苏清仪 商品模块接口开发 分类模块接口的开发 暂无李心怡 登录注册 购物车功能的逻辑设计与ui图 暂无郑梦翰 确定…

Scrum冲刺-Day2

1站立式会议 1.1站立会议照片1.2会议纪要成员姓名 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难张易欣 后端用户模块 管理员模块接口开发 需要更深入学习数据库知识苏清仪 项目环境搭建 商品模块接口开发 暂无李心怡 前端接口设计 登录注册 暂无郑梦翰 前端接口设计 …

Scrum冲刺-Day7

Scrum冲刺-Day7 1站立式会议 1.1站立会议照片1.2会议纪要 - Day7成员姓名 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难张易欣 设计网页数据的回显及错误提示 总结七天冲刺进度 确保数据的准确性和完整性苏清仪 商品库存管理开发 商品展示顺序选择功能 处理算法的选择…

第六天 项目冲刺

任务完成情况 基本接口都写完了 评论的回复功能实现比较复杂一些,对原来的对象嵌套包装一层完成2级评论的功能 现在难题是前后端的协调调用比较麻烦,单纯的视频或者聊天以及不能满足需求 考虑到前端能及时调用后端接口比较直观,干脆部署后端项目到服务器上 申请服务器利用宝…

第五天 项目冲刺

迟迟未实现分页,今天决定实现分页功能,之前都是使用pagehelper插件来进行分页的,在mybatisplus官方文档发现它也有分页功能 于是干脆使用它的进行了分页插件的配置 学习了这种分页的使用测试显然有了分页特有的标志 基于xml的写法发现有些查询语句太多重复了,使用标签提取,…

为正在运行的 Docker 容器重启策略,以提高服务的可用性

--restart=always 是 Docker 中一个常用的参数,用来设置容器的重启策略。它的作用是确保容器在一定条件下能够自动重启,以提高服务的可用性。为正在运行的 Docker 容器重启策略,以提高服务的可用性。 为正在运行的 Docker 容器添加 --restart=always --restart=always 是 Doc…

iman——冲刺日志(第五天)

又又又一个阉割版 团队成员分工与进度 📝👥组别 成员 完成的任务 完成任务所用时间 (小时) 剩余时间 (小时)前端 阿依娜孜 尝试实现行程概览模块的前后端交互,修复页面跳转及样式排布的相关Bug。 8 8前端 郭剑敏 尝试实现备忘录与账单的前后端交互,并优化前端界面设计。 …