深入设计电子计算器(一)——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要 ...
随机推荐
- 2016年7月微软MVP申请開始了!
2016年7月微软MVP申请開始了! CSDN与微软合作,长期为用户提供申请"微软最有价值专家"的平台.希望有兴趣.资历的朋友以及正在朝这个方向努力的朋友能够积极參与. 2016年 ...
- overridePendingTransition介绍
Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画 它包含两个部分: 一部分是第一个activity退出时的动画: 另外一部分时第二个activity进入时的 ...
- MyBatis_通过resultMap解决不一致的问题
- 数据加密,android客户端和服务器端可共用
安卓中,不管是内网还是外网,数据的传输首要考虑就是安全问题,尤其是用户信息,以及各种密码等敏感信息. 所以说,对数据的加密是很有必要的,尤其是当下物联网蓬勃发展的今天,数据安全尤为重要. 数据加密的方 ...
- 【java】System成员输入输出功能out、in、err
package System输入输出; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOu ...
- JavaScript基础1——基本概念
关于JS的概念 JavaScript 是一种弱类型语言. JavaScript 是一种客户端脚本语言(脚本语言是一种轻量级的编程语言). JavaScript是基于对象的.(因为面向对象需要具有封装. ...
- 二叉树Bynary_Tree(2):二叉树的递归遍历
7/18/2017 正在码,理解完就写博 7/21/2017 终于码完,借助链表实现的队列撸一个二叉树对于我来说有难度,撸了两天没有成果,我最后选用的是数组实现的循环队列去撸一个二叉树 正文如下: 以 ...
- vue+express之前后台分离博客
说来惭愧,这么久没有更新过博客了,写个项目练练手吧,打算写一个vue+express的博客 可能这个时间说长不长说短不短 写到哪就是哪吧 我采用的是前后台分离 express采用的是mvc,但 ...
- ios学习——键盘的收起
在开发过程中,我们经常会用到UITextField.UITextView等文本框,然后这些文本框在点击之后会自动成为第一响应者(FirstResponder),并自动弹出软键盘.然而,没有自动定义好的 ...
- display:none和visiblity:hidden区别
相同: 1.两者都能隐藏元素. 不同: 1.display:none 不占页面空间,visiblity:hidden 占据原先页面空间. 这里必须说明的是,元素不占页面空间后,取该元素或其内部元素的宽 ...