深入设计电子计算器(一)——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要 ...
随机推荐
- 树莓派学习笔记——USB wifi配置指南
0 前言 树莓派既能够使用有线网络又能够无线网络,假设使用有线网络不方便的话能够借助USB wifi无线网卡让树莓派也插上无线"翅膀". 可是和使用有线网络即插即用的方式不 ...
- Android View视图系统分析和Scroller和OverScroller分析
Android View视图系统分析和Scroller和OverScroller分析 View 视图分析 首先,我们知道.在Android中全部的视图资源(无论是Layout还是V ...
- Laravel技巧之记录多日志
相信每个小伙伴在使用laravel的时候都会记录日志.查看日志.那么问题来了,比如我在对接zabbix接口的时候,使用 Log::info() 会让日志全部记录在 storage/logs/larav ...
- 《RabbitMQ Tutorial》译文 第 6 章 远程过程调用(RPC)
原文来自 RabbitMQ 英文官网的教程(6.Remote procedure call - RPC),其示例代码采用了 .NET C# 语言. In the second tutorial we ...
- SpringMVC实现JSON与前台交互
这几天忙着做学校的项目,感觉好久没有更新博客了,来整理一下. 由于要实现的功能是表单联动,只能自己去写ajax来实现提交给后台接口了,好久没有写前端,好多东西都忘记了,只能可怜巴巴的用原生的js去实现 ...
- 利用jquery.chained.remote实现多级级联
多级级联一直是前端比较烦人的一个功能,本次用jquery的插件,chained.remote实现多级级联. 应用场景:至少有二个下拉框,下拉框的个数不定. 应用步骤: 1.引入js文件,当然这个插件需 ...
- django+Echarts实现数据可视化
1.实时异步加载(从mysql读取数据) 2.scatter散点图 3.雷达图(参数选择要注意) time_1 time_2 time_3 4.面积图 我上传的源码请到github下载:https:/ ...
- MySQL在字段中使用select子查询
前几天看别人的代码中看到在字段中使用select子查询的方法,第一次见这种写法,然后研究了一下,记录下来 大概的形式是这样的: select a .*,(select b.another_field ...
- layer遮罩层 简单的遮罩层
在这里提供一个简单layer遮罩层,想深入了解可以进入 layer官网 多多学习哦. 先看下HTML页面代码 <!DOCTYPE html> <html lang="en& ...
- 系统内置委托:Func/Action
lSystem.Func 代表有返回类型的委托 lpublic delegate TResult Func<out TResult>(); lpublic delegate TResul ...