深入设计电子计算器(一)——CPU指令集设计

时间:2022-10-13 06:47:26
  版权申明:本文为博主窗户(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来设置。

  整个模块架构如下:

深入设计电子计算器(一)——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,可能会被修改,但我尽我自己完成这一系列,本篇是这个系列的第一篇。尽管偷工减料版也可能会花去我相当的时间,但我想对于来看的网友多少有那么一点点帮助吧,那就可以了,希望支持。