一、设计目的
完整、连贯地运用《数字逻辑》所学到的知识,熟练掌握 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器件。
尽管这次实验我还有很多不足之处,但还是让我收益良多。我试着静下心来一个指令一个指令去分析,哪一个指令应该对应哪些信号的变化,这锻炼了我的思维方式;同时,一遍一遍不厌其烦地纠错、一次又一次的推到重来,磨炼了我的心智,一次次的推导缜密了我的思维;在向别的同学请教的过程中,我也发现自己和别的优秀同学之间还有很大的差距,值得我在日后向他们学习,跟上优秀同学的步伐。
版权声明:本文为CSDN博主「hnu灭绝星辰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zumhui/article/details/121305528
暂无评论