多级流水CPU设计单片机课程设计.doc

上传人:土8路 文档编号:10069194 上传时间:2021-04-16 格式:DOC 页数:29 大小:819.50KB
返回 下载 相关 举报
多级流水CPU设计单片机课程设计.doc_第1页
第1页 / 共29页
多级流水CPU设计单片机课程设计.doc_第2页
第2页 / 共29页
多级流水CPU设计单片机课程设计.doc_第3页
第3页 / 共29页
多级流水CPU设计单片机课程设计.doc_第4页
第4页 / 共29页
多级流水CPU设计单片机课程设计.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《多级流水CPU设计单片机课程设计.doc》由会员分享,可在线阅读,更多相关《多级流水CPU设计单片机课程设计.doc(29页珍藏版)》请在三一文库上搜索。

1、 (指导教师用表) 学 生 姓 名指 导 教 师 论文(设计)题目多级流水 CPU 设计 主要研究 (设计)内容 灵活运用所学到的基础知识和主要专业知识,设计、制作、调试最 终完成多级流水 CPU 的设计 研究方法 根据所学基础知识和主要专业知识,设计多级流水 CPU,使用 VHDL 语言。开发平台是FPGA-CPU 设计平台,主要开发工具: Quartus7.0,DebugController 主要任务 及目标 1. 设计出 CPU 实现多级流水 2. 完成从系统级设计到代码实现以及硬件上调试 3. 完成学年论文 主要参 考文献 1 (美)亨尼西, (美)帕特森计算机体系结构:量化研究方法(

2、第 3 版)机械工业出版社,2003 2 汤志忠,杨春武.开放式实验 CPU 设计.北京:清华大学出版社,2007 论文(设计)各阶段名称日期 系统概念设计及总体设计第 10 周 代码实现阶段第 1114 周 系统调试、试运行阶段第 15 周 进度安排 论文的整理定稿第 15 周 指导教师签字: 系主任签字: 主管教学院长签字: 装 订 线 学生姓名专业 年级 论文(设计)题目多级流水 CPU 设计 论文(设计)内容提要 论文完成的主要工作包括: (l) 综合运用了所学知识,完成多级流水 CPU 系统级设计。 (2) 通过 VHDL 语言实现逻辑设计。 (3) 设计成果在 FPGA 硬件平台的

3、运行 指导教师评语 成绩: 指导教师(签名): 年 月 日 摘要 本学期计算机体系课程设计题目是多级流水 CPU 设计。以计算机硬件为主, 兼顾计算机软件和计算机应用技术。在教师指导下,灵活运用所学到的基础知 识和主要专业知识,自己设计、制作、调试,完成 16 位五级流水 CPU 的实际。 本组设计并最终在 FPGA 实验平台上实现一个 CPU 芯片,具有五级流水。 采用流水处理技术解决了流水线技术中的结构相关、数据相关和控制相关。设 计了指令系统、指令格式、寻址方式、寄存器结构、数据表示方式、存储器系 统,运算器、控制器和流水线结构等。用 VHDL 硬件语言进行逻辑设计,采用 先进的工具软件

4、进行模拟和测试,测试通过之后下载到 FPGA 芯片中,并在测 试平台上通过规定测试程序的测试。 关键字:流水线;FPGA;五级流水 目目录录 1.1.前言前言-1 1.11.1实验目的实验目的-1 1.21.2实验环境实验环境-1 2.2.流水线工作原理流水线工作原理-3 3.3.系统设计系统设计-5 3.13.1概念设计概念设计-5 3.23.2指令系统指令系统-5 3.33.3时序设计时序设计-6 4.4.结构设计结构设计-9 4.14.1总体逻辑结构设计总体逻辑结构设计-9 4.24.2分模块结构设计分模块结构设计-11 5.5.代码实现及测试代码实现及测试 -13 5.15.1代码实现

5、代码实现-13 5.25.2程序测试程序测试-19 5.35.3测试结果测试结果-21 6.6.实验总结实验总结 -25 1.1. 前言 1.1 实验目的 1. 本实验需要自己设计并最终用 FPGA 实现一个 CPU 芯片。利用已有的计 算机组成原理知识,以及对计算机系统结构的初步学习,设计一个包括指令系 统、寻址方式、寄存器组、存储系统、流水线结构等的 CPU。设计的 CPU 必须 具有复位功能,以便使用 TEC-CA 实验台上的“CPU 复位”按钮对 CPU 复位,使 CPU 处于调试前的初始状态。CPU 复位脉冲按负脉冲设计。 2. 熟练掌握 VHDL 硬件描述语言,对 CPU 的各个功

6、能模块进行代码编写, 并学会将各个功能部分组织连接成一个完整 CPU 体系结构。 3. 学会利用先进的硬件设计工具软件 Quartus II 对程序进行仿真和调试。 并熟练掌握 FPGA-CPU 在“TEC-CA 开放式 CPU 实验教学系统”上的调试方法。 4. 在完成实验的过程中锻炼和提高实际动手能力、创新思维、团队合作精 神等方面的能力。 1.2 实验环境 1. 总体描述 FPGA-CPU 设计平台能够支持下载到 FPGA 中的 CPU 的单步调试和连续运行。 用户用 VHDL 编写的 CPU 代码通过编译之后,可以下载到设计平台上的 FPGA 芯 片中。FPGA-CPU 的运行通过执行

7、预先写到外部存储器中的程序来实现。使用 DebugController 程序对外部存储器进行读写操作,并能监控 FPGA-CPU 的状态 和通过设置断点调试 FPGA-CPU 正在执行的程序。这套实验环境为实验者提供了 最大的自由度来写出具有自己风格的 CPU 软核,并在测试运行平台上调试和运 行。 2. 硬件环境 整个硬件平台主要有 PC 监控系统、外部程序存储器、FPGA-CPU 及其下载 相关电路,以及控制电路组成。其中 PC 监控系统主要是由监控软件 DebugController 及相关通信接口等构成,提供一整套的运行和调试功能。 3. 软件环境 Quartus-7.0 我们使用该软

8、件完成编码工作,并在 active-hdl 功能模拟通过后,进行有 效的时序模拟。最终烧片等都用该软件。 调试程序 DebugController 使用该软件对外部存储器进行读写操作,并能监控 FPGA-CPU 的状态和通过 设置断点调试 FPGA-CPU 正在执行的程序。 2.2. 流水线工作原理 流水线处理技术是在重叠、先行控制的基础上发展起来的,包括指令控制 功能和功能处理过程都可采用流水处理。 在先行控制方式中将一条指令的执行分为“分析”和“执行”两个子过程。 这两个子过程分别使用指令分析器和运算器两个独立的部件来完成。所以可以 利用多条指令执行时,在时间上相互错开,轮流重叠地利用这两

9、个独立部件, 来加快程序的执行速度。若实现“分析”与“执行”中的每一个子过程都需要 t1=T/2 时间,则 4 条指令流水执行只需 5t1,比起 4 条指令顺序执行所需 的 8t1 时间少了近一半。 如果将指令的“分析”子过程再进一步划分成“指令译码”和“取操作数” 两个子过程,分别由“译码”和“取数”两个独立的子部件执行,并使所有子 部件的经过时间都改进成 t2=T/4,指令执行顺序如图 2-1 所示。 取取指指令令译译码码取取数数执执行行 入入出出 图表 2-1 指令执行顺序图 图 2-2 是指令流水执行的时空图。图中横坐标为时间,纵坐标为空间(即 各个子过程) ,标有数字的方格说明占用该

10、空间与时间的任务号,在本例中表示 机器处理的第 1、第 2、第 3、第 4、第 5 条指令,最多可以有 4 条指令在不同 的部件中同时进行处理。这样计算机每隔 t2 就能输出一条指令的执行结果。 图表 2-2指令流水执行时空图 按此思路,流水线的定义可以具体描述为:将一个复杂的处理过程分成 m 个复杂程度相当、处理时间大致相等的子过程,每个子过程由一个独立的功能 部件来完成,处理对象在各子过程连成的线路上连续流动。在同一时间,m 个 独立部件同时进行不同的操作,完成对不同子过程的处理,这种工作方式称为 流水线。 在计算机流水线的实际应用过程中,为平滑缓冲各子部件之间的速度差异,在 子部件之间往

11、往都要设置高速接口缓冲器或一定容量的高数缓冲器来保存中间 结果。也就是通常所说的 n 级流水处理中的级间寄存器。 3.3. 系统设计 3.1 概念设计 指令流水的基本思路是把每条指令划分为几个执行步骤,这些步骤在执行 过程中使用不同的资源从而在时间上能重叠起来,提高了整体工作负载的吞吐 率。 我们将每条指令划分为“取指” 、 “译码” 、 “执行” 、 “访存” 、 “写回”这五 个执行步骤。如图 3-1 所示。 取指令 IF 指令译码 ID 指令执行 EXE 存储器读写 MEM 寄存器写回 WB 图表 3-1 多级流水 CPU 设计图 3.2 指令系统 指令系统设计的好坏影响整个系统各个方面

12、的性能。我们采用了实验指导 书中的指令系统。如表 3-2 所示: 汇编语句操作码功能描述指令类型 ADD DR,SR00000000DR+SRDR SUB DR,SR00000001DR-SRDR DEC DR00000010DR-1DR INC DR00000011DR+1DR CMP DR,SR00000110 DR-SR 比较 AND DR,SR00000111DR and SRDR 逻辑与 OR DR,SR00001000DR or SRDR 逻辑或 XOR DR,SR00001010DR xor SR DR 异或 TEST DR,SR00001011 DR and SR, 测试 SH

13、L DR00001100 逻辑左移,最低位补 0,最高位移入 C SHR DR 00001101 逻辑右移,最高位补 0,最低位移入 C SAR DR00001110 算术右移,最高位右移,同时再用自身的值填入 算术逻辑 指令 MOV DR,SR00001111SR DR LOAD DR,SR01000001SR DR STORE DR,SR01000010 SR DR MOVI DR,IMM01000011IMM DR (双字指令) PSHF01000100 FLAG 入栈 POPF01000101 FLAG 出栈 PUSH SR01000110 SR 入栈 POP DR01000111 出

14、栈 DR 数据传送 指令 JR ADR00010000 无条件跳转到 ADR , ADR=原 PC 值+OFFSET JRC ADR00010001 当 C=1 时,跳转到 ADR, ADR=原 PC 值+OFFSET JRNC ADR00010010 当 C=0 时,跳转到 ADR, ADR=原 PC 值+OFFSET JRZ ADR00010011 当 Z=1 时,跳转到 ADR, ADR=原 PC 值+OFFSET JRNZ ADR00010100 当 Z=0 时,跳转到 ADR, ADR=原 PC 值+OFFSET JMPA ADR01010000 无条件跳转到 ADR RET0101

15、0001 子程序返回 CALL ADR10000000 调用首地址在 ADR 的子程序(双字指令) 控制转移 指令 NOP11000000 空操作其他 HALT00010000 11111111 停机 (JR 0XFFFF) 图表 3-2CPU 的指令系 3.3 时序设计 本次课程设计采用的五级流水时序如图 3-3 所示,数据通路如图 3-4 所示。 Clock number Instruction number 1 2 3 4 5 6 7 8 9 Instruction i IF ID EX MEM WB Instruction i+1 IF ID EX MEM WB Instruction

16、 i+2 IF ID EXMEM WB Instruction i+3IF IDEX MEM WB Instruction i+4 IFID EX MEM WB Clock number Instruction number 1 2 3 4 5 6 7 8 9 Instruction i IF ID EX MEM WB Instruction i IF ID EX MEM WB Instruction i+1 IF ID EX MEM WB Instruction i+1 IF ID EX MEM WB Instruction i+2 IF ID EXMEM WB Instruction i+

17、2 IF ID EXMEM WB Instruction i+3IF IDEX MEM WBInstruction i+3IF IDEX MEM WB Instruction i+4 IFID EX MEM WB Instruction i+4 IFID EX MEM WB 图表 3-3 五级流水时序图 CC1CC2CC3CC4CC5CC6 IMMemReg ALU Reg IMMemReg ALU Reg IMMemReg ALU IMReg ALU IMReg CC1CC2CC3CC4CC5CC6CC1CC2CC3CC4CC5CC6 IMMemReg ALU RegIMMemRegReg

18、ALU RegReg IMMemReg ALU RegIMMemRegReg ALU RegReg IMMemReg ALU IMMemRegReg ALU IMReg ALU IMRegReg ALU IMRegIMRegReg 图表 3-4 五级流水数据通路 为保证指令的正确执行。处理结构相关需要做两项工作:冲突检测和取指 延后。 1. 冲突检测 只有执行访存指令(LOAD/STORE)时,才会出现冲突。因此,我们在译码时 产生一个标志是否访存的信号 wMem。含义如图 3-5: wMem意义 00写内存(STORE) 01读内存(LOAD) 1 不占用内存 图表 3-5 wMEM 控制信

19、号 通过检查“访存阶段”的 m_wrMem 就可确定是否冲突。 2. 取指延后 在每次取指时,若有冲突,则往 IR 中写入空指令(NOP),并保持 PC 不变, 使取指延后一个节拍。 在解决了结构相关、控制相关、数据相关后,五级流水时序图最终设计如 图 3-6: 取指译码执行访存写回 取指译码执行访存写回 取指译码执行访存写回 取指译码执行访存写回 取指译码执行访存写回 PC更新 图表 3-6 五级流水时序图 4.4. 结构设计 4.1 总体逻辑结构设计 总体逻辑设计的 RTL 图参考课本中的设计,如图 4-1 所示。 图表 4-1 各个功能部件的功能及其使用的控制信号: 1. ALU:组合逻

20、辑部件,对两个 16 位的输入及进位输入 Cin 可进行由 3 位 控制信号控制。 2. 数据选择器 BUS_MUX:组合逻辑器件,其输入包括:源寄存器数据,目 标寄存器数据,带符号位扩展的偏移地址,PC,以及从内存读取的立即数、跳 转地址等数据。在 3 位控制信号的控制下它进行 ALU 模块 A、B 端输入的选择。 3. 程序计数器 PC:时序逻辑器件,16 位寄存器,在控制信号 pc_en 的控 制下可接收 ALU 的运算结果(高电平接收,否则保持不变) 。输出送往地址寄存 器(读取指令内容)以及数据选择器(进行自增运算) 。 4. 地址寄存器 AR 和指令寄存器 IR:都是 16 位的寄

21、存器,地址寄存器用 于存放要读写的内存地址单元的地址,输出送往地址总线,输入可能为 PC 内容, 也可能为 ALU 的输出(对读写内存指令) ;指令寄存器存放当前执行指令的内容, 它的输入来自从内存读取的指令和数据,输出送往控制逻辑。二者共用两位控 制信号 REC。 寄存器组和寄存器的选择:本实验中的寄存器都为 16 位,带有清零端和使 能端,实际上在写 VHDL 程序时,通用寄存器以及 AR、IR、PC 使用的都是同一 个模板。按照我们的设计,通用寄存器共有 16 个,由指令的低 8 位的全部或其 中的高 4 位或低 4 位来从寄存器组中选择源寄存器和目的寄存器。安排寄存器 选择器件 reg

22、_mux,为组合逻辑器件,用于输出选定寄存器的内容。 5. 节拍发生器:时序逻辑器件,作用是用多位触发器的输出信号的不同组 合状态,来标识每条指令的执行步骤。其功能相当于一个状态机。前文已述, 我们设计的节拍发生器共有 3 位触发器。在编码方面,遵循了这样的原则:从 一个状态变到下一个状态时,状态发生变化的触发器数目应尽量少。 6. 控制逻辑:组合逻辑器件,前面已提到,它根据指令内容(由 IR 提供) 和指令的执行步骤(由节拍发生器提供)及其他一些条件信号(标志寄存器输 出) ,形成并提供出计算机各部件当前时刻要用到的控制信号。根据前面所总结 的全部控制信号的意义、作用和数值,可以比较容易地写

23、出控制逻辑部件。 7. REG_OUT:对外输出寄存器内容的译码电路,组合逻辑器件,根据外部 输入的寄存器选择信号输出制定的寄存器内容(包括为了便于观察引出的内部 信号寄存器) 。 8. 时序设计:结构相关的处理和数据相关的处理。 整个 CPU 由以下几个模块组成: 1. 取指模块(IF):给出内存地址,读取指令并送入指令寄存器,为下一 级准备数据。 由于 PC 控制模块处于取指模块中,因此控制相关的检测也置于取指模块。 2. 译码模块(ID):读取寄存器值和指令译码。我们采取一次译码,逐级 传递的方式,译出后几级流水所需的控制信号和数据(如立即数等) ,在每次时 钟上升沿到来时送入下一级。实

24、际上,结构相关、控制相关、数据相关的检测 都可归入译码部分。考虑到“相关检测”涉及到的信号分属不同阶段以及整体 结构的清晰性,我们将“相关检测”独立出来。 3. 执行模块(Ex):完成算术逻辑运算、计算有效地址和提供数据通道。 4. 访存模块(Ma):选择地址线的数据来源和数据线的流向。访存和取指 在功能上是独立的,但 CPU 对外只有一条地址线和数据线的事实决定了访存和 取指是相互联系的。当执行 LOAD/STORE 指令时,地址线由 ALU 送入“访存段” 的值提供;取指时,则由 PC 提供。当写内存时,CPU 内部数据送数据线;当需 要读内存时,CPU 往数据线送高阻。 5. 回写模块(

25、Wb):选择回写数据源和根据写使能信号 wRegEn 将数据回 写到寄存器堆; 6. HazardDetectUnit 模块:检测结构相关; 7. ForwardingUnit 模块:检测数据相关。 其中由我完成取指模块、译码模块、执行模块。 4.2 分模块结构设计 1. 取指模块 主要完成两个任务,一是根据程序计数器 PC 里的指令地址从指令存储器 里读取指。另一个任务主要完成 PC+1 计算和下一条指令地址的猜测。对下一 条指令的猜测主要是假设分支条件不成立,猜测下一条指令地址是本指令地址 的下一地址,除了对下一条指令的猜测,还完成对上一次的猜测的确认。本指 令地址的确认主要是完成如果上一

26、条指令是分支指令时,如果分支条件不成立, 本指令地址猜测是正确,指令有效,继续执行,否则本指令无效,重新再取指。 2. 译码模块 译码阶段,是整个系统中的关键控制阶段,不但进行指令译码,从寄存器 堆中读取操作数,而且判断分支指令的跳转条件,计算跳转地址和处理数据相 关性问题。这一阶段主要器件有译码单元,寄存器堆,加法器,比较器和地址 选择器等。译码单元,可以说是核心控制单元,根据指令代码译码成各种控制 信号控制各个单元的控制,而且进行数据相关处理。 执行阶段主要完成指令的逻辑运算工作,ALU 根据操作控制码对所提供的 操作数进行相应的操作。读/写储存阶段主要完成存储器中数据的读取和写入, 是微

27、处理器系统中比较复杂的功能,在这主要完成微处理器内部数据存储器的 读写。 3. 执行模块 执行阶段主要完成指令的逻辑运算工作,ALU 根据操作控制码对所提供的 操作数进行相应的操作。读/写储存阶段主要完成存储器中数据的读取和写入, 是微处理器系统中比较复杂的功能,在这主要完成微处理器内部数据存储器的 读写。结构图如图 4-2 所示。 MUX ALUbIn 0 ALUSrc ExtTo17bitsExtTo17bits 或门异或与门 SARSHLSHRCX ALUOpr C,Z,V,S SetFlag FLAG ALUOut CX Clk IMM1 0 xFFFF tFlag MUX e_RAo

28、ut forwardA MUX e_RBout m_ALUOutw_RBdata forwardB ALUaIn 傍傍路路模模块块 五五级级流流水水CPU运运算算器器结结构构图图 Operation Mux 图表 4-2 五级执行模块结构图 5.5. 代码实现及测试 5.1 代码实现 使用 VHDL 语言语言编写内部模块,完成程序编译后下载到硬件平台上, 通过元件的例化配置,将内存模块和已有的 CPU 模块连接起来,构成一个完整 的计算机系统。 1. 取指模块 取指模块给出内存地址,读取指令并送入指令寄存器,为下一级准备数据。 该模块 RTL 图如图 5-1 所示: A15.0 B15.0 O

29、UT15.0 ADDER DQ PRE ENA CLR A7.0 B7.0 OUT EQUAL A7.0 B7.0 OUT EQUAL A7.0 B7.0 OUT EQUAL A7.0 B7.0 OUT EQUAL A7.0 B7.0 OUT EQUAL DQ PRE ENA CLR DQ PRE ENA CLR SEL2.0 DATA7.0 OUT MUX SEL2.0 DATA7.0 OUT MUX DQ PRE ENA CLR SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 Add0 16 h0001 - Equal0 8 h1

30、3 - Equal1 8 h14 - Equal2 8 h10 - Equal3 8 h11 - IR13.0 IR15.14 Mux1 PC15.0 PCIncSel0 PCnext15.0 s_selC0 s_selC1 s_selZ0 s_selZ1 IR15.0 16 h0003 - reset clk Z C tempC PCStall IFFlush e_setFlag2.0 PCPlusOffset15.0 OuterDB15.0 PC_addr15.0 d_PCInc115.0 d_IR15.0 Equal4 8 h12 - d_PCInc115.0reg0 tempZ Mux

31、0 图表 5-1 取指模块 RTL 图 PC 作为程序计数器,程序计数器控制关键代码如下: op = IR(15 downto 8);-操作码 with e_setFlag select ZZ = Zwhen flag_hold, tempZ when others; with e_setFlag select CC = Cwhen flag_hold, tempC when others; s_selZ = 1 WHEN( op=JRZ AND ZZ=1) -判断是否跳转 OR ( op=JRNZ AND ZZ=0) OR op=JR else 0; s_selC = 1 WHEN( op=

32、JRC AND CC=1) -判断是否跳转 OR ( op=JRNC AND CC=0) else 0; PCIncSel = 1 WHEN s_selZ=1 or s_selC=1 ELSE 0; s_PCInc1 = PC + x0001; WITH PCIncSel SELECT PCnext = s_PCInc1 WHEN 0, PCPlusOffset WHEN 1, s_PCInc1 when others; process(reset,clk,PCStall) begin if reset = 0 then PC = x0000; elsif FALLING_EDGE(clk)

33、and (PCStall=0) then PC = PCnext; end if; end process; 取指部分采用一个 process 来完成,关键代码如下: process(reset,clk,OuterDB,IFFlush) begin if reset=0 then IR IR IR = NOPIns; end case; d_PCInc1 ctrl:=d_IR(7 downto 0) when SUBB = ctrl:=d_IR(7 downto 0) when DEC = ctrl:=d_IR(7 downto 0) when INC = ctrl:=d_IR(7 downt

34、o 0) when ANDins = ctrl:=d_IR(7 downto 0) when CMP = ctrl:=d_IR(7 downto 0) when TEST = ctrl:=d_IR(7 downto 0) when ORins= ctrl:=d_IR(7 downto 0) when XORins = ctrl:=d_IR(7 downto 0) when SHLIns = ctrl:=d_IR(7 downto 0) when SHRIns = ctrl:=d_IR(7 downto 0) when SAR = ctrl:=d_IR(7 downto 0) when MOV

35、= ctrl:=d_IR(7 downto 0) when LOADH= ctrl:=11111111 imm ctrl:=11111111 imm ctrl:=d_IR(7 downto 0) when STORE = ctrl:=d_IR(7 downto 0) when JR|JRZ|JRNZ|JRC|JRNC = ctrl:=DoNothing; -若是 JR*指令,计算 offset,并向 Exe 插入 Bubble offset ctrl:=DoNothing; end case; SA = ctrl(21 downto 18); SB = ctrl(17 downto 14);

36、WrMem = ctrl(13 downto 12); wRegEn = ctrl(11); MemToReg= ctrl(10); ALUSrc = ctrl(9 downto 7); ALUOpr = ctrl(6 downto 3); SetFlag = ctrl(2 downto 0); end process; 流水控制信号的处理部分代码如下: process(reset,clk) begin if reset = 0 then e_wrMem = 10; - do nothing e_wRegEn = 0; elsif RISING_EDGE(clk) then e_SA = SA

37、; e_SB = SB; e_RAOut = RA; e_RBOut = RB; e_IMM = imm; e_ALUSrc = ALUSrc; e_ALUOpr = ALUOpr; e_SetFlag = SetFlag; e_wrMem = wrMem; e_wRegEn = wRegEn; e_destReg = SA; e_MemToReg = memToReg; end if; end process; 3. 执行模块 选择运算器 A,B 口数据来源的部分的关键代码如下: with forwardA select ALUaIn = e_RAOut when 00, e_ALUOut

38、when 10, w_WBdata when 01, e_RAOut when others; with forwardB select ALUbIn opR := 0opS := ZERO17; when selAB=opR := 0opS := 0 when selA1=opR := 0opS := 0 when sel0B=opR := ZERO17;opS := 0 when selAF=opR := 0opS := 1 when selAD=opR := 0opS := 0 when others = opR := ZERO17;opS := ZERO17; end case; ca

39、se e_ALUOpr is -选择 ALU 的运算 when aluAdd = ALUResult := opR + opS; tempV := (not opR(15)and(not opS(15)and ALUResult(15) or (opR(15)and opS(15)and (not ALUResult(15); when aluSub = ALUResult := opR - opS; tempV := ( opS(15)and(not opR(15)and (not ALUResult(15) or (NOT opS(15)and opR(15)and ALUResult(1

40、5); when aluAnd = ALUResult := opR and opS; when aluOr = ALUResult := opR or opS; when aluXor = ALUResult := opR xor opS; when aluShl = ALUResult(15 downto 1) := opR(14 downto 0); ALUResult(0) := 0;cx := opR(15); when aluShr = ALUResult(14 downto 0) := opR(15 downto 1); ALUResult(15) := 0;cx := opR(

41、0); when aluSar = ALUResult(14 downto 0) := opR(15 downto 1); ALUResult(15) := opR(15); cx := opR(0); when aluLOADH = ALUResult := opS(8 downto 0) when aluLOADL = ALUResult := 0 when others = null; end case; dout tempC := ALUResult(16); when aluShl|aluShr|aluSar = tempC := cx; when aluAnd|aluOr|aluX

42、or = tempC := 0; tempV:= 0; -逻辑运算, 状态位 C,Z 置零 when others = null; end case; i_tempC = tempC; if ALUResult = ZERO17 thentempZ := 1; else tempZ := 0;end if; i_tempZ (C,Z,V,S) C=tempC;Z = tempZ;V = tempV; S (C,Z,V,S) C=0; Z=0; V=0; S (C,Z,V,S)= tempFLAG; end case; end process; 修改状态寄存器部分的关键代码如下: WriteFl

43、ag:process(reset,clk) begin if reset = 0 then tempFlag = 0000; elsif RISING_EDGE(clk) then tempFlag = C end if; m_flag = tempFlag; end process; 传递给 Mem 部分的控制信号处理关键代码如下: process(reset,clk) begin if reset=0 then m_wrMem = 10; m_wRegEn = 0; elsif RISING_EDGE(clk) then m_SA = e_SA; m_ALUOut = dout; m_RB

44、data = ALUbIn; m_wRegEn = e_wRegEn; m_memToReg = e_memToReg; m_destReg = e_destReg; m_wrMem = e_wrMem; end if; end process; 5.2 程序测试 1Test1 8 位8 位乘法运算 ; 8bit x 8bit multiplier ; ; 测试指令:置立即数,AND, 条件跳转, 左移, 右移 ; MAIN: MOVI R0,25 ;被乘数 MOVI R1,6 ;乘数 MOVI R2,0 ;结果 MOVI R3,8 ;循环次数 LOOP: MOVI R4,1 AND R4,R1 JRZ 1F ;r4=0 时跳转 ADD R2,R0 ;否则加到部分积 1: SHL R0 SHR R1 DEC R3 ;r3 减 1 JRNZ LOOP HALT ;RESULT:R2=0X96 2.Test2 内存读写测试 ;MEMORY COPY ;内存读写测试 MAIN: MOVI R0,0XFF ;源地址 MOVI R1,0X1FF ;目的地址 MOVI R2,32 1: MOV R3,R0 ADD R3,R2 STORE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1