模型机CPU设计——系统测试和性能分析(14)

四、 系统测试
4.1 测试环境
开发软件:QuartusII 9.0sp1
操作系统:WINDOWS10专业版

4.2 测试代码
用mif初始化RAM,按照系统表编写指令如下:
在这里插入图片描述

预估执行结果:
在这里插入图片描述

测试结果:
1功能仿真图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
波形分析:
第1条指令MOVAM:将RAM中地址为C的数据写入寄存器A
取址周期SM=0:
时钟为500ps时,RAM_DL=1,RAM_XL=0,PC=00000000,时钟上升沿RAM读出指令
时钟为1.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=11110011
执行周期SM=1:
时钟为1.0ns时,SRG_WE=0,SRG_RA=11, SRG_WA=00,RAM读出00000000对应数据加载到A寄存器中
时钟为2.0ns,时钟处于下降沿,A寄存器载入总线数据,aa=11110011
指令执行完成.

第2条指令MOVAB:将寄存器A中的数据载入到B中
取址周期SM=0:
时钟为2.5ns时,RAM_DL=1,RAM_XL=0,PC=00000001,时钟上升沿RAM读出指令
时钟为3.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=11110100
执行周期SM=1:
时钟为3.0ns时,SRG_WE=0,SRG_RA=00, SRG_WA=01,读出寄存器A对应数据,加载到B寄存器中
时钟为4.0ns,时钟处于下降沿,总线数据载入B寄存器,bb=11110011
指令执行完成.

第3条指令MOVMB:将B对应寄存器中的数据载入到RAM中
取址周期SM=0:
时钟为4.5ns时,RAM_DL=1,RAM_XL=0,PC=00000010,时钟上升沿RAM读出指令
时钟为5.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=11111111
执行周期SM=1:
时钟为5.5ns时,SRG_WE=1,SRG_RA=11, SRG_WA=11,读出寄存器A对应数据,RAM_DL=0,RAM_XL=1加载RAM中,RAM[address]=00000000
指令执行完成.

第4条指令MOVAM:将RAM中地址为C的数据写入寄存器A
取址周期SM=0:
时钟为6.5ns时,RAM_DL=1,RAM_XL=0,PC=00000011,时钟上升沿RAM读出指令
时钟为7.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=11110011
执行周期SM=1:
时钟为7.0ns时,SRG_WE=0,SRG_RA=11, SRG_WA=00,RAM读出00000000对应数据加载到A寄存器中
时钟为8.0ns,时钟处于下降沿,A寄存器载入总线数据,aa=00000000
指令执行完成.

第5条指令IN R1:将数据输入载入R1寄存器
取址周期SM=0:
时钟为8.5ns时,RAM_DL=1,RAM_XL=0,PC=00000100,时钟上升沿RAM读出指令
时钟为9.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=00100000
执行周期SM=1:
时钟为9.5ns时,SRG_WE=0,SRG_RA=00, SRG_WA=00,将IN线对应数据加载到R1寄存器中
时钟为10.0ns,时钟处于下降沿,A寄存器载入输入数据,IN=11110011,aa=11110011
指令执行完成.
第6条指令ADDR1R2:将寄存器R1R2中的数据作算数相加输入载入R1寄存器
取址周期SM=0:
时钟为10.5ns时,RAM_DL=1,RAM_XL=0,PC=00000101,时钟上升沿RAM读出指令
时钟为11.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=10010001
执行周期SM=1:
时钟为11.5ns时,SRG_WE=0,SRG_RA=01, SRG_WA=00,将数据送入ALU,ALU=1001,R1+R2
时钟为12.0ns,时钟处于下降沿,R1寄存器载入输入数据,aa=11100110,bb=11110011,产生进位c=1
指令执行完成.

第7条指令JC:PC寄存器转移到指定地址
取址周期SM=0:
时钟为12.5ns时,RAM_DL=1,RAM_XL=0,PC=00000110,时钟上升沿RAM读出指令
时钟为13.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=00010010,PC+1,pc=00000111
执行周期SM=1:
时钟为13.5ns时,SRG_WE=1,SRG_RA=10, SRG_WA=00,RAM_DL=1,RAM_XL=0,从RAM读取一条地址
时钟为14.0ns,时钟处于下降沿,PC寄存器载入输入数据,PC=00001000
指令执行完成.

第8条指令IN R1:将数据输入载入R1寄存器
取址周期SM=0:
时钟为14.5ns时,RAM_DL=1,RAM_XL=0,PC=00001000,时钟上升沿RAM读出指令
时钟为15.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=00100000
执行周期SM=1:
时钟为15.5ns时,SRG_WE=0,SRG_RA=00, SRG_WA=00,将IN线对应数据加载到R1寄存器中
时钟为16.0ns,时钟处于下降沿,A寄存器载入输入数据,IN=11110011,aa=11110011
指令执行完成.

第9条指令SUBR1R2:将寄存器R1R2中的数据作算数相减输入载入R1寄存器
取址周期SM=0:
时钟为16.5ns时,RAM_DL=1,RAM_XL=0,PC=00001001,时钟上升沿RAM读出指令
时钟为17.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=01100001
执行周期SM=1:
时钟为17.5ns时,SRG_WE=0,SRG_RA=01, SRG_WA=00,将数据送入ALU,ALU=0110,R1-R2
时钟为18.0ns,时钟处于下降沿,R1寄存器载入输入数据,aa=00000000,bb=11110011,结果为00000000,z标志为1.
指令执行完成.

第10条指令JZ:PC寄存器转移到指定地址
取址周期SM=0:
时钟为18.5ns时,RAM_DL=1,RAM_XL=0,PC=00001010,时钟上升沿RAM读出指令
时钟为19.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=00010001,PC+1,pc=000001011
执行周期SM=1:
时钟为19.5ns时,SRG_WE=1,SRG_RA=10, SRG_WA=00,RAM_DL=1,RAM_XL=0,从RAM读取一条地址
时钟为20.0ns,时钟处于下降沿,PC寄存器载入输入数据,PC=00001100
指令执行完成.

第11条指令ORR1R2:将寄存器R1R2中的数据或操作后存入R1中
取址周期SM=0:
时钟为20.5ns时,RAM_DL=1,RAM_XL=0,PC=00001100,时钟上升沿RAM读出指令
时钟为21.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=10110001
执行周期SM=1:
时钟为21.5ns时,SRG_WE=0,SRG_RA=01, SRG_WA=00,R1 or R2=11110011
时钟为22.0ns,时钟处于下降沿,R1寄存器载入总线数据:aa=11110011
指令执行完成.

第12条指令not R1:将寄存器R1中的数据取反操作后存入R1中
取址周期SM=0:
时钟为22.5ns时,RAM_DL=1,RAM_XL=0,PC=00001101,时钟上升沿RAM读出指令
时钟为23.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=01010000
执行周期SM=1:
时钟为23.5ns时,SRG_WE=0,SRG_RA=00, SRG_WA=00,not R1=11110011
时钟为24.0ns,时钟处于下降沿,R1寄存器载入总线数据:aa=00001100
指令执行完成.

第13条指令RSRR1:将寄存器R1中的数据右移位操作后存入R1中
取址周期SM=0:
时钟为24.5ns时,RAM_DL=1,RAM_XL=0,PC=00001110,时钟上升沿RAM读出指令
时钟为25.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=10100000
执行周期SM=1:
时钟为25.5ns时,SRG_WE=0,SRG_RA=00, SRG_WA=00,R1右移
时钟为26.0ns,时钟处于下降沿,R1寄存器载入总线数据:aa=00000110
指令执行完成.

第14条指令RSLR1:将寄存器R1中的数据左移位操作后存入R1中
取址周期SM=0:
时钟为26.5ns时,RAM_DL=1,RAM_XL=0,PC=00001111,时钟上升沿RAM读出指令
时钟为27.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=00010000
执行周期SM=1:
时钟为27.5ns时,SRG_WE=0,SRG_RA=00, SRG_WA=00,R1左移
时钟为28.0ns,时钟处于下降沿,R1寄存器载入总线数据:aa=00001100
指令执行完成.

第15条指令JMP:将寄存器指向指定的地址
取址周期SM=0:
时钟为28.5ns时,RAM_DL=1,RAM_XL=0,PC=00010000,时钟上升沿RAM读出指令
时钟为29.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=00010000,PC+1,PC=00010001
执行周期SM=1:
时钟为29.5ns时,SRG_WE=1,SRG_RA=00, SRG_WA=00,PC_in=0,PC_ld=1,载入pc
时钟为30.0ns,时钟处于下降沿,PC寄存器载入总线数据:PC=00001010
指令执行完成.

第16条指令OUTR1:将寄存器R1的数据输出,通过接口OUT[7…0]向外展示
取址周期SM=0:
时钟为30.5ns时,RAM_DL=1,RAM_XL=0,PC=00010010,时钟上升沿RAM读出指令
时钟为31.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=01000000
执行周期SM=1:
时钟31.0ns时,SRG_WE=1,SRG_RA=00, SRG_WA=00,OUT0=1,向外展示数据,LED=00001100.
指令执行完成.

第17条指令NOP:空操作不进行任何实际操作
取址周期SM=0:
时钟为32.5ns时,RAM_DL=1,RAM_XL=0,PC=00010011,时钟上升沿RAM读出指令
时钟为33.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=011100000,PC+1,PC=00010100
执行周期SM=1:
时钟为33.5ns时,SRG_WE=1,SRG_RA=00, SRG_WA=00,PC_in=0,PC_ld=0,载入pc
时钟为30.0ns,时钟处于下降沿,不进行任何操作.
指令执行完成.

第18条指令NOP:停机操作,所有使能信号失效,计算机系统不再运作.
取址周期SM=0:
时钟为34.5ns时,RAM_DL=1,RAM_XL=0,PC=00010100,时钟上升沿RAM读出指令
时钟为35.0ns时,时钟处于下降沿,指令寄存器IR载入数据,IR=10000000,PC+1
执行周期SM=1:
时钟为35.0ns时,SM=1,RAM_DL=0,RAM_XL=0,PC_in=1,PC_LD=0,IR=SRG_WE=1,SRG_RA=00, SRG_WA=00,ALU=1000,MUX=00,IN0=0,OUT=0,SM_EN=0系统所有使能信号失效,此时所有部件不工作.
指令执行完成.
结论:仿真结果满足功能要求,设计正确

模型机性能分析
资源消耗:
在这里插入图片描述
Total logical elements总逻辑门数:182,占用率6%
Total memory bits总内存位数:2048,占用率3%

时序性能:
在这里插入图片描述

在这里插入图片描述

时序仿真成功执行时序指令,最后停机,此时最小的时钟信号为20ns,所以说可以用20ns的时钟周期实现20条指令而不出现错误.
在这里插入图片描述
总的来说,182(6%)的逻辑门总数和20ns的最小时序时钟周期称得上是一个优秀的设计。

总结(设计总结与心得)

  1. 时间和空间是冲突的,在进行时序仿真时,我不断的改进电路,减少开销。当逻辑门开销是192时,时钟的最小周期是19ns,改进开销后,逻辑门数量减少到182此时最小时钟却提高到了20ns.我最后选择了后者,减少开销损失时间,因为我认为我的设计在这种情况下开销的价值大于时间。

2减少开销的方法:
(1) 一定情况下在VHDL中将if语句改为when select,这样的单变量选择可以减少开销,但是串行会增加延时.
(2) 优化结构:总控制器的设计最能反映你的逻辑,我们要合理的简化设计,精简逻辑,达到最优的效果

3避免触发器的不必要生成
无论是什么语句,都讲究逻辑的划分,在组合电路设计时,尽量将一个逻辑分为一个集合的划分,包含所有情况,相互之间没有交集,避免多余的触发器生成.

4中间变量的使用,我们在设计时序电路时,往往会有这样的情况,用一个内部变量来临时存储一个值,当需要改变的时候就去改变它,实际上,这个功能类似于寄存器,为什么不直接用寄存器的逻辑去设计呢?这样反而精简.

5交流的重要性:一个人毕竟不能持续的工作,相互的交流会让过程边的更加简单有趣,很多时候不经意间的交谈就激起了我的设计想法。

6.前提到交流的重要性但是完全依赖就是禁区,我们更要独立的思考独立的设计,要做到这块CPU完全是自己自主设计的,这才是实验目的。还是那句话,talk is cheap,show me the code.

7感谢的话:很感谢这个实验,让我真正的体会到了什么叫做设计什么叫把自己的idea去实现;胡老师真的是一个很有爱的老师,总是让我们顶着压力却能灿烂自信的微笑;助教虽然验收平时很严格但是这是对我们负责,让我们组合每个部件的时候更加精准,再一次感谢你们!

发布了100 篇原创文章 · 获赞 56 · 访问量 4871

猜你喜欢

转载自blog.csdn.net/weixin_44307065/article/details/103651805