单周期处理器
《数字逻辑与计算机组成》实验讲义-实验5
![《数字逻辑与计算机组成》实验讲义-实验5](https://img.taocdn.com/s3/m/61d3297c0a1c59eef8c75fbfc77da26924c5964f.png)
实验5:单周期处理器的控制器设计实验一、实验目的1、理解随机访问存储器RAM和只读存储器ROM的操作原理。
2、理解指令类型与指令格式之间的关系,掌握取指部件、指令解析和立即数扩展器的设计方法。
3、理解每条目标指令的功能和数据通路,掌握单周期处理器的控制器设计方法。
二、实验环境Logisim-ITA V2.16.1.0。
三、实验内容1、利用Logisim中的RAM组件进行数据读写操作实验。
Logisim中RAM的地址位宽最多可设置为24位,数据位宽最多可设置为32位。
在属性窗口的数据接口中有三种不同的工作模式。
若设置为“分离的加载和存储引脚”模式,则有两个数据端口分别连接输入数据和输出数据(如图1所示);否则,使用同一数据端口连接数据总线。
注意:当设置数据位宽为32位时,采用按字编址方式(32位),而不是采用按字节编址方式。
图1 采用分离加载和存储模式的32位数据读取实验图实验要求RAM组件的地址位宽设置为12位,数据接口模式设置为分离的加载和存储引脚模式。
实验过程与验证步骤如下:(1)设置数据位宽为32位,即可访问空间大小为16KB;连接必要的输入输出信号并选择合适的控制信号;从0地址处开始顺序写入以下两个32位的十六进制数据:0x4E4A5543、0x53657200;然后再读出所存储的数据。
(2)设置数据位宽为8位,即可访问空间大小为4KB;将输出数据端口连接到如图2所示的文本终端TTY;从0地址开始顺序写入以下八个字节的十六进制数据:4E4A554353657200;然后按字节为单位读出并输出到文本终端TTY,观察显示的内容。
图2 采用分离加载和存储模式的8位数据读取实验图(3)Logisim中RAM和ROM组件的数据输入还可以采用Logisim十六进制编辑器和直接读取二进制编码文件的方法实现。
把鼠标移到存储器组件上,点击鼠标右键,则弹出菜单框(如图3所示),选中“编辑存储内容”,则打开Logisim十六进制编辑器(如图4所示),可按照存储器设置的数据位宽,直接使用键盘输入数据;输入数据后,可点击保存按钮,把输入的数据保存到数据镜像文件(image)中。
计算机专业基础综合(中央处理器)模拟试卷4(题后含答案及解析)
![计算机专业基础综合(中央处理器)模拟试卷4(题后含答案及解析)](https://img.taocdn.com/s3/m/e3ca93b848d7c1c709a14589.png)
计算机专业基础综合(中央处理器)模拟试卷4(题后含答案及解析) 题型有:1. 单项选择题 2. 综合应用题单项选择题1-40小题,每小题2分,共80分。
下列每题给出的四个选项中,只有一个选项是最符合题目要求的。
1.通常所说的32位微处理器是指( )。
A.地址总线的宽度为32位B.处理的数据长度只能为32位C.CPU字长为32位D.通用寄存器数目为32个正确答案:C解析:通常所说的32位微处理器是指CPU字长为32位。
将运算器和控制器合称为中央处理器(CPU),在由超大规模集成电路构成的微型计算机中,往往将CPU制成一块芯片,称为微处理器。
CPU按照其处理信息的字长可以分为8位CPU、16位CPU、32位CPU、64位CPU等。
选项A、B、D均与微处理器的位数无关。
知识模块:中央处理器2.在微程序控制方式中,机器指令、微程序和微指令的关系是( )。
A.每一条机器指令由一条微指令来解释执行B.每一条机器指令由一段(或一个)微程序来解释执行C.一段机器指令组成的工作程序可由一条微指令来解释执行D.一条微指令由若干条机器指令组成正确答案:B解析:机器指令是由一段(或一个)微程序来解释执行的,一条微程序是由若干微指令构成的。
知识模块:中央处理器3.一个单周期处理器,各主要功能单元的操作时间为:指令存储器和数据存储器为0.3 ns,ALU为0.2 ns,寄存器文件为0.1 ns,则该CPU的时钟周期最少应该是( )。
A.0.4 nsB.0.3 nsC.0.2 nsD.1 ns正确答案:D解析:单周期处理器时钟周期取为“Load”指令的执行时间(最长),它等于读指令存储器(取指)的时间、读寄存器堆(取形式地址)的时间、ALU(计算有效地址)的时间、读数据存储器(取操作数)的时间以及写寄存器堆(将操作数写入目的寄存器)的时间之和,为1 ns。
知识模块:中央处理器4.微程序存放在( )。
A.主存中B.堆栈中C.只读存储器中D.磁盘中正确答案:C解析:微程序存放在控制存储器中,是只读存储器。
华中科技大学HUST类MIPS单周期微处理器设计实验报告
![华中科技大学HUST类MIPS单周期微处理器设计实验报告](https://img.taocdn.com/s3/m/bb9add228e9951e79a89273b.png)
类MIPS单周期微处理器设计实验报告专业:班级:学号:姓名:一、微处理器各模块设计各模块的框图结构如上图所示。
由图可知,该处理器包含指令存储器、数据存储器、寄存器组、ALU单元、符号数扩张、控制器、ALU控制译码以及多路复用器等。
图中还忽略了一个单元:时钟信号产生器,而且以上各个部件必须在时钟信号的控制下协调工作。
1.指令存储器的设计指令寄存器为ROM类型的存储器,为单一输出指令的存储器。
因此其对外的接口为clk、存储器地址输入信号(指令指针)以及数据输出信号(指令)。
(1)在IP wizard 中配置ROM,分配128个字的存储空间,字长为32位宽。
(2)选择输入具有地址寄存功能,只有当时钟上升沿有效时,才进行数据的输出。
(3)配置ROM内存空间的初始化COE文件。
最后单击Generate按钮生成IROM模块。
2.数据存储器的设计数据存储器为RAM类型的存储器,并且需要独立的读写控制信号。
因此其对外的接口输入信号为clk、we、datain、addr;输出信号为dataout。
数据存储器基本建立过程同ROM的建立。
3.寄存器组设计寄存器组是指令操作的主要对象,MIPS中一共有32个32位寄存器。
在指令的操作过程中需要区分Rs、Rt、Rd的地址和数据,并且Rd的数据只有在寄存器写信号有效时才能写入,因此该模块的输入为clk、RegWriteAddr、RegWriteData、RegWriteEn、RsAddr、RtAddr、reset;输出信号为RsData、RtData。
由于$0一直输出0,因此当RsAddr、RtAddr为0时,RsData以及RtData 必须输出0,否则输出相应地址寄存器的值。
另外,当RegWriteEn有效时,数据应该写入RegWriteAddr寄存器。
并且每次复位时所有寄存器都清零。
代码如下: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);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)beginif(!reset)beginif(regWriteEn==1)beginregs[regWriteAddr]=regWriteData;endendelsebeginfor(i=0;i<31;i=i+1)regs[i]=0;regs[31]=32'hffffffff;endendendmodule4.ALU设计在这个简单的MIPS指令集中,微处理器支持add、sub、and、or、slt运算指令,需要利用ALU单元实现运算,同时数据存储指令sw、lw也需要ALU单元计算存储器地址,条件跳转指令beq需要ALU来比较两个寄存器是否相等。
Project4 VerilogHDL完成单周期处理器开发(2013.12.2)
![Project4 VerilogHDL完成单周期处理器开发(2013.12.2)](https://img.taocdn.com/s3/m/ea7cb1223968011ca300915b.png)
一、 设计说明
1. 处理器应 MIPS-Lite3 指令集。 a) MIPS-Lite3={MIPS-Lite2,addi,addiu, slt,j,jal,jr}。 b) MIPS-Lite2 指令集:addu,subu,ori,lw,sw,beq,lui。 c) addi 可以不支持溢出。 2. 处理器为单周期设计。
Figure2 参考的 project 目录组织
b) 顶层设计文件命名为 mips.v。 c) 建议 datapath 中的每个 module 都由一个独立的 VerilogHDL 文件组成。 d) 建议所有 mux (包括不同位数、 不同端口数等) 都建模在一个 mux.v 中。 可以有多个 module。 6. code.txt 中存储的是指令码 a) 用 VerilogHDL 建模 IM 时,必须以读取文件的方式将 code.txt 中指令加 载至 IM 中。 b) code.txt 的格式如 Figure3 所示。每条指令占用 1 行,指令二进制码以文 本方式存储。
15. 详细说明你的测试程序原理及测试结果。 【WORD】 a) 应明确说明测试程序的测试期望,即应该得到怎样的运行结果。 b) 每条汇编指令都应该有注释。
五、 问答【WORD】
16. C 语言是一种弱类型程序设计语言。C 语言中不对计算结果溢出进行处理, 这意味着 C 语言要求程序员必须很清楚计算结果是否会导致溢出。因此,如 果仅仅支持 C 语言,MIPS 指令的所有计算指令均可以忽略溢出。 a) 请说明为什么在忽略溢出的前提下, addi 与 addiu 是等价的, add 与 addu 是等价的。 提示: 阅读 《MIPS32® Architecture For Programmers Volume II: The MIPS32® Instruction Set》中相关指令的 Operation 部分。
MIPS指令单周期CPU设计
![MIPS指令单周期CPU设计](https://img.taocdn.com/s3/m/168c338e51e79b8969022614.png)
Data memory
rd rs rt
Register File
PC
执行步骤(3/5)
instruction memory
ALU
MUX
+4
imm 2. Decode/ Register Read
1. Instruction Fetch
3. Execute 4. Memory 5. Register Write
– 将结果写入目的寄存器
需要保存的值
– PC、寄存器组、存储器
二、典型指令的数据通路
ADDU and SUBU – addu rd,rs,rt
31 op 6 bits 31 op 6 bits 26 rs 5 bits 26 rs 5 bits 21 rt 5 bits 21 rt 5 bits 16 immediate 16 bits 16 rd 5 bits 11 6 shamt 5 bits funct 6 bits 0 0
ALU
MUX
+4
imm 2. Decode/ Register Read
1. Instruction Fetch
3. Execute 4. Memory5. Register Write
Phase 1: Instruction Fetch (IF)
– Fetch 32-bit instruction from memory – Increment PC (PC = PC + 4)
Data memory
rd rs rt
Register File
PC
执行步骤(2/5)
instruction memory
ALU
MUX
单周期cpu课程设计
![单周期cpu课程设计](https://img.taocdn.com/s3/m/ac506a6f82c4bb4cf7ec4afe04a1b0717ed5b30a.png)
单周期cpu课程设计一、课程目标知识目标:1. 学生能理解单周期CPU的工作原理,掌握其内部结构及功能。
2. 学生能描述单周期CPU的指令执行过程,包括取指、译码、执行、访存、写回等阶段。
3. 学生能解释单周期CPU中时钟、指令和数据的关系,并分析其性能特点。
技能目标:1. 学生能运用所学知识,设计并实现一个简单的单周期CPU。
2. 学生能运用仿真软件对单周期CPU进行功能仿真,验证其正确性。
3. 学生能通过课程学习,培养自己的逻辑思维和问题解决能力。
情感态度价值观目标:1. 学生能对计算机硬件及CPU产生兴趣,激发学习热情。
2. 学生能认识到CPU在计算机系统中的核心地位,增强对计算机科学的尊重和热爱。
3. 学生能在团队协作中发挥积极作用,培养合作精神和沟通能力。
课程性质:本课程为计算机科学与技术专业核心课程,旨在让学生了解CPU的基本原理,掌握单周期CPU的设计方法。
学生特点:学生已经具备一定的数字逻辑电路基础,具有一定的编程能力和逻辑思维能力。
教学要求:结合学生特点,注重理论与实践相结合,引导学生通过课程学习,达到课程目标所规定的知识、技能和情感态度价值观要求。
在教学过程中,关注学生的个体差异,鼓励学生积极参与,培养其独立思考和解决问题的能力。
通过课程目标的分解,确保教学设计和评估的针对性和有效性。
二、教学内容1. 单周期CPU概述:介绍CPU的发展历程,单周期CPU的概念及其在计算机系统中的作用。
教材章节:第1章 计算机系统概述2. 单周期CPU内部结构:讲解CPU的内部组成部分,包括控制单元、算术逻辑单元(ALU)、寄存器组、程序计数器等。
教材章节:第2章 CPU内部结构3. 指令集与指令执行过程:分析指令集的设计,讲解单周期CPU指令执行过程中各阶段的任务和实现方法。
教材章节:第3章 指令集与指令执行4. 时序控制与性能分析:探讨时钟、指令和数据的关系,分析单周期CPU的性能特点。
教材章节:第4章 时序控制与性能分析5. 单周期CPU设计方法:介绍设计单周期CPU的步骤,包括电路设计、指令集设计、时序控制等。
Logisim完成MIPS单周期处理器开发实验报告
![Logisim完成MIPS单周期处理器开发实验报告](https://img.taocdn.com/s3/m/f3b13ff918e8b8f67c1cfad6195f312b3169eb1b.png)
Logisim完成MIPS单周期处理器开发实验报告Project3Logisim完成单周期处理器开发实验报告⼀.总体设计⼆.模块定义(1)IFU(2)GPR(3)ALU(4)EXT(5)DM(6)Controller四.控制器设计单周期真值表Func100000100010N/AOp000000000000001101100011000100001111add sub ori lw sw beq lui RegDst1100X X0 ALUSrc0011101 MemtoReg0001X X X RegWrite1111002 MemWrite0000100 nPC_sel0000010 ExtOp X X000X1ALUctr Add Subtract Or Add Add Subtract X五.测试要求16.测试程序lui$t0,0x0004#lui测试程序要实现:⽴即数0x0004加载⾄t0寄存器的⾼位lui$t1,0x0008#lui测试程序要实现:⽴即数0x0008加载⾄t1寄存器的⾼位ori$t3,$zero,0x00002000#ori测试程序要实现:zero寄存器中的内容与⽴即数0x00002000进⾏或运算,储存在t3寄存器中sw$t0,4($t3)#sw测试程序要实现:把t0寄存器中值(1Word),存储到t3的值再加上偏移量4,所指向的RAM中sw$t0,8($t3)#sw测试程序要实现:把t0寄存器中值(1Word),存储到t3的值再加上偏移量8,所指向的RAM中loop:add$t2,$t2,$t1#add测试程序要实现:t1寄存器中的值加上t2寄存器中的值后存到t2寄存器中lw$t4,4($t3)#lw测试程序要实现:把t3寄存器的值+4当作地址读取存储器中的值存⼊t4 lui$t5,0x0004#lui测试程序要实现:⽴即数0x0004加载⾄t5寄存器的⾼位sub$t7,$t6,$t5#sub测试程序要实现:t6寄存器中的值减去t5寄存器中的值后存到t7寄存器中add$t0,$t0,$t5#sub测试程序要实现:t0寄存器中的值减去t5寄存器中的值后存到t0寄存器中add$t6,$t6,$t0#add 测试程序要实现:t6寄存器中的值加上t0后存到t6寄存器中beq$t0,$t1,loop#beq测试程序要实现:判断t0的值和t1的值是否相等,相等转loopadd$t0,$t0,$t5#add测试程序要实现:t0寄存器中的值加上t5后存到t0寄存器中lui$v0,0x0001#lui测试程序要实现:⽴即数0x0001加载⾄v0寄存器的⾼位lui$v1,0x0002#lui测试程序要实现:⽴即数0x0002加载⾄v1寄存器的⾼位add$v0,$v0,$v1#add测试程序要实现:v0寄存器中的值加上v1后存到v0寄存器中add$v1,$v0,$v1#add测试程序要实现:v0寄存器中的值加上v1后存到v1寄存器中ori$a0,$v0,0xffff#ori测试程序要实现:v0寄存器中的内容与⽴即数0xffff进⾏或运算,储存在a0寄存器中sub$a1,$a0,0x0000ffff#sub测试程序要实现:a0寄存器中的值减去⽴即数0x0000ffff后存到a1寄存器中loop2:sub$a2,$v1,$v0#sub测试程序要实现:v1寄存器中的值减去v0中的值后存到a2寄存器中add$a1,$a2,$a1#add测试程序要实现:a2寄存器中的值加上a1后存到a1寄存器中beq$a1,$v1,loop2#beq测试程序要实现:判断a1的值和v1的值是否相等,相等转loop2机器码:3c0800043c090008340b2000ad680004014950208d6c00043c0d000401cd7822010d402001c870201109fff9010d40203c0200013c03000200431020004318203444ffff3c010*******ffff008128220062302200c52820 10a3fffdMARS模拟结果:Logism:GPR:DM:六、问答18.对于Figure5、Figure6中的与或阵列来说,1个3输⼊与门最终转化为2个2输⼊与门,1个4输⼊与门最终转化为3个2输⼊与门,依次类推。
(完整word版)32位单周期RISC处理器设计
![(完整word版)32位单周期RISC处理器设计](https://img.taocdn.com/s3/m/0b96c1376f1aff00bfd51e75.png)
第一章32 位单周期RISC处理器设计要设计一款处理器,首先要选择体系结构,本题选择的是RISC体系结构,因为它适合于流水线设计。
然后需要选择一个标准的指令集,本题选择的MIPS指令集并按照常规的五段流水的方式来实现流水线。
流水线的实现过程将在第二章介绍。
1.1目标处理器指令集与指令格式本题目标CPU以能实现部分MIPS指令为目标,具体指令如下表1:(slti)无条件跳跳转(jL)J转空操作空操作(nop)表1 目标CPU指令集1.2 从指令具体行为反推设计方案CPU要执行一条指令,不外乎需要完成以下几个过程:取指令,指令译码,将译码出的指令放到算术逻辑运算部件ALU上执行运算,根据ALU算得的访存地址进行访存和将访存的结果写回寄存器等。
当然,不同的指令类型(R、I、J)可能经过的过程稍有不同,即它们的数据通路有所不同,以下将具体介绍:1、R格式指令数据通路:1)从指令寄存器Instr MEM中取出指令,同时PC增值(即加1等待下个CLK到来);2.)寄存器单元rs1和rs2的内容从寄存器堆Reg File中读出;3.)ALU根据功能码Opcoder确定操作方式,对从寄存器堆读出的数据进行计算;4.)ALU运算结果被写入寄存器堆,由rd确定写入的寄存器堆存储单元地址。
图1 R指令数据通路2. I 指令(除lw、sw和分支指令)数据通路如图2:1.)从指令寄存器Instr Mem中取出指令,同时PC增值(即加1等待下个CLK到来);2.)寄存器单元rs1的内容从寄存器堆Reg File中读出;3.)ALU将从寄存器堆rs1单元中读出的数据与符号扩展后的指令低16位值相加;4.)ALU的运算结果被写入寄存器堆,由rt确定写入的寄存器堆存储单元地址。
图2 I 指令(除lw、sw和分支指令)数据通路3、Lw指令数据通路如图3:1.)从指令寄存器Instr Mem中取出指令,同时PC增值(即加1等待下个CLK到来);2.)寄存器单元rs1的内容从寄存器堆Reg File中读出;3.)ALU将从寄存器堆rs1单元中读出的数据与符号扩展后的指令低16位值相加;4.)将ALU的运算结果作为数据存贮器的地址读出相应单元的内容;5)把从数据存储单元取出的数据写入寄存器堆,由rt确定写入的寄存器存储单元地址。
mips单周期cpu课程设计
![mips单周期cpu课程设计](https://img.taocdn.com/s3/m/0c5a9d712bf90242a8956bec0975f46527d3a7e0.png)
mips单周期cpu课程设计一、课程目标知识目标:1. 掌握MIPS单周期CPU的基本结构和工作原理;2. 了解指令集、指令执行过程和指令周期;3. 学会分析并设计简单的MIPS指令;4. 理解CPU性能指标,如时钟频率、吞吐率等。
技能目标:1. 能够运用硬件描述语言(如Verilog)进行单周期CPU的设计与仿真;2. 能够独立编写简单的MIPS汇编程序,并在单周期CPU上运行;3. 能够分析单周期CPU的性能,并进行优化;4. 培养学生的团队合作能力和问题解决能力。
情感态度价值观目标:1. 培养学生对计算机组成原理和硬件设计的兴趣,激发学生的创新意识;2. 增强学生的工程素养,使其认识到工程实践在计算机科学领域的重要性;3. 培养学生严谨、细致、负责任的科学态度,提高学生的自主学习能力。
本课程针对高中年级学生,课程性质为实践性较强的硬件课程。
结合学生特点,课程目标注重理论与实践相结合,通过设计单周期CPU,使学生深入理解计算机硬件原理,提高实践能力。
在教学要求上,注重培养学生的团队合作精神,提高学生分析和解决问题的能力,为后续计算机组成原理及相关课程打下坚实基础。
通过本课程的学习,学生将能够独立完成单周期CPU的设计与仿真,具备一定的硬件编程能力。
二、教学内容1. 引言:介绍CPU在计算机系统中的作用,引出MIPS单周期CPU的概念及其重要性。
相关教材章节:第一章 计算机系统概述2. MIPS单周期CPU基本结构:讲解CPU的基本组成部分,包括寄存器组、控制单元、算术逻辑单元(ALU)、数据通路等。
相关教材章节:第二章 计算机组成原理3. 指令集与指令执行:分析MIPS指令集特点,讲解指令执行过程和指令周期。
相关教材章节:第三章 指令系统4. 硬件描述语言与单周期CPU设计:介绍Verilog硬件描述语言,通过实例讲解如何使用Verilog设计单周期CPU。
相关教材章节:第四章 硬件描述语言与数字电路设计5. 单周期CPU仿真与优化:指导学生进行单周期CPU的仿真,分析性能瓶颈,探讨优化方案。
【最新】CPU实验——单周期MIPS处理器设计
![【最新】CPU实验——单周期MIPS处理器设计](https://img.taocdn.com/s3/m/5fc72a1091c69ec3d5bbfd0a79563c1ec5dad7c1.png)
单周期MIPS处理器设计实验报告完成人:笪腾飞2012011263一、实验目的1、设计一个32位的单周期MIPS处理器,具备定时器、数码管等外设;2、编写一个编译器,可以将mips代码编译为二进制机器码;3、编写一个计算两个整数的最大公约数的汇编程序。
二、设计方案根据理论课所学的单周期MIPS处理器数据通路的知识,结合本次试验的具体要求,最终设计方案如下:1、系统时钟为了综合后能够在开发板上正确运行程序,我们决定采取50MHz的CPU时钟,因此编写了一个时钟分频模块,对开发板提供的100MHz时钟进行二分频,从而得到50MHz时钟。
2、PC产生模块原理图如下:如上图左半部分所示,多路选择器由一个always语句中的if…else if…else语句实现。
其中,将ALU中的加减法部分提取出来实现一个加法器,用于产生PC+4和ConBA两个PC来源。
将I型指令中的16位立即数左移两位后再符号位j m扩展成32位地址,与PC+4相加得到分支地址ConBA 。
将跳转指令中的26位目标地址左移两位后,与当前PC的高四位拼接得到跳转地址JT。
将第一个操作数寄存器中的值取出作为PC的一个输入,这是为了实现jr和jalr指令,从$Xp和$Ra寄存器中读取跳转地址。
ILLOP和XADR分别是发生中断和异常时的跳转地址。
下一指令地址的选择由PCSrc决定,而PCSrc是译码后由控制信号模块根据每条指令的操作码(opcode)和函数码(funct)产生。
3、译码模块原理图如上图右半部分所示,将PC作为ROM模块的地址输入,输出即为PC所对应的指令。
分别取出指令中的某些片段,得到$Rs,$Rt,$Rd,shamt,funct,16位立即数和26位跳转地址。
4、控制模块控制模块即控制信号产生模块,六位操作码OpCode,六位函数码[5:0] Funct,定时器中断信号irq和PC最高位PC31作为输入,输出为以下控制信号:(1) R型指令指示信号IsR,值为1表示当前指令为R型指令,否则非R型指令;(2) PC产生的选择信号[2:0] PCSrc,取值0,1,2,3,4及其它,分别选择下一指令不同的PC;(3) 目的寄存器选择信号[1:0]RegDst,被写入的寄存器有四种选择:$Rd,$Rt,$Ra,$Xp,分别由RegDst不同取值完成选择;(4) 写寄存器使能信号RegWr,值为1表示允许对寄存器进行写操作;(5) ALU第一个操作数选择信号ALUSrc1,值为1表示选择将移位量shamt 进行0扩展后作为输入,值为0表示将$Rs寄存器中的值作为输入;(6) ALU第一个操作数选择信号ALUSrc1,值为1表示选择将扩展后的32位立即数作为输入,值为0表示将$Rt寄存器中的值作为输入;(7) ALU运算控制信号[5:0] ALUFunc,作为ALU的输入选择不同的运算操作;(8) 有无符号数指示信号Sign,值为1表示有符号数,值为0表示无符号数;(9) 写存储器使能信号MemWr,值为1表示允许对存储器进行写操作;(10) 读存储器使能信号MemRd,值为1表示允许对存储器进行读操作;(11) 写寄存器值的选择信号[1:0] MemToReg,选择ALU结果,存储器读取结果和PC+4其中之一作为写入目的寄存器的值;(12) 符号位扩展指示信号EXTOp,值为1表示对16位立即数进行符号位扩展,值为0表示0扩展;(13) 立即数高位取指令指示信号LUOp,值为1表示当前指令为lui指令,选择将立即数载入高16位低位填0的32位立即数作为ALU输入,值为0表示将正常扩展后的32位立即数作为ALU输入;控制信号的具体产生过程此处略去,在控制信号说明文件中进行详述。
精品单周期CPU设计.docx
![精品单周期CPU设计.docx](https://img.taocdn.com/s3/m/888df28ad5bbfd0a79567391.png)
■=・NINGBO UNIVERSITY短学期综合实验报告实验名称:单周期CPU设计院系:信息科学与工程学院专业:计算机科学与技术组员: XXXXXXXXXXXXXXXXXXXXXX指导老师:XXXXXXX _____________二o—一年七月八日摘要中央处理器(CPU)是计算机取指令和执行指令的部件,它是由算术逻辑单元(ALU)、寄存器和控制器组成,简称处理器(或CPU), CPU 是计算机系统的核心部件,在各类信息终端中得到了广泛的应用。
处理器的设计及制造技术也是计算机技术的核心之一。
CPU设计的第一步应当根据指令系统来建立数据路径,再定义各个部件的控制信号,确定时钟周期,完成控制器的设计。
然后建立数据路径,进而可以进行数字设计、电路设计,最后完成物理实现。
而在本次试验中,我们研究的重点是数据路径的建立和控制器的实现。
一个机器的性能由三个关键因素决定:指令数、时钟周期,以及执行每条指令所需的时钟周期数(CPI)。
然而不论是时钟周期,还是每条指令所需的时钟周期数目,都是由处理器的实现情况决定的。
在本次试验中,我们构造了单周期的数据路径和组合逻辑实现的控制器。
本次试验屮,我们运用Quartus II 8.0软件设计出了一个拥有6 条指令的单周期CPU,并对它进行了简单的测试,最终完成了一个正确的单周期CPU的设计。
关键词:数据路径,控制器,控制信号,单周期AbstractCentral processing unit (CPU) is a computer instraction fetch and execution ofcomponents, it is an arithmetic logic unit (ALU), registers and a controller, referred to as the processor (or CPU), CPU is the core component of computer systems in all type information terminal has been widely used・Processor design and manufacturing technology is one of the core computer technology.The first step should be based on CPU design instraction to create a data path, and then define the various components of the control signals to determine the clock cycle, the controller design. Then set up a data path, and then can be digital design, circuit design, physical implementation finalized. In this experiment, the focus of our research is to establish the data path and controller implementation.The performance of a machine consists of three key factors: the number of instructions, clock cycles to execute each instruction as well as the required number of clock cycles (CPI). Whether it be a clock cycle, each instruction or the number of clock cycles required are determined by the achievement of the processor. In this study, we constructed single-cycle data path and the combinational logic to achieve the controller.This experiment, we use Quartiis II 8.0 software to design a single-cycle instruction with 6 CPU, and it conducted a simple test, thefinal completion of a proper single-cycle CPU design.Keywords:Data path, Controller, Control Signal,Single-cycle实验内容:1、通过实验的学习,基本熟悉quarters II软件的使用,并能熟练运用试验所需元件。
eetop单周期与多周期的比较指令流水线经典
![eetop单周期与多周期的比较指令流水线经典](https://img.taocdn.com/s3/m/0effb021a517866fb84ae45c3b3567ec112ddc76.png)
ALUop 3
RegDst
ALUSrc
:
RegDst
Rt Rd 1 Mux 0
Rd Imm16
Rs Rt RegWr 5 5 5
<5:0> ALU func Control
ALUctr 3
busW
Rw Ra Rb 32 32-bit
busA 32
Zero MemWr
ALU Mux Extender
Pipeline.12
2024年6月10日星期一
含R-type和 Load 指令的流水线
Cycle 1 Cycle 2 Cycle 3 Cycle 4 Cycle 5 Cycle 6 Cycle 7 Cycle 8 Cycle 9
Clock
R-type Ifetch Reg/Dec Exec Wr
阶段5 Wr
° Ifetch (取指) : 从指令存储器取指令并计算PC+4 (用到哪些部件?)
指令存储器、Adder
° Reg/Dec (取数和译码) : 存放器取数,同时对指令进行译码 (用到哪些部件?)
存放器堆读口、指令译码器
° Exec (执行) : 计算内存单元地址 (用到哪些部件?)
扩展器、ALU
New Value
Register File Write Time
RegWr busA busB Address busW
Pipeline.4
Old Value
New Value
2
Old Value
Delay through Extender & Mux Old Value
Register File Access Time New Value
中山大学计算机组成原理实验单周期CPU设计
![中山大学计算机组成原理实验单周期CPU设计](https://img.taocdn.com/s3/m/d659f07a001ca300a6c30c22590102020740f22f.png)
中⼭⼤学计算机组成原理实验单周期CPU设计《计算机组成原理实验》实验报告(实验三)学院名称:数据科学与计算机学院专业(班级):学⽣姓名:学号:时间:2019 年11 ⽉8 ⽇成绩:实验三:单周期CPU设计与实现⼀.实验⽬的(1) 掌握单周期CPU数据通路图的构成、原理及其设计⽅法;(2) 掌握单周期CPU的实现⽅法,代码实现⽅法;(3) 认识和掌握指令与CPU的关系;(4) 掌握测试单周期CPU的⽅法。
⼆.实验内容设计⼀个单周期CPU,该CPU⾄少能实现以下指令功能操作。
指令与格式如下:==> 算术运算指令加“加”运算。
加“加”运算。
==> 逻辑运算指令加“与”运算。
功能:GPR[rt] ←GPR[rs] or zero_extend(immediate)。
==>移位指令==>⽐较指令==> 存储器读/写指令==> 分⽀指令else pc ←pc + 4特别说明:offset是从PC+4地址开始和转移到的指令之间指令条数。
offset符号扩展之后左移2位再相加。
为什么要左移2位?由于跳转到的指令地址肯定是4的倍数(每条指令占4个字节),最低两位是“00”,因此将offset放进指令码中的时候,是右移了2位的,也就是以上说的“指令之间指令条数”。
else pc ←pc + 4(16)bltz rs, offsetelse pc ←pc + 4。
==>跳转指令(17)j addr说明:由于MIPS32的指令代码长度占4个字节,所以指令地址⼆进制数最低2位均为0,将指令地址放进指令代码中时,可省掉!这样,除了最⾼6位操作码外,还有26位可⽤于存放地址,事实上,可存放28位地址,剩下最⾼4位由pc+4最⾼4位拼接上。
==> 停机指令功能:停机;不改变PC的值,PC保持不变。
三.实验原理单周期CPU指的是⼀条指令的执⾏在⼀个时钟周期内完成,然后开始下⼀条指令的执⾏,即⼀条指令⽤⼀个时钟周期完成。
计算机组成原理-第11章 MIPS处理器设计(单周期、多周期)1 [兼容模式]
![计算机组成原理-第11章 MIPS处理器设计(单周期、多周期)1 [兼容模式]](https://img.taocdn.com/s3/m/72c9d32567ec102de2bd89a3.png)
llxx@
12
A conceptual view – computational instructions
• Both source
operands and
Read data 2
Register File
Datapath Control Points
RegWrite (“write enable” control point)
寄存器号 Instruction
R-type指令的执行
Read
register 1
Read
Read
data 1
register 2
– beq为相对寻址:以npc为基准,指令中的 target为16位,进行32位有符号扩展后左移两 位(补“00”,字对准)。
– jump为pseudodirect:指令中的target为26位, 而PC为32位。将target左移2位拼装在PC的低 28位上,PC高4位保持不变。
J-type
op(6 bits) rs(5 bits) rt(5 bits) op(6 bits)
data
16 Sign 32 extend
I-type
MemRead
R-type
llxx@
22
Instruction
条件转移beq
PC + 4 from instruction datapath
Add Sum
Branch target
Read
register 1
Read
Read
rt:ld的目的,sw的源
P3-Logisim开发单周期CPU
![P3-Logisim开发单周期CPU](https://img.taocdn.com/s3/m/96b0be1a79563c1ec5da711e.png)
九、
开发与调试技巧
26. 对于每条指令,请认真阅读《MIPS32® Architecture For Programmers Volume II: The MIPS32® Instruction Set》 ! a) 如果测试时,你无法清楚的解释所要求的指令,测试成绩将减一档! 27. 上的《M_G06B2830: 数字系统设计工具集》中有关 于 logisim 使用的课程,请学习之。 28. Figure1 中 Tunnel 的用途是将具有相同 name 的 tunnel 连接在一起。Tunnel 可以避免将图画的很乱。 29. Figure1 中 Probe 的用途是显示被 probed 信号的值,便于调试。 30. Figure1 中 Splitter 的用途是从某组信号中提取其中部分信号。例如,IFU 输 出 32 位指令, 需要提取高 6 位(OpCode)和低 6 位(Funct)分别输入 controller。 a) splitter 是有位序的! 但字号太小, 需要放大设计图(界面左下有比例设置)。 b) 建议高位永远在上,低位永远在下 31. 如果你对于 logisim 内置的某个部件的端口不明白,请: a) 仔细阅读 HelpLibrary Refrence 关于该部件的描述。 b) 放大 logisim 显示比例直至能清晰看到代表部件的各个端口的圆点, 然后 将鼠标停留相应的圆点上,就可以读取端口具体信息。 32. 建议先在 MARS 中编写测试程序并调试通过。 a) 注意 MARS 中的“SettingsMemory Configuration”只能配置指令存储器 起始地址为 0 地址,而不能将指令存储器和数据存储器的起始地址均配
定顺序取值令还是转移取值令。 (2) 模块接口
信号名 IfBeq 方向 I 描述 当前指令是否为 beq 指令标志。 1:当前指令为 beq 0:当前指令非 beq ALU 计算结果为 0 标志。 1:计算结果为 0 0:计算结果非 0 时钟信号 复位信号。 1:复位 0:无效 32 位 MIPS 指令
单周期cpu设计代码解读
![单周期cpu设计代码解读](https://img.taocdn.com/s3/m/61ae3e94ed3a87c24028915f804d2b160b4e86e4.png)
单周期cpu设计代码解读⽬录写在前⾯欢迎转载,转载请说明出处。
单周期cpu设计代码讲解概念回顾⼀、电⼦计算机的部件分为:中央处理器(cpu)、内部存储器(Memory)、输⼊/输出(I/O)设备,以及连接它们的总线(Bus)。
下图为图⽰,注意⾊块的区分。
⼆、cpu⼜包括控制器(Controller)和数据通路(Data Path)。
下图为图⽰,注意⾊块区分。
三、控制器分为主控(Main Control)和局控(Local Control或ALU Control)。
将⼆进制指令输⼊控制器,⽣成控制信号,该过程称为译码。
控制信号控制数据通路⼯作。
且不同的指定对应不同的控制信号。
下图为在控制器中译码的逻辑⽰意图:下图为在控制器中译码的物理⽰意图:讲解⼀下从逻辑图到物理图的转换:1. ⾸先由主控解析op指令,如果发现该指令为“000000”则表⽰该指令是R指令,输出中间信号R-Type为1,否则为0;如果发现该指令是其他值,则按照逻辑图,为RegDst等信号赋相应的值;2. 中间信号R-Type起到⼆路选择的作⽤,如图。
3. 中间信号ALUop,在R-Type为0(选择0路)时,直接通过局控,输出成为ALUctr信号,对应上⾯逻辑图的最后⼀⾏后5列;在R-Type为1时,局控起作⽤。
4. 局控解析R指令的func部分,输出对应指令的ALUctr信号。
四、数据通路:是包括运算器、寄存器组、存储器(⾼速缓存)、多路选择器等等在内的元件的有结构的组合。
如下图所⽰:【数据通路各部分的讲解将结合代码完成】Verilog代码讲解在代码讲解之前有必要放⼏张图:shift.v/*移位*//*输⼊⼀个数,返回移位之后的结果*//*输⼊d(待移的数)、sa(移动的位数)、right(移动⽅向)、arith(空位补全⽅式)*//*输出sh(移位后的结果)*/module shift (d,sa,right,arith,sh);input [31:0] d;input [4:0] sa;input right,arith;output [31:0] sh;reg [31:0] sh;// 组合逻辑always @* beginif (!right) begin // right为逻辑0时,左移sh = d << sa;end else if (!arith) begin // right为逻辑1,且arith为逻辑0时,右移、0补空sh = d >> sa;end else begin // 右移、1补空sh = $signed(d) >>> sa;endendendmodulescinstmem.v/*从ROM(只读存储器)读数据*//*输⼊⽬标数据在ROM中的地址a*//*输出地址对应的数据inst*/module scinstmem (a,inst);input [31:0] a;output [31:0] inst;wire [31:0] rom [0:31]; // 定义32个32位的存储器ROM// 想ROM中写⼊⼀组指令,指令对应的汇编含义见⾏注释assign rom[5'h00] = 32'h3c010000; // (00) main: lui r1,0assign rom[5'h01] = 32'h34240050; // (04) ori r4,r1,80assign rom[5'h02] = 32'h20050004; // (08) addi r5,r0, 4assign rom[5'h03] = 32'h0c000018; // (0c)call: jal sumassign rom[5'h04] = 32'hac820000; // (10) sw r2,0(r4)assign rom[5'h05] = 32'h8c890000; // (14) lw r9, 0(r4)assign rom[5'h06] = 32'h01244022; // (18) sub r8, r9. r4assign rom[5'h07] = 32'h20050003; // (lc) addi r5, r0. 3assign rom[5'h08] = 32'h20a5ffff; // (20) loop2: addi r5, r5, -1assign rom[5'h09] = 32'h34a8ffff; // (24) ori r8, r5, 0xffffassign rom[5'h0A] = 32'h39085555; // (28) xori r8. r8, 0x5555assign rom[5'h0B] = 32'h2009ffff; // (2c) addi r9, rO, -1assign rom[5'h0C] = 32'h312affff; // (30) andi rlO, r9, 0xffffassign rom[5'h0D] = 32'h01493025; // (34) or r6. rlO, r9assign rom[5'h0E] = 32'h01494026; // (38) xor r8, rlO, r9assign rom[5'h0F] = 32'h01463824; // (3c) and r7, rlO, r6assign rom[5'h10] = 32'h10a00001; // (40) beq r5, r0, shiftassign rom[5'h11] = 32'h08000008; // (44) j loop2assign rom[5'h12] = 32'h2005ffff; // (48) shift: addi r5. r0, -1assign rom[5'h13] = 32'h000543c0; // (4c) sll r8. r5. 15assign rom[5'h14] = 32'h00084400; // (50) sll r8, r8, 16assign rom[5'h15] = 32'h00084403; // (54) sra r8, r8, 16assign rom[5'h16] = 32'h000843c2; // (58) srl r8. r8. 15assign rom[5'h17] = 32'h08000017; // (5c) finish: j finishassign rom[5'h18] = 32'h00004020; // (60) sum: add r8, r0, r0assign rom[5'h19] = 32'h8c890000; // (64) loop: lw r9, (r4)assign rom[5'h1A] = 32'h20840004; // (68) addi r4, r4, 4assign rom[5'h1B] = 32'h01094020; // (6c) add r8, r8, r9assign rom[5'h1C] = 32'h20a5ffff; // (70) addi r5, r5, -1assign rom[5'h1D] = 32'h14a0fffb; // (74) bne rS, r0, loopassign rom[5'h1E] = 32'h00081000; // (78) sll r2f r8f 0assign rom[5'h1F] = 32'h03e00008; // (7c) jr r31// 将地址对应的数据放⼊instassign inst = rom[a[6:2]];endmodulescdatamem.v/*将数据写⼊RAM中(随机存取存储器)的指定位置*//*输⼊待写数据datain、⽬标地址addr;写使能信号we;时钟信号clk、inclk、outclk*//*输出将被覆盖的数据dataout*/module scdatamem (clk,dataout,datain,addr,we,inclk,outclk);input [31:0] datain;input [31:0] addr ;input clk, we, inclk, outclk;output [31:0] dataout;reg [31:0] ram [0:31]; // 定义32个32位RAM// 把将被覆盖的数据放⼊dataoutassign dataout =ram[addr[6:2]];// 时序逻辑,clk的上升沿触发always @ (posedge clk) beginif (we) ram[addr[6:2]] = datain; // 如果写使能信号we为1,将数据写⼊⽬标地址end// 为RAM赋值,这⼀步不是必要的,只是欲运⾏的⾃定义程序的需要。
单周期CPU——verilog语言实现
![单周期CPU——verilog语言实现](https://img.taocdn.com/s3/m/c1925f432a160b4e767f5acfa1c7aa00b52a9d8d.png)
单周期CPU——verilog语⾔实现⼀. 实验内容设计⼀个单周期CPU,要求:1. 实现MIPS的20条指令2. 在该CPU上实现斐波那契函数计算机每执⾏⼀条指令都可分为三个阶段进⾏。
即取指令(IF)——>分析指令(ID)——>执⾏指令(EXE)取指令:根据程序计数器PC中的指令地址,从存储器中取出⼀条指令,同时,根据控制信号,决定选择某个来源的指令地址作为下⼀条指令的地址。
分析指令:对取指令操作中得到的指令进⾏分析并译码,确定这条指令需要完成的操作,从⽽产⽣相应的操作控制信号,⽤于驱动执⾏状态中的各种操作。
执⾏指令:根据指令译码得到的操作控制信号,具体地执⾏指令动作。
⼆. 20条指令的情况R指令I指令J指令三. 取指令(IF)的相关模块代码//PCmodule PC(input [31:0] next_addr,input rst,input clk,output reg [31:0] addr);always @(posedge clk)beginif(rst==1'b1)beginaddr<=next_addr;endelsebeginaddr<=32'b0;endendinitial$monitor($time,,"PC:addr=%h",addr);endmodule//ROMmodule rom(input [31:0] addr,output [31:0] data);reg[31:0] romdata;always @(*)case(addr[31:2])4'h0:romdata=32'b10001100000000110000000000100000; //lw $0,$3,32 *4'h1:romdata=32'b00110100000100000000000000000010; //ori $0,$16,2 *4'h2:romdata=32'b00000000000000111000100000100101; //or $0,$3,$17 * 4'h3:romdata=32'b00110100000100110000000000000001; //ori $0,$19,1 *4'h4:romdata=32'b00110100000001000000000000000001; //ori $0,$4,1 *4'h5:romdata=32'b00010010001100110000000000001011; //beq $17,$19,11 * 4'h6:romdata=32'b00000000000001000100000000100101; //or $0,$4,$8 *4'h7:romdata=32'b00100010011100110000000000000001; //addi $19,$19,1 * 4'h8:romdata=32'b00110100000001000000000000000001; //ori $0,$4,1 *4'h9:romdata=32'b00010010001100110000000000000111; //beq $17,$19,7 * 4'ha:romdata=32'b00000000000001000100100000100101; //or $0,$4,$9 * 4'hb:romdata=32'b00000001000010010010000000100000; //add $8,$9,$4 * 4'hc:romdata=32'b00000000000010010100000000100101; //or $0,$9,$8 *4'hd:romdata=32'b00000000000001000100100000100101; //or $0,$4,$9 *4'he:romdata=32'b00100010000100000000000000000001; //addi $16,$16,1 * 4'hf:romdata=32'b00010110000100011111111111111011; //bne $16,$17,-5 * default:romdata=32'b10101100000001000000000000010000; //sw $0,$4,16 endcaseassign data=romdata;initial$monitor($time,,"rom:romdata=%h",romdata);endmodule//Selectormodule selector(input [31:0] addr0,input [31:0] addr1,input [31:0] addr2,input [31:0] addr3,input [1:0] pcsource,output reg [31:0] next_addr);always @(*)begincase(pcsource)2'b00:beginnext_addr=addr0;end2'b01:beginnext_addr=addr1; //bne,beqend2'b10:beginnext_addr=addr2; //jend2'b11:beginnext_addr=addr3; //jal,jrendendcaseendinitial$monitor($time,,"selector: pcsource=%h, next_addr=%h",pcsource,next_addr); endmodule四. 所使⽤的控制信号pcindex: pc值的来源ram2reg: 是否将数据从RAM写⼊到寄存器中,=1为是,否则为否ramWE: 是否写内存,=1为是,否则为否aluOP: ALU的运算类型regWE: 是否写寄存器,=1为是,否则为否imm: 是否产⽣⽴即数,=1为是,否则为否shift: 是否移位,=1为是,否则为否isrt: ⽬的寄存器地址,=1选择rt,否则选择rdsign_ext: ⽴即数拓展,=1为符号数拓展,否则为零拓展jal: 是否调⽤⼦程序跳转,=1为是,否则为否五. 各指令对应产⽣的控制信号pcindex ram2reg ramWE aluOP regWE imm shift isrt sign_ext jal add 0 0 0 0001 1 0 00 00 sub 0 0 0 0010 1 0 0 0 0 0 and 0 0 0 00111 0 00 0 0 or0 0 0 0100 1 0 0 0 0 0 xor0 0 0 01011 0 0 0 0 0 sll0 0 0 01101 0 1 1 0 0 srl0 0 0 01111 0 1 1 0 0 sra0 0 0 1000 1 0 1 1 0 0 jr10 0 0 0 0 0 0 0 0 0 addi0 0 0 00011 1 0 1 1 0 andi0 0 0 0011 1 1 0 1 0 0 ori0 0 0 01001 1 0 1 0 0 xori0 0 0 01011 1 0 1 0 0 lw0 1 0 0001 1 1 0 1 1 0 sw 0 0 1 000101 0 1 1 0 beq00/01 0 0 00100 0 0 0 1 0 bne00/01 0 0 0010 0 0 0 0 1 0 lui 0 0 0 100111 0 1 0 0 j 11 0 0 00 0 0 0 0 0 jal 11 0 0 01 0 0 0 0 1六. 分析指令(ID)相关模块代码//IDmodule ID(input [31:0] instrument,output reg [5:0] opcode,output reg [5:0] func,output reg [4:0] rs,output reg [4:0] rt,output reg [4:0] rd,output reg [4:0] sa,output reg [15:0] immediate,output reg [25:0] addr);always @(*)beginopcode=instrument[31:26];rs=5'b0;rt=5'b0;rd=5'b0;sa=5'b0;immediate=16'b0;addr=25'b0;case(opcode)6'b000000: //R类型beginfunc=instrument[5:0];sa=instrument[10:6];rd=instrument[15:11];rt=instrument[20:16];rs=instrument[25:21];end6'b001000,6'b001100,6'b001101,6'b001110,6'b100011,6'b101011,6'b000100,6'b000101,6'b001111: beginimmediate=instrument[15:0];rt=instrument[20:16];rs=instrument[25:21];end6'b000010,6'b000011:beginaddr=instrument[25:0];enddefault: rs=5'b00000;endcaseendendmodule//CUmodule CU(input [5:0] opcode,input [5:0] func,input z,output reg [1:0] pcindex,output reg ram2reg,output reg ramWE,output reg [3:0] aluOP,output reg regWE,output reg imm,output reg shift,output reg isrt,output reg sign_ext,output reg jal);always @(*)begin//设置默认值shift=1'b0;ram2reg=1'b0;ramWE=1'b0;regWE=1'b0;imm=1'b0;isrt=1'b0;sign_ext=1'b0;pcindex=2'b00;aluOP=4'b0000;jal=1'b0;case(opcode)//R指令6'b000000:begincase(func)6'b100000: //add指令beginaluOP=4'b0001;regWE=1'b1;end6'b100010: //sub指令beginaluOP=4'b0010;regWE=1'b1;end6'b100100: //and指令beginaluOP=4'b0011;regWE=1'b1;end6'b100101: //or指令beginaluOP=4'b0100;regWE=1'b1;end6'b100110: //xor指令beginaluOP=4'b0101;regWE=1'b1;end6'b000000: //sll指令beginaluOP=4'b0110; regWE=1'b1;shift=1'b1;isrt=1'b1;end6'b000010: //srl指令beginaluOP=4'b0111; regWE=1'b1;shift=1'b1;isrt=1'b1;end6'b000011: //sra指令beginaluOP=4'b1000; regWE=1'b1;shift=1'b1;isrt=1'b1;end6'b001000: //jr指令beginpcindex=2'b10;endendcaseend//I指令6'b001000: //addi指令beginaluOP=4'b0001;imm=1'b1;regWE=1'b1;sign_ext=1'b1;isrt=1'b1;end6'b001100: //andi指令beginaluOP=4'b0011;imm=1'b1;regWE=1'b1;isrt=1'b1;end6'b001101: //ori指令beginaluOP=4'b0100;imm=1'b1;regWE=1'b1;isrt=1'b1;end6'b001110: //xori指令beginaluOP=4'b0101;imm=1'b1;regWE=1'b1;isrt=1'b1;end6'b100011: //lw指令beginram2reg=1'b1;aluOP=4'b0001;imm=1'b1;regWE=1'b1;sign_ext=1'b1;isrt=1'b1;end6'b101011: //sw指令beginramWE=1'b1;aluOP=4'b0001;imm=1'b1;sign_ext=1'b1;isrt=1'b1;end6'b000100: //beq指令beginaluOP=4'b0010;sign_ext=1'b1;if(z==1'b1)beginpcindex=2'b01;endend6'b000101: //bne指令beginaluOP=4'b0010;sign_ext=1'b1;if(z==1'b0)beginpcindex=2'b01;endend6'b001111: //lui指令beginregWE=1'b1;imm=1'b1;isrt=1'b1;aluOP=4'b1001;end//J指令6'b000010: //j指令beginpcindex=2'b11;end6'b000011: //jal指令beginjal=1'b1;regWE=1'b1;pcindex=2'b11;endendcaseendinitial$monitor($time,,"CU:imm=%b,op=%h, isrt=%h, pcindex=%h, regWE=%h, shift=%h, ram2reg=%h, ramWE=%h ",imm,aluOP,isrt,pcindex,regWE,shift,ram2reg,ramWE); endmodule七. 总体电路图⼋. 执⾏指令(EXE)相关模块的代码//selector_5module selector_5(input [4:0] a,input [4:0] b,input choice,output [4:0] f);assign f=(choice==1'b0)?a:b;initial$monitor($time,,"selector_5: a=%h, b=%h, f=%h",a,b,f);endmodule//selector_32module selector_32(input [31:0] a,input [31:0] b,input choice,output [31:0] f);assign f=(choice==1'b0)?a:b;initial$monitor($time,,"selector_32: f=%h",f);endmodule//ext_immmodule ext_imm(input [15:0] immediate,input sign_ext,output [31:0] imm);//sign_ext为1时,有符号拓展;为0时,0拓展assign imm=(sign_ext==0)?{{16{1'b0}},immediate}:{{16{immediate[15]}},immediate}; initial$monitor($time,,"ext_imm: imm=%h",imm);endmodule//alu_add_4module alu_add_4(input [31:0] a,output [31:0] f);assign f=a+32'b0100;initial$monitor($time,,"alu_add_4:f=%h",f);endmodule//registersmodule registers(input clk,input oc,input [4:0] raddr1,input [4:0] raddr2,input [4:0] waddr,input [31:0] wdata,input we,output reg [31:0] rdata1,output reg [31:0] rdata2);reg[31:0] regts[1:31];always @(*)beginif(oc==1'b1)beginrdata1=32'bz;endelse if(raddr1==5'b00000)beginrdata1=32'b0;endelsebeginrdata1=regts[raddr1];$monitor($time,,"Read R %d data1=%d",raddr1,rdata1); endalways @(*)beginif(oc==1'b1)beginrdata2=32'bz;endelse if(raddr2==5'b00000)beginrdata2=32'b0;endelsebeginrdata2=regts[raddr2];end$monitor($time,,"Read R %d data2=%d",raddr2,rdata2); endalways @(posedge clk)begin#1if((we==1'b1)&&(waddr!=5'b00000))beginregts[waddr]<=wdata;$monitor($time,,"write %h to data=%d",waddr,wdata);endendendmodule//isimmmodule isimm(input [31:0] rt,input [31:0] immediate,input imm,output [31:0] b);assign b=imm?immediate:rt;initial$monitor($time,,"isimm:b=%h",b);endmodule//ALUmodule alu(input [31:0] a,input [31:0] b,input [3:0] op,output [31:0] f,output z);reg [31:0]result;always@(*)begincase(op)4'b0000:result=32'b0;4'b0001:result=a+b;4'b0010:result=a-b;4'b0011:result=a&b;4'b0100:result=a|b;4'b0101:result=a^b;4'b0110:result=b<<a;4'b0111:result=b>>a;4'b1000:result=$signed(b)>>>a;4'b1001:result={b,{16{1'b0}}};default:result=32'b0;endcaseendassign f=result;assign z=~(|result);initial$monitor($time,,"alu:a:%h,b:%h,op:%h,",a,b,op);initial$monitor($time,,"alu:f:%h,z:%b",f,z);endmodulemodule IOManager(input [5:0] addr,input [31:0] din,output [31:0] dout,input we,input clk,input [3:0] switch,output reg[31:0] displaydata);reg [31:0] indata,outdata;wire [31:0] ramdout;wire ramWE;wire enable;assign enable=(|addr[5:4]);ram dram(addr[3:0],din,clk,enable,ramWE,ramdout);assign dout=(addr[5]==1'b1)?{{28{1'b0}},switch}:ramdout;assign ramWE=we&(~addr[4]);always @(posedge clk)beginif((addr[4]==1'b1)&&we)displaydata<=din;endinitial$monitor($time,,"IOM: addr=%h, din=%h, dout=%h",addr,din,dout); initial$monitor($time,,"IOM: switch=%h, displaydata=%h",switch,displaydata); endmodule//rammodule ram(input [3:0] addr,input [31:0] wdata,input clk,input ce,input we1,output reg[31:0] rdata);reg [31:0] ram[0:30];always @(*)beginif(ce==1'b0)beginrdata=ram[addr];endendalways @(posedge clk)begin#1if((ce==1'b0)&&(we1==1'b1))beginram[addr]<=wdata;endendinitial$monitor($time,,"ram: ram=%h,rdata=%h",ram[addr],rdata); endmodule//leftmodule left(input [31:0] a,output [31:0] b);assign b=a<<2;endmodule//alu_add_bmodule alu_add_b(input [31:0] addr,input [31:0] immediate,output [31:0] f);assign f=addr+immediate;initial$monitor($time,,"alu_add_b: addr=%h, immediate=%h, f=%h ",addr,immediate,f); endmodule//ext_addermodule ext_adder(input [25:0] address,output [27:0] f);assign f={address,{2{1'b0}}};initial$monitor($time,,"ext_addr: address=%h, f=%h ",address,f);endmodule//mixaddrmodule mixAddr(input [31:0] addr,input [27:0] address,output [31:0] f);assign f={{addr[31:28]},address};initial$monitor($time,,"mixAddr: addr=%h, address=%h, f=%h",addr,address,f);endmodule九. TOP⽂件代码1module top(2input clk,3input rst,4input [4:0] n,5output [31:0] result6 );78wire [31:0] next_addr;9wire [31:0] addr,addr0,addr1,addr2,addr3;10wire [31:0] immediate;11wire [27:0] fAddress;12wire [31:0] instrument;13wire [5:0] opcode,func;14wire [4:0] rs,rt,rd,sa;15wire [15:0] imm;16wire [25:0] address;17wire z;18wire [1:0] pcindex;19wire ram2reg,ramWE,regWE,isimm,shift,isrt,sign_ext,jal;20wire [3:0] aluOP;21wire [4:0] waddr;22wire [4:0] tmp_waddr;23wire [4:0] regs31=5'b11111;24wire [31:0] wdata,rdata1,rdata2,f,tmp_f;25wire oc=1'b0;26wire [31:0] a,b;27wire [31:0] dout;28wire [31:0] lImmediate;29wire [31:0] fsa;3031 PC myPC(next_addr,rst,clk,addr);32 rom myRom(addr,instrument);33 ID myID(instrument,opcode,func,rs,rt,rd,sa,imm,address);34 CU myCU(opcode,func,z,pcindex,ram2reg,ramWE,aluOP,regWE,isimm,shift,isrt,sign_ext,jal);35 ext_imm myExtImm(imm,sign_ext,immediate);36 selector_5 mySelector5_1(rd,rt,isrt,tmp_waddr); //⽬的寄存器是否rt37 selector_5 mySelector5_2(tmp_waddr,regs31,jal,waddr); //是否调⽤⼦程序调转wa38 alu_add_4 myAdd4(addr,addr0);39 selector_32 mySelector32_1(f,addr0,jal,wdata); //是否调⽤⼦程序调转wd40 registers myRegs(clk,oc,rs,rt,waddr,wdata,regWE,rdata1,rdata2);41 isimm myIsImm(rdata2,immediate,isimm,b);42assign fsa={{27{1'b0}},sa};43 selector_32 mySelector32_2(rdata1,fsa,shift,a); //选择sa和rs数据44 alu myAlu(a,b,aluOP,tmp_f,z);45 IOManager myIOM(tmp_f,rdata2,dout,ramWE,clk,n,result);46 selector_32 mySelector32_3(tmp_f,dout,ram2reg,f); //是否将数据从ram中写⼊reg47 left myLeft(immediate,lImmediate);48 alu_add_b myAddb(addr0,lImmediate,addr1);49 ext_adder myExtAddr(address,fAddress);50 mixAddr myMixAddr(addr,fAddress,addr3);51 selector mySelector(addr0,addr1,rdata1,addr3,pcindex,next_addr);525354initial55 $monitor($time,,"top: n=%h, result=%h",n,result);5657endmodule。
基于FPGA的MIPS单周期处理器的实现
![基于FPGA的MIPS单周期处理器的实现](https://img.taocdn.com/s3/m/085dfb35657d27284b73f242336c1eb91a3733a5.png)
基于FPGA的MIPS单周期处理器的实现作者:***来源:《电脑知识与技术》2021年第19期摘要:在MIPS CPU設计原理的基础上,通过Verilog硬件描述语言编程、使用Xilinx FPGA开发板的调试和仿真工具Vivado,实现基于FPGA的MIPS单周期处理器。
最终下载到Nexys4-DDR平台上,通过ChipScope工具抓取运行过程中产生的波形进行验证。
关键词:MIPS;硬件描述语言 ; Vivado ;单周期处理器中图分类号:TP311 文献标识码:A文章编号:1009-3044(2021)19-0005-04本文旨在使读者理解和掌握基于FPGA的MIPS单周期处理器的设计和实现。
我们要在了解MIPS CPU设计原理的基础上,掌握Verilog硬件描述语言编程、Xilinx FPGA开发板(Nexys4-DDR)的调试和仿真工具(Vivado 2014.4)。
过程大致分为用Vivado设计套件创建工程、编写 Verilog 代码、仿真测试和下载验证等四部分。
1 用Vivado设计套件创建工程1.1 关于Vivado设计套件Vivado设计套件是FPGA厂商赛灵思Xilinx公司2012年发布的集成设计环境,以提升生产力、缩短产品上市时间、实现可编程系统集成等目标。
Vivado设计套件可实现FPGA部分的设计和开发,管脚和时序的约束,编译和仿真,实现RTL 到比特流的设计流程。
包括高度集成的设计环境和新一代从系统级到IC级的工具,全新的系统级设计的中心思想是基于知识产权(IP)核的设计,Vivado工具把各类可编程技术结合在一起,能够扩展多达1亿个等效ASIC门的设计。
这些均建立在共享的可扩展数据模型和通用调试环境基础上,可以让用户更快地实现设计收敛。
1.2 新工程的创建和设置打开 Vivado设计套件(本文使用的是Vivado 2014.4)新建工程,输入工程名和存储路径如图1所示。
华中科技大学HUST类MIPS单周期微处理器设计实验报告
![华中科技大学HUST类MIPS单周期微处理器设计实验报告](https://img.taocdn.com/s3/m/18924ec327284b73f342507c.png)
类MIPS单周期微处理器设计实验报告|专业:班级::学号:姓名:一、(二、微处理器各模块设计各模块的框图结构如上图所示。
由图可知,该处理器包含指令存储器、数据存储器、寄存器组、ALU单元、符号数扩张、控制器、ALU控制译码以及多路复用器等。
图中还忽略了一个单元:时钟信号产生器,而且以上各个部件必须在时钟信号的控制下协调工作。
1.指令存储器的设计指令寄存器为ROM类型的存储器,为单一输出指令的存储器。
因此其对外的接口为clk、存储器地址输入信号(指令指针)以及数据输出信号(指令)。
(1)在IP wizard 中配置ROM,分配128个字的存储空间,字长为32位宽。
(2)选择输入具有地址寄存功能,只有当时钟上升沿有效时,才进行数据的输出。
…(3)配置ROM内存空间的初始化COE文件。
最后单击Generate按钮生成IROM模块。
2.数据存储器的设计数据存储器为RAM类型的存储器,并且需要独立的读写控制信号。
因此其对外的接口输入信号为clk、we、datain、addr;输出信号为dataout。
数据存储器基本建立过程同ROM的建立。
3.寄存器组设计《寄存器组是指令操作的主要对象,MIPS中一共有32个32位寄存器。
在指令的操作过程中需要区分Rs、Rt、Rd的地址和数据,并且Rd的数据只有在寄存器写信号有效时才能写入,因此该模块的输入为clk、RegWriteAddr、RegWriteData、RegWriteEn、RsAddr、RtAddr、reset;输出信号为RsData、RtData。
由于$0一直输出0,因此当RsAddr、RtAddr为0时,RsData以及RtData 必须输出0,否则输出相应地址寄存器的值。
另外,当RegWriteEn有效时,数据应该写入RegWriteAddr寄存器。
并且每次复位时所有寄存器都清零。
代码如下: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);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)beginif(!reset)begin|if(regWriteEn==1)beginregs[regWriteAddr]=regWriteData;endendelsebeginfor(i=0;i<31;i=i+1)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八单周期处理器的实现
实验目的:
进一步理解数据通路、控制通路等基本概念
掌握处理器中控制器的基本设计方法
进一步理解单周期处理器以及多周期处理器的工作原理和设计思路实验要求:
设计和实现一个单周期处理器(60%)
可执行至少7条MIPS指令,add、sub、ori、lw、sw、beq、j
编写测试程序的二进制代码,测试实现的电路
撰写实验报告,dead line:5.19
设计和实现一个多周期处理器(40%)
Dead line:6.6。
实验报告:
(1)实验过程
1 控制器的设计与实现
控制器的功能
根据当前指令,生成处理器内部各部件所需要的控制信号
控制器的输入输出
输入:op[5:0],func[5:0]
输出:RegDst,ALUSrc,MemtoReg,RegWrite,MemWrite,Branch,Jump,ExtOp,ALUctr[2:0]
图表1 主控的设计
图表2 ALUCTR的设计
图表3 控制器的封装
2 ALU的设计与实现
ALU的功能
根据控制信号ALUctr[2:0],将输入端口的两个32位的数据进行加、减、与、或操作,并判断结果是否为0
ALU的输入输出
输入:A[31:0],B[31:0],ALUctr[2:0]
输出:OUT[31:0],Zero
ALU的实现
将运算器实验中实现的加减法扩展为32位
增加32位与、或功能
增加结果判零电路
根据ALUctr[2:0]信号确定ALU的输出
图表4 加法器的设计与封装
(由于上一个实验已做成ALU,这里不再赘述加法器的制作)
根据ADD/SUB信号判断实现加法或是减法,并且设置Zero
项输出,用作Beq指令的判定依据
图表5 加减法器的设计
图表6 ALU的封装
三寄存器文件的设计与实现
寄存器文件的功能
寄存器读:根据Rs,Rt的值读出相应寄存器的值,Rs对应
BusA,Rt对应BusB。
用多路选择器实现寄存器数据的选择。
寄存器写:当RegWR=1时,clk上升沿,将busW的值写入
Rw对应的寄存器。
用译码器实现寄存器的实现。
寄存器文件的输入输出
输入:Rs,Rt,Rw,RegWr,busW,clk
输出:BusA,BusB
寄存器文件的实现
使用Memory库中的register元件搭建
图表7 寄存器文件的实现
四立即数扩展部件的设计与实现
立即数扩展部件的功能
根据控制信号Extop的值,将十六位的立即数进行符号位扩展(Extop = 1)或者无符号扩展(Extop = 0)
立即数扩展部件的输入输出
输入:imm16,Extop
输出:imm32
立即数扩展部件的实现
当Extop = 1,并且imm16的高位为1时,imm32的高16为全为1 否则,imm32的高16位全为0。
因此立即数的高位与ExtOp信号做“与”操作,当且仅当结果为一时做逻辑扩展。
图表8 位扩展的实现
五取指部件以及指令存储器的设计与实现
取指部件的功能
根据当前PC及当前指令,计算下一PC
使用当前PC到指令存储器取指令
取指部件的输入输出
输入:Jump,Branch,Zero,Imm32,CLK
输出:Instruction[31:0]
取指部件的实现
当前指令为普通指令时,PC=PC+4
当前指令为beq指令时,若Zero=1,则PC = PC + 4 +SignExt[imm16];否则PC=PC+4
当前指令为j指令时,PC={PC<31:28>,target<25:0> ,“00”}
数据在取指传输通路中为30位,当其进入PC时,扩展为32位,但RAM地址只有24位,考虑地址输入到本实验中指令数目较少,只取数据的低二十四位作为RAM地址输入
图表9 取指部件的实现
六处理器的封装
七处理器的执行
第一条指令执行一号寄存器加二号寄存器的值,以3+7为例。
并将
结果存入三号寄存器。
第二条指令将三号寄存器的值存入数据存储器的九号单元
第三条指令将数据存储器九号单元的数据存入四号寄存器
第四条
11。