深入设计电子计算器(一)——CPU指令集设计
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/8254096.html 作者:窗户 QQ:6679072 E-mail:6679072@qq.com
前几天写了一篇《如何设计一个电子计算器》,一个朋友看了之后说实在太low,好吧,依照他的意思,那我就采用文中FPGA设计的方式,然后自己从指令集设计、cpu设计、汇编器设计、汇编程序设计一路设计过去,再多写个几篇水文,组一个系列,取名就叫《深入设计电子计算器》。基本的计算器原理方面,还是先看一下《如何设计一个电子计算器》。
设计的第一步,是设计CPU的指令集,我这里一切从零开始设计。以前想在chinaunix召集人设计一个32位处理器来学习学习,并移植gcc或者llvm来编译C语言,当时考虑做一个RISC,采用三条流水线,最终移植编译器有人而一起设计CPU没人。当然,本系列只是一个抛砖引玉,我并不打算用很深的原理来设计这个CPU,那会花费很多的时间与精力,而只是让这个CPU可以运行起来而已。
此CPU为16位,CPU核中有8个通用寄存器,为r0~r7,都为16位寄存器。指令存储和数据存储分开,采用哈佛结构,两套总线。
有两个中断信号,对于我这个演示来说应该足够了。中断信号外面接一个中断控制器,接入两个中断源。这两个中断源一个接定时器,另外一个直接拖出去给外部用。而中断控制器和定时器都挂在数据总线上,以便CPU来设置。
整个模块架构如下:
设置以下指令:(rn、rm这里,n、m为寄存器数字编号,i为立即数,但不同指令范围有区别,=>是赋值,[r7]在这里代表r7地址的数据RAM)
赋值指令:
mov rn, rm rm=>rn
movi rn, i i=>rn 此处i为立即数,范围0~65535
movib rn,i i=>rn 此处i为立即数,范围0~255
movtr rn rn=>[r7]
movfr rn [r7]=>rn
算术指令:
add rn, rm rn+rm=>rn
sub rn,rm rn-rm=>rn
addi rn,i rn+i=>rn
subi rn,i rn-i=>rn
mul r0Xr1=>r2:r3
umul r0Xr1=>r2:r3
div r2:r3/r0=>r1,r4
udiv r2:r3/r0=>r1,r4
逻辑指令:
and rn, rm rn&rm=>rn
or rn,rm rn|rm=>rn
xor rn, rm rn^rm=>rn
not rn ~rn=>rn
sl rn,i rn<<i=>rn
sr rn,i rn>>i=>rn
跳转指令:
bz i 如果上一条指令出现了0就跳转到当前指令地址+i
bb rn,i,im 如果寄存器rn的第i位为1就跳转到当前指令地址+i
b i 无条件跳转到i地址
call i 把下一条指令地址压栈,r0~r7压栈,并跳转到i地址
ret 把之前call压栈的r0~r7恢复,并回到call压栈的执行地址
reti 当中断发生的时候,会把当前执行地址,r0~r7压栈,reti会把这些寄存器弹出,并回到之前执行地址,并通知中断控制器
这些指令对于CPU基本是完备了。
以上指令集还有点问题,我也还没有设计准确的opcode,可能会被修改,但我尽我自己完成这一系列,本篇是这个系列的第一篇。尽管偷工减料版也可能会花去我相当的时间,但我想对于来看的网友多少有那么一点点帮助吧,那就可以了,希望支持。
深入设计电子计算器(一)——CPU指令集设计的更多相关文章
- 深入设计电子计算器(一)——CPU框架及指令集设计
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/8278418.html 作者:窗户 Q ...
- CPU指令集设计RISC和CISC
CPU指令集 硬件实现具有速度快,成本高,灵活性差,软件实现与之相反.因此出现频率高的基本功能首选硬件实现.指令集的不同反映了设计原理.制造技术和系统类别. RISC 精简指令集计算机(Reduced ...
- CPU指令的流水线运行
指令集是CPU体系架构的重要组成部分.C语言的语法是对解决现实问题的运算和流程的方法的高度概况和抽象,其主要为算术.逻辑运算和分支控制,而指令集就是对这些抽象的详细支持,汇编仅仅只是是为了让开发者更好 ...
- 四十年前的 6502 CPU 指令翻译成 JS 代码会是怎样
去年折腾的一个东西,之前 blog 里也写过,不过那时边琢磨边写,所以比较杂乱,现在简单完整地讲解一下. 前言 当时看到一本虚拟机相关的书,正好又在想 JS 混淆相关的事,无意中冒出个问题:能不能把某 ...
- 一文彻底搞懂CAS实现原理 & 深入到CPU指令
本文导读: 前言 如何保障线程安全 CAS原理剖析 CPU如何保证原子操作 解密CAS底层指令 小结 朋友,文章优先发布公众号,如果你愿意,可否扫文末二维码关注下? 前言 日常编码过程中,基本不会直接 ...
- 从 Java 代码到 CPU 指令
从 Java 代码到 CPU 指令 我们都知道,编写的 Java 代码,最终还是要转化为 CPU 指令才能执行的.为了理解 Java 内存模型的作用,我们首先就来回顾一下从 Java 代码到最终执行的 ...
- Vivado实战—单周期CPU指令分析
引言 不知道你是否和我有过同样的感受,<计算机组成原理>这门学科学起来如此的艰难:一节课下来,教室黑板上留下了满满的 "足迹",看上去也挺简单的,不就是 0 和 1 ...
- CPU 指令环 ring0,ring1,ring2,ring3
Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3. Windows只使用其中的两个级别RING0和RING3,RING0只给操作系统用,RING3谁都能用.如果 ...
- cpu指令如何读写硬盘
我们提到cpu的主要作用之一就是控制设备之间的数据交互.这其中自然也包括了硬盘.系统的所有数据基本都在硬盘中,所以知道怎么读写硬盘,对程序来说非常重要,所以我们先来探索下传说中的pio模式. cpu要 ...
随机推荐
- 《Javascript_Dom 编程艺术》(第2版)读书笔记
第1章 Javascript 简史 Dom : 平稳退化.渐进增强,以用户为中心的设计 第2章 Javascript 语法 1.程序设计语言分为:解释性(javascript)和编译型(java,C+ ...
- 剑指offer面试题14-调整数组顺序使奇数位于偶数前面
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 前后分的这个.,让我想起来高速排序.好吧,就用这个做. 考虑到了排序的可扩 ...
- 沉迷 Docker,无法自拔(在 Docker 中运行 MySQL)
记得之前做网站开发的时候,因为服务端用的 MySQL 数据库,为了方便调试以及隔离生产与开发环境,自己就在本地也安装了一个 MySQL 数据库.但是用着用着慢慢的也发现了一些不舒服的地方,比如常驻后台 ...
- response与request回顾学习
一.response response是servlet.service方法的一个参数,它的类型是javax.servlet.http.HttpServletResponse,在客户端每发出一个请求时, ...
- wget 下载百度网盘文件
上传文件到服务器,有许多种方法,罗列一下我用过的 xftps之类的工具 rz tz命令 git 上传到码云 通过wget方式,上传文件到百度网盘,七牛云等只要支持wget方式下载即可 下面介绍一下怎么 ...
- Node之Express服务器启动安装与配置
首先安装express-generator cnpm i -g express-generator 使用express --version查看express版本 生成express服务 express ...
- OC学习15——文件I/O体系
OC提供了丰富的I/O相关API,如果只是管理文件和目录,程序可以使用NSFileManager进行管理,包括创建.删除.移动和复制文件等:如果程序需要读取文件内容,则可通过NSFileHandle进 ...
- Python 多线程进程高级指南(二)
本文是如何<优雅地实现Python通用多线程/进程并行模块>的后续.因为我发现,自认为懂了一点多线程开发的皮毛,写了那么个multi_helper的玩意儿,后来才发现我靠原来就是一坨屎.自 ...
- iView的使用【CDN向】
直接粗暴地上html代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- bzoj 3139: [Hnoi2013]比赛
Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得 ...