类MIPS单周期处理器_第1页
类MIPS单周期处理器_第2页
类MIPS单周期处理器_第3页
类MIPS单周期处理器_第4页
类MIPS单周期处理器_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档 1欢迎下载 一 一 实验目的实验目的 1 了解微处理器的基本结构 2 掌握哈佛结构的计算机工作原理 3 学会设计简单的微处理器 4 了解软件控制硬件工作的基本原理 二 二 实验任务实验任务 利用 HDL 语言 基于 Xilinx FPGA nexys4 实验平台 设计一个能够执行以 下 MIPS 指令集的单周期类 MIPS 处理器 要求完成所有支持指令的功能仿真 验证指令执行的正确性 要求编写汇编程序将本人学号的 ASCII 码存入 RAM 的 连续内存区域 1 支持基本的算术逻辑运算如 add sub and or slt andi 指令 2 支持基本的内存操作如 lw sw 指令 3 支持基本的程序控制如 beq j 指令 精品文档 2欢迎下载 三 三 实验过程实验过程 1 1 建立工程建立工程 在 ISE 14 7 软件中建立名为 Lab1 的工程文件 芯片系列选择 Artix7 具 体芯片型号选择 XC7A100T 封装类型选择 CSG324 速度信息选择 1 2 2 分模块设计分模块设计 1 指令存储器 ROM 设计 新建 IP core Generator 命名为 irom 设定的指令存储器大小为 128 字 指令存储器模块在顶层模块中被调用 输入为指令指针 PC 与时钟信号 clkin 输出为 32 位的机器指令 并将输出的机器指令送到后续的寄存器组 模块 控制器模块 立即数符号扩展模块进行相应的处理 然后制作 COE 文件 先使用 UltraEdit 编辑代码 代码如下 main addi 2 0 85 sw 2 0 3 addi 2 0 50 sw 2 4 3 addi 2 0 48 sw 2 8 3 addi 2 0 49 精品文档 3欢迎下载 sw 2 12 3 addi 2 0 53 sw 2 16 3 addi 2 0 49 sw 2 20 3 addi 2 0 51 sw 2 24 3 addi 2 0 52 sw 2 28 3 addi 2 0 54 sw 2 32 3 addi 2 0 52 sw 2 36 3 j main 将其导入 QtSpim 中 选中机器码 加上前缀并将最后一行 0 x08100009 修 改为 0 x08000000 代码如下 MEMORY INITIALIZATION RADIX 16 MEMORY INITIALIZATION VECTOR 20020055 ac620000 20020032 ac620004 精品文档 4欢迎下载 20020030 ac620008 20020031 ac62000c 20020035 ac620010 20020031 ac620014 20020033 ac620018 20020034 ac62001c 20020036 ac620020 20020034 ac620024 08000000 保存为 coe 文件 在 ROM 模块里调用 2 数据存储器 RAM 设计 新建 IP core Generator 命名为 dram 数据存储器为 RAM 类型的存储器 并且需要独立的读写信号控制 因此其对外的接口为 精品文档 5欢迎下载 clk we datain addr 输出信号为 dataout 当时钟上升沿到来时 如果写 信号 we 为真 根据 addr 所表示的地址找到对应的存储单元 并将输入的数 据 datain 写到对应的存储单元中 如果写信号为假 则根据 addr 所表示的 地址 将对应存储单元的数据送到输出端 dataout 在本实验中调用 ISE 提 供的 IP 核进行设计 设定的数据存储器大小为 64 字 数据存储器模块在顶层模块中被调用 输入的时钟信号来自于顶层模块的 clkin addr 信号来自于 ALU 单元的输出端 对基地址与偏移量执行加操作 datain 来自于寄存器组的第二个数据输出端 Rtdata 而控制信号 we 则来自 于控制器对指令的译码 输出数据 dataout 通过一个选择器 MUX3 决定是否 写入到相应的寄存器 初始化 dram 值 0 x55555555 在以后的仿真过程中可以用于验证是否正确 调用 3 立即数符号扩展模块设计 对于 I 型指令 将指令的低十六位作为立即数符号扩展模块的输入 inst 15 0 如果十六位立即数的最高位 即符号位 为 1 则在 inst 15 15 前面补 16 个 1 如果为 0 则在前面补 16 个 0 然后将符号扩展之后的 data 31 0 通过一个选择器 即 MUX2 输送到 ALU 单元的第二个源操作数输入 端 即 input2 代码如下 module signext 精品文档 6欢迎下载 input 15 0 inst output 31 0 data assign data inst 15 15 16 hffff inst 16 h0000 inst endmodule 4 寄存器组模块 该模块的输入为 clk RegWriteData RegWriteAddr RegWriteEn RsAddr RtAddr 和 reset 输出信号为 RsData 和 RtData 由于 0 一直输出 0 因此当 RsAddr RtAddr 为 0 时 RsData 以及 RtData 必须输出 0 否则输出相应地址寄存器数据 另外 当 RegWriteEn 信号有效时 数据应该写入 RegWriteAddr 寄存器 并且每次复 位时所有寄存器都清零 寄存器组模块在顶层模块中被调用 clk 信号来自于顶层模块的 clkin reset 信号来自于顶层模块的 reset RegWriteData 来自于 ALU 单元的 运算结果输出端或者是数据存储器的输出端 通过一个选择器 MUX3 进行选择 RegWriteAddr RsAddr RtAddr 来自于指令的对应位 RegWriteEn 来自于控制 器对指令的译码 输出信号 Rsdata 与 Rtdata 则分别来自于 Rsaddr 与 Rtaddr 对应的寄存器 代码如下 module regFile input clk 精品文档 7欢迎下载 input reset input 31 0 regWriteData input 4 0 regWriteAddr input regWriteEn output 31 0 RsData output 31 0 RtData input 4 0 RsAddr input 4 0 RtAddr reg 31 0 regs 0 31 assign RsData RsAddr 5 b0 32 b0 regs RsAddr assign RtData RtAddr 5 b0 32 b0 regs RtAddr integer i always posedge clk begin if reset begin if regWriteEn 1 begin regs regWriteAddr regWriteData 精品文档 8欢迎下载 end end else begin for i 0 i 31 i i 1 regs i 0 regs 31 32 hffffffff end end endmodule 5 控制器模块 控制器输入为指令的 opCode 字段 即操作码 操作码经过主控制单元的译 码 给 ALUCtrl Data Memory Registers Muxs 等部件输出正确的控制信号 该模块在顶层模块中被调用 输入的 opcode 来自于指令的前 6 位 而输出 信号 aluSrc MemToReg RegWrite MemRead MemWrite branch aluop 和 jmp 则是对 6 位 opcode 的译码 代码如下 module ctr input 5 0 opCode output regDst 精品文档 9欢迎下载 output aluSrc output memToReg output regWrite output memRead output memWrite output branch output 1 0 aluop output jmp reg regDst reg aluSrc reg memToReg reg regWrite reg memRead reg memWrite reg branch reg 1 0 aluop reg jmp always opCode begin case opCode 精品文档 10欢迎下载 6 b000010 jmp begin regDst 0 aluSrc 0 memToReg 0 regWrite 0 memRead 0 memWrite 0 branch 0 aluop 2 b00 jmp 1 end 6 b000000 R begin regDst 1 aluSrc 0 memToReg 0 regWrite 1 memRead 0 memWrite 0 branch 0 精品文档 11欢迎下载 aluop 2 b10 jmp 0 end 6 b100011 lw begin regDst 0 aluSrc 1 memToReg 1 regWrite 1 memRead 1 memWrite 0 branch 0 aluop 2 b00 jmp 0 end 6 b101011 sw begin regDst 0 aluSrc 1 memToReg 0 精品文档 12欢迎下载 regWrite 0 memRead 0 memWrite 1 branch 0 aluop 2 b00 jmp 0 end 6 b000100 beq begin regDst 0 aluSrc 0 memToReg 0 regWrite 0 memRead 0 memWrite 0 branch 1 aluop 2 b01 jmp 0 end 6 b001100 andi 精品文档 13欢迎下载 6 b001000 andi begin regDst 0 aluSrc 1 memToReg 0 regWrite 1 memRead 0 memWrite 0 branch 0 aluop 2 b11 aluop 2 b00 jmp 0 end default begin regDst 0 aluSrc 0 memToReg 0 regWrite 0 memRead 0 memWrite 0 精品文档 14欢迎下载 branch 0 aluop 2 b00 jmp 0 end endcase end endmodule 6 运算器 ALU 模块 微处理器支持的 add sub and or 和 slt 运算指令 需要利用 ALU 单元 实现运算 同时数据存储指令 sw 和 lw 也需要通过 ALU 单元计算存储器地址 条件跳转指令 beq 需要 ALU 来比较两个寄存器是否相等 所有这些指令包含的 操作为加 减 与 或和小于设置 5 钟不同的操作 该模块根据输入控制信号对输入数据进行相应的操作 并获得输出结果以 及零标识 由于 MIPS 处理器 ALU 单元利用 4 根输入控制信线的译码决定执行何 种操作 于是该操作的输入接口为 input1 input2 和 aluCtr 输出端口为 zero 和 aluRes ALU 模块在顶层模块被调用 input1 来自于寄存器组模块输出信号 Rsdata input2 来自于寄存器组模块输出信号 Rtdata 或者是立即数符号扩展 模块的输出信号 通过一个选择器 MUX2 进行选择 aluCtr 来自于 aluctr 模 块的输出端 aluRes 与 zero 为 ALU 单元的运算结果 其中 zero 主要用于 beq 指令 精品文档 15欢迎下载 代码如下 module ALU input 31 0 input1 input 31 0 input2 input 3 0 aluCtr output 31 0 aluRes output zero reg zero reg 31 0 aluRes always input1 or input2 or aluCtr begin case aluCtr 4 b0110 begin aluRes input1 input2 if aluRes 0 zero 1 else zero 0 精品文档 16欢迎下载 end 4 b0010 aluRes input1 input2 4 b0000 aluRes input1 4 b0001 aluRes input1 input2 4 b1100 aluRes input1 input2 4 b0111 begin if input1 input2 aluRes 1 end default aluRes 0 endcase end endmodule 7 ALU 控制设计 MIPS 指令中具有 6 位操作码 如果为 R 型指令 进一步采用 6 位功能码来 精品文档 17欢迎下载 表示 R 型指令的具体操作 由于设计的微处理器支持的运算类指令全部为 R 型 指令 因此可以通过对 R 型指令的 6 位功能码编码产生 ALU 的 4 为控制信号 但是 lw sw 以及 beq j 型指令没有功能码 因此需要区分指令的类型 由于 只有三类指令需要 ALU 单元 因此可以采用两位二进制码对指令的 ALU 操作类 型进行编码 指令的 ALU 操作类型编码由指令译码器产生 通过 2 位操作类型码以及 6 位指令功能码就可以产生 ALU 单元的 4 位控制 信号 该模块的主要功能就是根据译码控制单元产生的 2 位操作码以及 6 位功能 码产生 4 位 ALU 控制信号 因此输入信号为 aluop 2 位 funct 6 位 输 出信号为 aluctr 4 位 ALU 控制模块在顶层模块被调用 aluop 来自于控制 器对指令的 6 位 opcode 的译码 而 funct 来自于指令的后 6 位 代码如下 module aluctr input 1 0 ALUOp input 5 0 funct output 3 0 ALUCtr reg 3 0 ALUCtr always ALUOp or funct casex ALUOp funct 精品文档 18欢迎下载 8 b00 xxxxxx ALUCtr 4 b0010 8 b01xxxxxx ALUCtr 4 b0110 8 b11xxxxxx ALUCtr 4 b0000 8 b10 xx0000 ALUCtr 4 b0010 8 b10 xx0010 ALUCtr 4 b0110 8 b10 xx0100 ALUCtr 4 b0000 8 b10 xx0101 ALUCtr 4 b0001 8 b10 xx1010 ALUCtr 4 b0111 endcase endmodule 8 顶层模块设计 本次实验中多路复用器模块 MUX 以及 PC 模块综合在顶层模块之中 顶层模 块需要将前面的多个模块实例化后 通过导线以及多路复用器将各个部件连接 起来 并且在时钟的控制下修改 PC 的值 PC 是一个 32 位的寄存器 每个时钟 沿自动增加 4 多路复用器 MUX 直接通过三目运算符实现 例如 assign OUT SEL INPUT1 INPUT2 其中 OUT SEL INPUT1 和 INPUT2 都是预先定义的信号 代码如下 module top 精品文档 19欢迎下载 input clkin input reset reg 31 0 pc add4 wire choose4 wire 31 0 expand2 mux2 mux3 mux4 mux5 address jmpaddr inst wire 4 0 mux1 wire for controller wire reg dst jmp branch memread memwrite memtoreg wire 1 0 aluop wire alu src regwrite wire for aluunit wire zero wire 31 0 aluRes wire for aluctr wire 3 0 aluCtr wire for memory wire 31 0 memreaddata wire for register wire 31 0 RsData RtData wireforext 精品文档 20欢迎下载 wire 31 0 expand always negedge clkin begin if reset begin pc mux5 add4 pc 4 end else begin pc 32 b0 add4 32 h4 end end ctr mainctr opCode inst 31 26 regDst reg dst aluSrc alu scr memToReg memtoreg regWrite regwrite memRead memread memWrite memwrite 精品文档 21欢迎下载 branch branch aluop aluop jmp jmp ALU alu input1 RsData input2 mux2 aluCtr aluCtr zero zero aluRes aluRes aluctr aluctr1 ALUOp aluop funct inst 5 0 ALUCtr aluCtr dram dmem a aluRes 7 2 d RtData clk clkin we memwrite spo memreaddata 精品文档 22欢迎下载 irom imem a pc 8 2 clk clkin spo inst regFile regfile RsAddr inst 25 21 RtAddr inst 20 16 clk clkin reset reset regWriteAddr mux1 regWriteData mux3 regWriteEn regwrite RsData RsData RtData RtData signext signext inst inst 15 0 data expand assign mux1 reg dst inst 15 11 inst 20 16 assign mux2 alu scr expand RtData assign mux3 memtoreg memreaddata aluRes 精品文档 23欢迎下载 assign mux4 choose4 address add4 assign mux5 jmp jmpaddr mux4 assign choose4 branch assign expand2 expand 2 assign jmpaddr add4 31 28 inst 25 0 2 b00 assign address pc expand2 endmodule 3 3 各模块仿真各模块仿真 1 寄存器组仿真 代码如下 module regFile input clk input reset input 31 0 regWriteData input 4 0 regWriteAddr input regWriteEn output 31 0 RsData output 31 0 RtData input 4 0 RsAddr input 4 0 RtAddr 精品文档 24欢迎下载 reg 31 0 regs 0 31 assign RsData RsAddr 5 b0 32 b0 regs RsAddr assign RtData RtAddr 5 b0 32 b0 regs RtAddr integer i always posedge clk begin if reset begin if regWriteEn 1 begin regs regWriteAddr regWriteData end end else begin for i 0 i 31 i i 1 regs i 0 regs 31 32 hffffffff end end 精品文档 25欢迎下载 endmodule 仿真结果如下 Reset 高电平下输出为 0 Reset 无效后 正常输入和输出数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论