hnu 数字电路 实验5 CPU大综合

一、设计目的
完整、连贯地运用《数字逻辑》所学到的知识,熟练掌握 EDA 工具基本使用方法,为学习好后续《计算机原理》课程做铺垫。

二、设计内容
① 按照给定的数据通路、数据格式和指令系统,使用 EDA 工具设计一台用硬连线逻
辑控制的简易计算机;
② 要求灵活运用各方面知识,使得所设计的计算机具有较佳的性能;
③ 对所设计计算机的性能指标进行分析,整理出设计报告。

三、详细设计
3.1设计的整体架构
模型机的基本结构和整体框架大致如下面三张图所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.2各模块的具体实现
1.寄存器组+ALU+移位逻辑
① 寄存器组
设计寄存器组,包括寄存器组的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
clk为时钟信号,WE为写入使能,RA和WA分别为对应源和目的的地址,i为从总线上输入到寄存器组的8位信号,S,D分别为寄存器组的源口输出和目的口输出。

功能设计实现部分如下图:
在这里插入图片描述
功能设计实现部分如上图,A,B,C信号分别为A,B,C三个寄存器,用于储存中间信号。
当时钟处于下降沿并且WE信号为‘0’时(WE信号为逆逻辑信号,低电平时有效),根据WA信号,在A,B,C三个寄存器中选择对应的寄存器存储总线来的输入i(WA=“00”选择A寄存器,WA=“01”选择B寄存器,WA=“10”选择C寄存器);其余时候,A,B,C寄存器内值不变。
S,D口输出不受时钟沿控制,换句话说,S口D口随时有数据输出。根据RA信号,在A,B,C三个寄存器中选择对应的寄存器内的值,从S口输出(RA=“00”输出A,RA=“01”输出B,RA=“10”或“11”输出C);根据WA信号,在A,B,C三个寄存器中选择对应的寄存器内的值,从D口输出(WA=“00”输出A,WA=“01”输出B,WA=“10”或“11”输出C)。

功能仿真如下图所示:
在这里插入图片描述
在这里插入图片描述
从波形仿真来看,在时钟下降沿且WE=‘0’时,根据输入i和WA信号,在A,B,C寄存器中分别储存了00000001,00000010,00000011的值,在后续的读取操作中,当RA=’00’时,S口输出A寄存器中的00000001,;当RA=’01’时,S口输出B寄存器中的00000010,;当RA=’10’时,S口输出C寄存器中的00000011,;同理,D口也受WA控制输出对应寄存器中的值。
可见,寄存器组可以完成预计的指令。

② ALU
设计ALU,包括ALU的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
M=1表示ALU进行逻辑运算操作,包括或运算、非运算;输入s1位指令的高四位,用于区分ALU发生的不同函数操作;S,D分别接收来自寄存器组S口、D口输送来的信号;T为经过函数发生器后的八位输出信号;cf用于存储进位位,zf用于记录输出是否为0值,若输出为0则zf值为1,反之zf为0。

功能设计实现部分如下图:
在这里插入图片描述
功能设计实现部分如上图,trans1,trans2信号分别为D口输入、S口输入值的九位信号(最高位为进位位)。
当M=‘1’时,进行逻辑运算。如果指令的高四位s1=”1011”,进行或运算,s1=“0101”,进行非运算,此时cf和zf的值不变。
当M=‘0’时,进行算术运算。如果指令的高四位s1=”1001”,进行’+’运算,进位位存储在cf中,若计算结果为0,则zf=1,否则zf=0;指令的高四位s1=”0110”,进行’-’运算,借位位存储在cf中,若计算结果为0,则zf=1,否则zf=0;指令的高四位s1=”1111”,进行MOVE操作,此时直接将S口的输入输出即可,zf,cf值均为0;指令的高四位s1=”1010”,进行移位操作,此时直接将S口的输入输出到移位逻辑即可,zf,cf值均为0;

功能仿真如下图所示:
在这里插入图片描述
在这里插入图片描述
从波形仿真来看,M=0,sl=1001,进行加法运算:T=S+D=15+63=78,此时无进位,进位位cf=0;T不为0,zf=0;T=S+D=0+0=0,此时无进位,进位位cf=0;T为0,zf=1;T=S+D=64+249=57(+266),此时进位位cf=1;T不为0,zf=0。
M=0,sl=0110,进行减法运算:T=S-D=26-15=11,此时无借位,借位位cf=0;T不为0,zf=0;T=S-D=0-1=0,因为采用转化为补码运算,此时有借位,cf=1;T为0,zf=1;T=S-D=15-26=(-)11,此时借位位cf=1;T不为0,zf=0。
M=1,sl=1011,进行或逻辑运算。T=S OR D=12(00001100) OR 19(00010011)=31(00011111);M=1,sl=0101,进行非逻辑运算。T=NOT D=NOT 63(00111111)=192(11000000)。
M=1,sl=1111,输出S,T=S=27;M=1,sl=1010,输出D,T=D=77。
可见,ALU可以完成预计的指令。

③ 移位逻辑
设计移位逻辑,包括移位逻辑的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
Fbus,flbus,frbus分别控制移位逻辑的直通、左移位和右移位;a为ALU到移位逻辑的输入;cf存储左移或者右移时移位最大的那一个信号值;w为移位逻辑的八位数出。

功能设计实现部分如下图:
在这里插入图片描述
功能设计实现部分如上图,fbus=’1’时,直通,输出w=a,cf为0;flbus=’1’时,进行左移操作,同时cf储存最高位;frbus=’1’时,进行右移操作,同时cf储存最低位。

功能仿真如下图所示:
在这里插入图片描述
从波形仿真来看,fbus=1,flbus=frbus=0,a向量11110000直达通过移位模块,输出w为11110000,此时cf保持原值不变;flbus=1,fbus=frbus=0,a向量11110000左移一位,输出w为11100001,并将第一位的移位数值1传给cf;frbus=1,fbus=flbus=0,a向量11110000右移一位,输出w为01111000,并将最后一位的移位数值0传给cf。
可见,移位逻辑可以完成预计的指令。

2.PC+多路选择器+RAM
① PC
设计ALU,包括ALU的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
clk为时钟信号,LD_PC,IN_PC分别控制PC的加载和累加;a为总线对PC的输入,c为PC对多路选择器的输出。

功能设计实现部分如下图:
在这里插入图片描述
功能设计实现部分如上图,trans信号为PC的初始默认值。
时钟下降沿时,如果IN_PC=‘1’ 并且 LD_PC=‘0’,PC进行自加1;如果IN_PC=‘0’ 并且 LD_PC='1,PC加载a输入;其他情况时,PC值不变。
当时钟不处于下降沿的其他时间,PC值不变。

功能仿真如下图所示:
在这里插入图片描述
从波形仿真来看:
处于时钟下降沿,IN_PC=1,LD_PC=0,对c进行自加操作,c=00000000+00000001=00000001;
处于时钟下降沿,IN_PC=0,LD_PC=1,对c进行传输a值操作,c=a=10101010;
处于时钟下降沿,IN_PC=1,LD_PC=0,对c进行自加操作,c=10101010+00000001=10101011;
处于时钟下降沿,IN_PC=1,LD_PC=0,对c进行自加操作,c=10101011+00000001=10101100;
处于时钟下降沿,IN_PC=0,LD_PC=1,对c进行传输a值操作,c=a=10101010;
处于时钟下降沿,IN_PC=0,LD_PC=1,对c进行传输a值操作,c=a=10101010。

可见,PC可以完成预计的指令。

② 多路选择器
设计多路选择器,包括多路选择器的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
x,y,z分别接收来自PC、S口、D口的输入信号;s为WADD选择器的选择输入值,通过s来控制选择哪组数据;d为多路选择器的选择输出。

功能设计实现部分如下图:
在这里插入图片描述
功能设计实现部分如上图,当s=”00”时,d口输出来自PC的x信号;当s=”01”时,d口输出来自S口的y信号;当s=”10”时,d口输出来自D口的z信号;其余以后多路选择器不输出信号,即输出高阻”ZZZZZZZZ”。

功能仿真如下图所示:
在这里插入图片描述
从波形仿真来看,s=00,输出d=x=1;s=01,输出d=y=2;s=10,输出d=z=3;其余时间无输入,对应输出高阻。

可见,多路选择器可以完成预计的指令。

③ RAM
设计RAM,包括RAM的接口设计、功能实现、功能仿真。
其中,接口设计和功能设计实现如下图:
在这里插入图片描述
功能仿真如下图所示:
在这里插入图片描述
从波形仿真来看:
时钟信号处于上升沿,DL=1,XL=0,进行读取操作,RAM从目的地址[0]处读取数据,从输出口输出,DATAOUT=[0]=0;
时钟信号处于上升沿,DL=1,XL=0,进行读取操作,RAM从目的地址[1]处读取数据,从输出口输出,DATAOUT=[1]=1;
时钟信号处于上升沿,DL=0,XL=1,进行写入操作,RAM从将输入DATAIN写入目的地址[1]处,[1]=10,此时输出DATAOUT=[1]=10;
时钟信号处于上升沿,DL=1,XL=0,进行读取操作,RAM从目的地址[1]处读取数据,从输出口输出,DATAOUT=[1]=10;;
其余时间,当DL=XL=0时,输出DATAOUT=Z为高阻。
可见,RAM可以完成预计的指令。

3.指令译码器+指令寄存器
① 指令译码器
设计指令译码器,包括指令译码器的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
EN为指令译码器的使能信号;IR为来自总线的数据输入;MOVA,MOVB,MOVC,ADD,SUE,OR0,NOT0,RSR,RSL,JMP,JZ,JC,IN0,OUT0,NOP,HEAL为对应的指令操作。

功能设计实现部分如下图:
在这里插入图片描述
功能设计实现部分如上图,对应指令系统表,选择相应的指令。
在这里插入图片描述
功能仿真如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从波形仿真来看:
输入为11111101,查表可知对应指令为MOVA,此时MOVA为1,其余为0;
输入为11110110,查表可知对应指令为MOVB,此时MOVB为1,其余为0;
输入为11110111,查表可知对应指令为MOVC,此时MOVC为1,其余为0;
输入为10011010,查表可知对应指令为ADD,此时ADD为1,其余为0;
输入为01100110,查表可知对应指令为SUE,此时SUE为1,其余为0;
输入为10110000,查表可知对应指令为OR0,此时OR0为1,其余为0;
输入为01011000,查表可知对应指令为NOT0,此时NOT0为1,其余为0;
输入为10101000,查表可知对应指令为RSR,此时RSR为1,其余为0;
输入为10101011,查表可知对应指令为TSL,此时TSL为1,其余为0;
输入为00110000,查表可知对应指令为JMP,此时JMP为1,其余为0;
输入为00110001,查表可知对应指令为JZ,此时JZ为1,其余为0;
输入为00110010,查表可知对应指令为JC,此时JC为1,其余为0;
输入为00101000,查表可知对应指令为IN0,此时IN0为1,其余为0;
输入为01000000,查表可知对应指令为OUT0,此时OUT0为1,其余为0;
输入为01110000,查表可知对应指令为NOF,此时NOP为1,其余为0;
输入为10000000,查表可知对应指令为HALT,此时HALT为1,其余为0。
可见,指令译码器可以完成预计的指令。

② 指令寄存器
设计指令寄存器,包括指令寄存器的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
clock为时钟信号,ld为指令寄存器的使能信号;input为指令译码器的输入,output为指令寄存器的对应输出。

功能设计实现部分如下图:
在这里插入图片描述
功能设计实现部分如上图,当时钟处于下降沿并切使能信号ld=’1’时,指令寄存器让信号进入;否则,在其他时间指令保持原值。
可见,指令寄存器可以完成预计的指令。

4.SM
设计SM,包括SM的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
SM_EN为指令译码器的使能信号;clk为时钟信号;z为SM的输出。

功能设计实现部分如下图:
在这里插入图片描述
当时钟处于下降沿,并且使能信号为1时,SM值取反;否则,在其他情况下SM保持不变。

5.CF
设计CF,包括CF的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
EN为CF的使能信号;clk为时钟信号;x为上一次cf的值;cf为CF的输出。

功能设计实现部分如下图:
在这里插入图片描述
当时钟信号处于下降沿,并且使能信号为1时,CF加载行数值,否则保持不变。
6.ZF
设计SM,包括SM的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
在这里插入图片描述
EN为指令译码器的使能信号;clk为时钟信号;zf为SM的输出。
功能设计实现部分如下图:
在这里插入图片描述
当时钟信号处于下降沿,并且使能信号为1时,CF加载行数值,否则保持不变。

7.控制逻辑生成
设计控制逻辑生成,包括控制逻辑生成的接口设计、功能实现、功能仿真。
其中,接口设计如下图:
在这里插入图片描述
MOVA,MOVB,MOVC,ADD,SUB,OR0,NOT0,RSR,RSL,JMP,JZ,JC,IN0,OUT0,NOP,HALT,SM,CF,ZF,IR为对应的指令输入,RAA,RWBA,WE,ALU_S,M,F_BUS,FR_BUS,FL_BUS,LD_PC,IN_PC,MADD,XL,DL,LD_IR,CF_EN,ZF_EN,IN_EN,OUT_EN,SM_EN为对应指令的使能信号。
功能设计实现部分如下图:
在这里插入图片描述
功能仿真如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从波形仿真来看:
输入为11110110,查表可知对应指令为MOVB,此时MOVB为1,其余为0;
输入为11111101,查表可知对应指令为MOVA,此时MOVA为1,其余为0;
输入为11110111,查表可知对应指令为MOVC,此时MOVC为1,其余为0;
输入为10011010,查表可知对应指令为ADD,此时ADD为1,其余为0;
输入为01100110,查表可知对应指令为SUE,此时SUE为1,其余为0;
输入为10110000,查表可知对应指令为OR0,此时OR0为1,其余为0;
输入为01011000,查表可知对应指令为NOT0,此时NOT0为1,其余为0;
输入为10101000,查表可知对应指令为RSR,此时RSR为1,其余为0;
输入为10101011,查表可知对应指令为TSL,此时TSL为1,其余为0;
输入为00110000,查表可知对应指令为JMP,此时JMP为1,其余为0;
输入为00110001,查表可知对应指令为JZ,此时JZ为1,其余为0;
输入为00110010,查表可知对应指令为JC,此时JC为1,其余为0;
输入为00101000,查表可知对应指令为IN0,此时IN0为1,其余为0;
输入为01000000,查表可知对应指令为OUT0,此时OUT0为1;
输入为01110000,查表可知对应指令为NOF,此时NOP为1,其余为0;
输入为10000000,查表可知对应指令为HALT,此时HALT为1,其余为0。

可见,控制逻辑生成的部件可以完成预计的指令。

8.CPU顶层文件设计
顶层文件的设计如下图所示:
此图是最初一版,采取直接拉线的方式,结果页面上全是各种交错混杂的线,给纠错和检查造成了很大困扰。
在这里插入图片描述
这张是经过改良后的页面,采用命名拉线,解决了“蜘蛛网”眼花缭乱的困扰,在这个基础上检查也轻松了很多。为了检查输出,拉出了很多引脚。
在这里插入图片描述
这是在测试数据通过后,将引脚删去,并且加上触发器连上板的bfd文件。
在这里插入图片描述

四、系统测试
4.1 测试环境
在Cyclone中选用EP1C3T100C8芯片,进行仿真测试。

4.2 测试代码
在这里插入图片描述
这17步操作逐步验证了全部的16条指令。

mif文件:
在这里插入图片描述
4.3测试结果
从模拟的测试数据可以看出,正确的输出是“11100111”,经过波形仿真后,可以看到结果无误。
在这里插入图片描述
外接板后,板的输入为16(00010000),可以看到输出为11100111,输出无误。
在这里插入图片描述
在这里插入图片描述
4.4 模型机性能分析
进行时序仿真
在这里插入图片描述
最小周期为32.184ns,在设置时钟信号时,我最初采用的是40ns是合适的。

性能分析如图:
在这里插入图片描述
五、总结
心得体会:
本次实验,我学到了很多,有知识方面的,也有精神方面的。
知识方面,我进一步深入地学习了Quartus的操作,学会了根据自己的设计来生成元件,理解了简单CPU的运行原理,知道了各种指令的详细运行方式;并且试着去制作这样一个简单的CPU器件。
尽管这次实验我还有很多不足之处,但还是让我收益良多。我试着静下心来一个指令一个指令去分析,哪一个指令应该对应哪些信号的变化,这锻炼了我的思维方式;同时,一遍一遍不厌其烦地纠错、一次又一次的推到重来,磨炼了我的心智,一次次的推导缜密了我的思维;在向别的同学请教的过程中,我也发现自己和别的优秀同学之间还有很大的差距,值得我在日后向他们学习,跟上优秀同学的步伐。

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 深入掌握CPU的工作原理,包括ALU、控制器、寄存器、存储器等部件的工作原理; 2. 熟悉和掌握指令系统的设计方法,并设计简单的指令系统; 3. 理解和掌握小型计算机的工作原理,以系统的方法建立起整机概念; 4. 理解和掌握基于VHDL语言和TEC-CA硬件平台设计模型机的方法。 二、设计要求   参考所给的16位实验CPU的设计与实现,体会其整体设计思路,并理解该CPU的工作原理。在此基础上,对该16位的实验CPU(称为参考CPU)进行改造,以设计得到一个8位的CPU。总的要求是将原来16位的数据通路,改成8位的数据通路,总的要求如下: 将原来8位的OP码,改成4位的OP码; 将原来8位的地址码(包含2个操作数),改成4位的地址码(包含2个操作数)。   在上述总要求的基础上,对实验CPU的指令系统、ALU、控制器、寄存器、存储器进行相应的改造。具体要求如下: 修改指令格式,将原来指令长为16位的指令格式改成8位的指令长格式; 设计总共16条指令的指令系统。此指令系统可以是参考CPU指令系统的子集,但参考CPU指令系统中A组和B组中的指令至少都要选用2条。此外,常见的算术逻辑运算、跳转等指令要纳入所设计的指令系统; 设计8位的寄存器,每个寄存器有1个输入端口和2个输出端口。寄存器的数量受控于每一个操作数的位数,具体要看指令格式如何设计; 设计8位的ALU,具体要实现哪些功能与指令系统有关。设计时,不直接修改参考CPU的VHDL代码,而是改用类似之前基础实验时设计ALU的方式设计; 设计8位的控制逻辑部件,具体结合指令功能、硬布线逻辑进行修改; 设计8位的地址寄存器IR、程序计数器PC、地址寄存器AR; 设计8位的存储器读写部件。由于改用了8位的数据通路,不能直接采用DEC-CA平台上的2片16位的存储芯片,需要按照基础实验3的方法设计存储器。此种方法不能通过DebugController下载测试指令,因此测试指令如何置入到存储器中是一个难点。设计时,可以考虑简单点地把指令写死在存储器中(可用于验证指令的执行),然后用只读方式读出来;或者考虑在reset的那一节拍里,实现存储器中待测试指令的置入; (可选项)设计8位的数据寄存器DR; (可选项)不直接设计存储器RAM,而是采用DEC-CA平台上的2片16位的存储芯片.在实现了第9个要求的基础上,实现由Debugcontroller置入待测试指令; (可选项)顶层实体,不是由BDF方式画图实现,而是用类似基础实验4(通用寄存器组)中设计顶层实体的方式,用VHDL语言来实现。 (可选项)自己设想   利用设计好的指令系统,编写汇编代码,以便测试所有设计的指令及指令涉及的相关功能。设计好测试用的汇编代码后,然后利用Quartus II软件附带的DebugController编写汇编编译规则。接着,利用DebugController软件把汇编编译之后的二进制代码置入到所采用的存储器中,并对设计好的8位CPU进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值