quartus-硬布线单周期16位CPU逻辑设计

quartus-硬布线单周期16位CPU逻辑设计

以下内容为该课程设计的实验报告,仍存在部分逻辑错误,仅提供思路,仅供参考。
工程文件:工程文件,可运行。

一、设计目的与目标

1.1 设计目的

1、掌握硬布线单周期CPU的工作原理、实现方法及其组成部件的原理和设计方法
2、认识和掌握指令的执行过程,掌握指令设计
3、熟练使用Quartus II工具软件进行软件设计与仿真,培养学生的分析和设计CPU的能力。
1.2 设计目标
  完成16位单周期CPU数据通路和线路图的设计,实现指令功能:ADD, LW, SW, BEQ, JMP, CLEAR

二、课程设计器材

2.1 硬件平台

本实验所需的硬件设备有:PC计算机和FPGA板–Cyclone III系列实验开发板。
2.2 软件平台
本实验所需的软件器材有:Windows操作系统、Quartus II15.0集成开发软件。

三、CPU逻辑设计总体方案

3.1指令模块

本实验是针对16位指令数据设计的,所以应当合理划分指令数据区间段的指令相应的功能,16位指令划分如下图所示。
在这里插入图片描述

该实验设计的指令共有6条,分别是ADD指令、LW指令、SW指令、JMP指令、BEQ指令和CL指令。
这6条指令的指令格式如下:
(1)ADD rs,rt,rd
0000 rs(3 位) rt(3 位) rd(3 位) reserved
完成功能:rs+rt→rd
(2)LW rt,offset base
0010 base(3位) rt(3 位) Offset(6位)
完成功能:6 位 offset 经符号扩展到 16 位,与寄存器 base 中值相加,结果作为地址,以此地址取字保存到寄存器 rt。
(3)SW rt,offset base
1010 base(3位) rt(3 位) Offset(6位)
完成功能:6 位 offset 经符号扩展到 16 位,与寄存器 base 中值相加,结果作为地址,寄存器rt的值保存到此内存地址。
(4)J target
1100 target (12位)
完成功能: 12 位地址经零扩展到 16 位成跳转的目标地址。
(5)BEQ rs,rt,rd
1011 rs(3 位) rt(3 位) Offset(6位)
完成功能:12位offset经符号扩展到16位,与PC+1相加,结果作为新的地址,若rs=rt,则PC置为新地址,完成跳转,反之,则顺序执行。
(6)CL rt
0101 rs(3位) rt(3位) reserved
完成功能:将目标寄存器rt中的值清零。

3.2 器件单元模块

在该实验中我们设计了9个控制信号,分别为RegDst、ALUSrcB、ALUOp、RegWrite、MemToReg、MemWrite、PCSource、Clear、Branch,它们的作用如下表所示。
在这里插入图片描述

该CPU中有多个单元设计,我们把总体设计拆分成多个相对独立的单元:寄存器组、控制器、存储器、ALU单元、PC、数据选择器、扩展单元,再对每部分器件单独设计。这些单元之间的简易数据通路和控制线路图如下。
在这里插入图片描述
从上图我们可以看出各单元之间的联系:通过PC来控制指令存储器中指令的读出,而控制器可以通过PCSource和Branch控制PC的值是否来自于扩展立即数,BEQ指令执行后的结果或是PC+1;数据存储器可以读数据或存数据,控制写存储器信号来自于控制器的MemWrite,地址来自于ALU计算得到的物理地址;写入寄存器堆的数可以来自数据存储器、ALU的运算结果或0,这由控制器的MemToReg和Clear共同决定,写入寄存器堆的地址可以是rs或rt,这由控制器的RegDst决定;ALU的运算操作数A直接来自寄存器堆的ReadData1,而操作数B来自于ReadData2或扩展后的偏移地址,这由控制器的ALUSrcB信号决定,ALU运算由ALUOp信号控制。
根据此逻辑设计方案,可以进行CPU的各模块详细设计。

四、模块详细设计

4.1指令设计模块

综合前述通过单周期CPU数据通路和控制线路图可以清楚看到每条指令的执行过程,根据指令码和控制信号之间的关系来设计控制器,指令与控制信号对应关系可如下表所示。
在这里插入图片描述

根据每条指令的指令码,可以得到所有控制信号的组合逻辑
在这里插入图片描述

将控制信号组合逻辑中的都用非门表示,+用或门表示,便可以得到每个控制信号的逻辑电路图,这里只展示ALUOP的逻辑电路图。
在这里插入图片描述

将每个控制信号组合成单个元件,在将单个元件组合成控制器,如下图所示
在这里插入图片描述
在这里插入图片描述

4.2 器件单元模块

CPU主要有6大模块:寄存器堆、控制器、存储器、PC计数器、数据选择器、扩展单元。CPU各模块地综合图如下图所示,可以看出每个模块的功能和联系,各模块间通过Bus Name命名一致达到数据传输效果。
在这里插入图片描述

4.2.1 寄存器堆

本次实验设计的位16位CPU,因此每个寄存器应由16个触发器组成
在这里插入图片描述

寄存器组作为数据保存的器件,当读取寄存器中的数据时,涉及读地址端口以及对应的输出数据端口,故应该有两个读地址端口,两个输出地址端口。当写入寄存器数据时,设计写信号、写地址以及写数据,故应该有一个写地址端口,一个数据准备端口以及一个写信号,同时数据的传送需要在一个时钟信号到来的上升沿操作,故应有一个时钟信号CLK,所以总共端口共有8个。寄存器堆详细设计图如下图所示。
在这里插入图片描述

因为我们设计的从寄存器取数的指令位数为3位,所以最多可寻8个寄存器,所以可看到图中示出了8个16位D寄存器的综合模块。
图中还有一个74138译码器,G1端为WE写信号,当要向寄存器存数时,应使写信号有效,同时给出3位需要写的地址,将要写入的数据存至译码生成对应的寄存器中。
同时图中还有2个8位数据选择器,主要是用于当读取寄存器数据时,给出读取寄存器的地址,对应8位数据选择器输出对应寄存器中的数据。
寄存器堆的Symbol如图所示。
在这里插入图片描述

4.2.2 存储器

数据存储器RAM有4个输入端和1个输出端,能够实现将数据写入存储器操作,需要有准备写入的数据,要写入的地址以及内存写操作控制信号,同时应有时钟信号控制,对应的输出端即从内存取出16位数据。数据存储器如下图所示。
在这里插入图片描述

指令存储器ROM有2个输入端和1个输出端,能够实现将指令数据从指令存储器中取出,输入端应有准备要取出指令的地址以及时钟信号,输出端即从指令存储器中取出的16位指令。指令存储器ROM如下图所示。
在这里插入图片描述

4.2.3 计数器

程序计数器是用于当每个时钟的上升沿到来后,PC计数器自增1,从指令存储器中取出对应增1的地址的指令数据,作为本轮运算的指令。
所以PC计数器模块应该由三部分组成:自增1的ALU单元、PC跳转数据选择器(主要用于实现JMP指令)以及暂存增1的指令数据的16位寄存器。寄存器的作用是实现同步,否则PC会不停自增,导致指令错误。
在这里插入图片描述

4.2.4 ADD单元

ADD单元有有3个输入端,分别是输入数据A、B端和控制信号ALUOp,和2个输出端,分别是A、B端加或减的结果以及z:判断结果是否为0
在这里插入图片描述
在这里插入图片描述

4.2.5 16位扩展

当执行LW指令时,基址中的数据和指令后8位数据符号扩展成16位数据相加,结果作为存储器的地址,从存储器取数。
在这里插入图片描述
在这里插入图片描述

当执行JMP指令时,由JMP指令的后12位进行0扩展成16位作为目标跳转地址。
在这里插入图片描述
在这里插入图片描述

4.2.6 数据选择器

数据选择器主要用于根据控制信号,来选择对应的数据端输入,在本次设计中用到4处数据选择器。
1、写入寄存器地址的数据选择器:根据MemToReg和Clear信号判断写入寄存器的数据是来自于ALU或是存储器或是0:当MemToReg为1且Clear为0时,CLEAR清零;当MemToReg为0且Clear为1时,数据存储器的数据;当两者都为0时,写入的是ALU的结果。具体设计如下图所示,采用3选1数据选择器。
在这里插入图片描述

2、写入寄存器地址的数据选择器:根据RegDst信号确定写入寄存器的地址是来自于指令数据的[5-3]位还是[8-6]
在这里插入图片描述

3、PC数据选择器:根据PCSource控制信号,判断PC计数器的下一条地址是来自于PC+1还是来自于的12位扩展16位目标地址或者BEQ跳转的地址。具体设计如下图所示,采用3选1数据选择器。
在这里插入图片描述

4、ALU操作数B选择器:根据ALUSrcB控制信号确定ALU单元的输入B端的数据来源,主要用于LW指令中,判断存储器地址是由寄存器的1端和2端相加得到还是由寄存器的1端和指令后6位扩展成16位相加得到。
在这里插入图片描述
5、BEQ跳转地址数据选择器:根据ALU判断两数是否相等(相等为0,不相等为1)为信号,判断数据是PC+1还是PC+1与6位扩展16位相加所得到的地址。
在这里插入图片描述

五、测试结果及分析

5.1 测试方案

在指令存储器中写入相关指令,分析指令得出程序执行后理论的实验结果,进行仿真模拟查看输出信号,输出数据是否与预期结果相符合,相符合则该实验设计完成,连接FPGA测试板,查看是否与仿真模拟结果相同,相同则连接成功。
5.2 测试结果及分析
指令存储器的地址与对应的值的关系如下图所示。
在这里插入图片描述

指令存储器的地址详细说明:
000 000:该地址对应的值的前4位功能操作码为0010,是LW指令。
000 001:该地址对应的值的前4位功能操作码为0000,是ADD指令。
000 010:该地址对应的值的前4位功能操作码为1010,是SW指令。
000 011:该地址对应的值的前4位功能操作码为1011,是BEQ指令。
000 100:该地址对应的值的前4位功能操作码为0000,是ADD指令。
000 101:该地址对应的值的前4位功能操作码为1100,是 JMP 指令。
000 110:该地址对应的值的前4位功能操作码为0101,是 CL 指令。
000 111:该地址对应的值的前4位功能操作码为1100,是 JMP 指令。
在程序执行后出现的 理论结果应为0→1→2→6→2→4 的循环
仿真模拟结果如下图所示
在这里插入图片描述
连接PIN脚,将该工程烧录至测试板,查看测试板的灯亮情况
在这里插入图片描述

  • 20
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值