自己动手写CPU之第七阶段(4)——验证简单算术操作指令实现效果

将陆续上传本人写的新书《自己动手写CPU》,今天是第27篇,我尽量每周四篇

China-pub的预售地址如下(有目录、内容简介、前言):

http://product.china-pub.com/3804025

亚马逊的预售地址如下,欢迎大家围观呵!

http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4


7.4 测试简单算术操作指令实现效果

      本节通过实验来检验我们修改后的代码是否实现了简单算术操作指令,测试程序如下,源文件是本书附带光盘Code\Chapter7_1\AsmTest目录下的inst_rom.S文件。

   .org 0x0
   .set noat
   .global _start
_start:

   #########  第一段:测试add\addi\addiu\addu\sub\subu指令 ###############

   ori  $1,$0,0x8000           # $1 = 0x00008000
   sll  $1,$1,16               # $1 = 0x80000000
   ori  $1,$1,0x0010           # $1 = 0x80000010  给$1赋初值

   ori  $2,$0,0x8000           # $2 = 0x00008000
   sll  $2,$2,16               # $2 = 0x80000000
   ori  $2,$2,0x0001           # $2 = 0x80000001  给$2赋初值

   ori  $3,$0,0x0000           # $3 = 0x00000000
   addu $3,$2,$1               # $3 = 0x00000011  $1加$2,无符号加法
   ori  $3,$0,0x0000           # $3 = 0x00000000
   add  $3,$2,$1               # $2加$1,有符号加法,结果溢出,所以$3应保持不变
                               # $3保持为0x00000000

   sub   $3,$1,$3              # $3 = 0x80000010  $1减去$3,有符号减法
   subu  $3,$3,$2              # $3 = 0xF         $3减去$2,无符号减法

   addi $3,$3,2                # $3 = 0x11        $3加2,有符号加法
   ori  $3,$0,0x0000           # $3 = 0x00000000
   addiu $3,$3,0x8000          # $3 = 0xffff8000  $3加0xffff8000,无符号加法

   #############    第二段:测试slt\sltu\slti\sltiu指令   #################

   or   $1,$0,0xffff           # $1 = 0x0000ffff     
   sll  $1,$1,16               # $1 = 0xffff0000  给$1赋初值
   slt  $2,$1,$0               # $2 = 1           比较$1与0x0,有符号比较
   sltu $2,$1,$0               # $2 = 0           比较$1与0x0,无符号比较
   slti $2,$1,0x8000           # $2 = 1       比较$1与0xffff8000,有符号比较
   sltiu $2,$1,0x8000          # $2 = 1       比较$1与0xffff8000,无符号比较

   ##############         第三段:测试clo\clz指令          ################

   lui $1,0x0000          # $1 = 0x00000000  给$1赋初值
   clo $2,$1              # $2 = 0x00000000  统计$1中“0”之前的“1”的个数
   clz $2,$1              # $2 = 0x00000020  统计$1中“1”之前的“0”的个数

   lui $1,0xffff          # $1 = 0xffff0000
   ori $1,$1,0xffff       # $1 = 0xffffffff  给$1赋初值
   clz $2,$1              # $2 = 0x00000000  统计$1中“1”之前的“0”的个数
   clo $2,$1              # $2 = 0x00000020  统计$1中“0”之前的“1”的个数

   lui $1,0xa100          # $1 = 0xa1000000  给$1赋初值
   clz $2,$1              # $2 = 0x00000000  统计$1中“1”之前的“0”的个数
   clo $2,$1              # $2 = 0x00000001  统计$1中“0”之前的“1”的个数

   lui $1,0x1100          # $1 = 0x11000000  给$1赋初值
   clz $2,$1              # $2 = 0x00000003  统计$1中“1”之前的“0”的个数
   clo $2,$1              # $2 = 0x00000000  统计$1中“0”之前的“1”的个数

################     第四段:测试mul、mult、multu指令     ################

   ori  $1,$0,0xffff                  
   sll  $1,$1,16
   ori  $1,$1,0xfffb           # $1 = -5    给$1赋初值
   ori  $2,$0,6                # $2 = 6     给$2赋初值
   mul  $3,$1,$2               # $3 = -30 = 0xffffffe2
                               # $1乘以$2,有符号乘法,结果的低32位保存到$3
  
   mult $1,$2                  # HI = 0xffffffff
                               # LO = 0xffffffe2
                               # $1乘以$2,有符号乘法,结果保存到HI、LO寄存器

   multu $1,$2                 # HI = 0x5
                               # LO = 0xffffffe2
                               # $1乘以$2,无符号乘法,结果保存到HI、LO寄存器
   nop
   nop

      程序的注释给出了预期效果,将上述inst_rom.S文件,与第4章建立的Bin2Mem.exeMakefileram.ld这三个文件拷贝到Ubuntu虚拟机中的同一个目录下,打开终端,使用cd命令进入该目录,然后输入make all,即可得到用于ModelSim仿真的指令存储器初始化文件inst_rom.data

      在ModelSim中新建一个工程,并添加本书附带光盘Code\Chapter7_1目录下的所有.v文件,然后可以编译。再复制上面的inst_rom.data文件到ModelSim工程的目录下,就可以进行仿真了。仿真结果如图7-67-77-87-9所示,分别对应测试程序中的四段。




实现了简单算术指令的OpenMIPS代码下载地址如下:

http://download.csdn.net/detail/leishangwen/7801711


《自己动手CPU(含CD光盘1张)》使用Verilog HDL 设计实现了一款兼容MIPS32指令集架构的处理器——OpenMIPS。OpenMIPS 处理器具有两个版本,分别是教学版和实践版。教学版的主要设计思想是尽量简单处理器的运行情况比较理想化,与教科书相似,便于使用其进行教学、学术研究和讨论,也有助于学生理解课堂上讲授的知识。实践版的设计目标是能完成特定功能,发挥实际作用。《自己动手CPU(含CD光盘1张)》分为三篇。第一篇是理论篇,介绍了指令集架构、Verilog HDL的相关知识。第二篇是基础篇,采用增量模型,实现了教学版OpenMIPS处理器。首先实现了仅能执行一条指令处理器,从这个最简单的情况出发,通过依次添加,实现逻辑操作指令、移位操作指令、空指令、移动操作指令算术操作指令、转移指令、加载存储指令、协处理器访问指令、异常相关指令,最终实现了教学版OpenMIPS处理器。第三篇是进阶篇,通过为教学版OpenMIPS添加Wishbone总线接口,从而实现了实践版OpenMIPS处理器,并与SDRAM控制器、GPIO模块、Flash控制器、UART控制器、Wishbone总线互联矩阵等模块组成一个小型SOPC,然后下载到FPGA芯片以验证实现效果,最后为实践版OpenMIPS处理器移植了嵌入式实时操作系统μC/OS-II。 《自己动手CPU(含CD光盘1张)》适合计算机专业的学生、FPGA开发人员、处理器设计者、嵌入式系统应用开发工程师、MIPS平台开发人员以及对处理器内部的实现感兴趣的读者阅读,也可以作为高等院校计算机原理、计算机体系结构等课程的实践参考书。
一、 设计目标 设计目的: 设计一个含有36条指令MIPS单周期处理器,并能将指令准确的执行并烧到试验箱上来验证 设计初衷 1、理解MIPS指令结构,理解MIPS指令集中常用指令的功能和编码,学会对这些指令进行归纳分类。 2、了解熟悉MIPS体系中的处理器结构 3、熟悉并掌握单周期处理器CPU的原理和设计 4、进一步加强Verilog语言进行电路设计的能力 二、实验设备 1、装有xilinx ISE的计算机一台 2、LS-CPU-EXB-002教学系统实验箱一台 三、实验任务 1.、学习 MIPS 指令集,深入理解常用指令的功能和编码,并进行归纳确定处理器各部件的控制码,比如使用何种 ALU 运算,是否寄存器堆等。 2、单周期 CPU 是指一条指令的所有操作在一个时钟周期内执行完。设计中所有寄存器和存储器都是异步读同步的,即读出数据不需要时钟控制,但入数据需时钟控制。 故单周期 CPU 的运作即:在一个时钟周期内,根据 PC 值从指令 ROM 中读出相应的指令,将指令译码后从寄存器堆中读出需要的操作数,送往 ALU 模块,ALU 模块运算得到结果。 如果是 store 指令,则 ALU 运算结果为数据存储的地址,就向数据 RAM 发出请求,在下一个时钟上升沿真正入到数据存储器。 如果是 load 指令,则 ALU 运算结果为数据存储的地址,根据该值从数据存 RAM 中读出数据,送往寄存器堆根据目的寄存器发出请求,在下一个时钟上升沿真正入到寄存器堆中。 如果非 load/store 操作,若有寄存器堆的操作,则直接将 ALU 运算结果送往寄存器堆根据目的寄存器发出请求,在下一个时钟上升沿真正入到寄存器堆中。 如果是分支跳转指令,则是需要将结果入到 pc 寄存器中的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值