写在前面:
从此次实验开始,就进入到cpu的综合设计了(第二次和第三次实验是完成cpu的组成部分,最后一次实验将各部分进行整合),也是数字电路相关的第一次实验,难度较小,参照指导书可以掌握,但一定要细心(我在这里就粗心除了一点小问题导致cpu整合的时候调了好久QAQ)
ps: Quartus的编程语言建议掌握,这几年期末考试都考了一道手写编程题,分值较高。
一、实验目的
-
1.了解简易模型机的内部结构和工作原理。
2.熟悉译码器、运算器的工作原理。
3.分析模型机的功能,设计指令译码器。
4.分析模型机的功能,设计 AU 算术单元。
二、实验内容
-
1.用 VERILOG 语言设计指令译码器;
2.用 VERILOG 语言设计 AU 算术单元。
三、实验过程
1、指令译码器
A)创建工程(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
module ins_decode(en,ir,mova,movb,movc,movd,add,sub,jmp,jg,in1,out1,movi,halt);
input en;
input [3:0] ir;
output mova,movb,movc,movd,add,sub,jmp,jg,in1,out1,movi,halt;
reg [11:0]HappyNewYear;
always @ (en,ir)
begin
if(en==0)
begin HappyNewYear<=12'b000000000000; end
else
begin
if(ir==4'b0100)
begin HappyNewYear<=12'b100000000000; end
else if(ir==4'b0101)
begin HappyNewYear<=12'b010000000000; end
else if(ir==4'b0110)
begin HappyNewYear<=12'b001000000000; end
else if(ir==4'b0111)
begin HappyNewYear<=12'b000100000000; end
else if(ir==4'b1000)
begin HappyNewYear<=12'b000010000000; end
else if(ir==4'b1001)
begin HappyNewYear<=12'b000001000000; end
else if(ir==4'b1010)
begin HappyNewYear<=12'b000000100000; end
else if(ir==4'b1011)
begin HappyNewYear<=12'b000000010000; end
else if(ir==4'b1100)
begin HappyNewYear<=12'b000000001000; end
else if(ir==8'b1101)
begin HappyNewYear<=12'b000000000100; end
else if(ir==8'b1110)
begin HappyNewYear<=12'b000000000010; end
else if(ir==8'b1111)
begin HappyNewYear<=12'b000000000001; end
else
begin HappyNewYear<=12'b000000000000; end
end
end
assign {mova,movb,movc,movd,add,sub,jmp,jg,in1,out1,movi,halt}=HappyNewYear;
endmodule
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
调试过程无错误
图示为警告信息
图示为资源消耗
D) RTL 视图
视图分析及结论:视图分析:
通过观察 RTL 视图可知:左侧为输入,右侧为输入,电路中有很多的元器件进行连接,如:比较器(输入相等输出 1,输入不相等输入 0)等,以及含有多路复用器,输入信号包含指令码 ir以及使能信号 en,输出信号为十二条相应操作指令,各个输出端口以及输入端口由导线相连接。
结论:
一个功能的实现需要多重门的处理,Verilog 中简单的代码对应的实际元件内部的结构原理十分复杂。
E) 功能仿真波形
结果分析及结论:结果分析:
功能仿真是指不考虑器件延时和布线延时的理想情况下对源代码进行逻辑功能的验证。由仿真波形可得,对于输入状态的变化,输出结果实时变化,没有延迟,其结果与电路设计的真值表的结果相对应。
当 en 为 0 时,不管 ir 为何值,12 个输出全为 0当 en 为 1 时:
当 ir=0100 时,mova 输出为 1,其余输出为 0;当 ir=0101 时,movb 输出为 1,其余输出为 0;当 ir=0110 时,movc 输出为 1,其余输出为 0;当 ir=0111 时,movd 输出为 1,其余输出为 0;当 ir=1000 时,add 输出为 1,其余输出为 0;当 ir=1001 时,sub 输出为 1,其余输出为 0;当 ir=1010 时,jmp 输出为 1,其余输出为 0;当 ir=1011 时,jg 输出为 1,其余输出为 0; 当 ir=1100 时,in1 输出为 1,其余输出为 0;当 ir=1101 时,out1 输出为 1,其余输出为 0;当 ir=1110 时,movi 输出为 1,其余输出为 0;当 ir=1111 时,halt 输出为 1,其余输出为 0;当 ir 输出错误为其他值时,12 个输出全为 0;结论:
功能仿真操作简单,能体现和验证实验的功能,但忽略延迟的影响会使结果与实际结果有一定误差。
F)时序仿真波形
结果分析及结论:
结果分析:
时序仿真是指在布线后进行,是最接近真实器件运行的仿真,它与特定的器件有关,又包含了器件和布线的延时信息。由波形可得,当输入状态发生改变时,输出结果并未同时改变,而是有一定延迟,同时由于输入状态的改变,导致电路出现“冒险”,导致输出结果并未与预期结果相同。结论:
1、时序仿真可以用来验证程序在目标器件中的时序关系。同时考虑了器件的延迟后,其输出结果跟接近实际情况,但是考虑的情况过多,不容易操作,容易产生错误。
2、时序仿真不 仅反应出输出和输入的逻辑关系,同时还计算了时间的延时信息,是与实际系统更接近的一种仿真结果。不过,要注意的是,这个时间延时是仿真软件“估算”出来的。
G) 时序分析
操作方法是:编译后,在 compilation report 中选择【timing analysis】-【summary】和【tpd】
结果分析及结论:
结果分析:
1、由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。比如从 ir[2]到 movb 的最坏定时情况的 tpd 为 15.757ns。下面的 tpd 报告表则给出了源节点和目标节点之间的 tpd 延迟时间,比如第七行中 ir[3]到 sub 的 tpd 为 14.916ns。
结论:实际连接图中个元器件连接之间是存在时间延迟的,而且不同的元器件之间的时间延迟也不相同。
2、算术单元 AU
A)创建工程(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
module au(au_en,ac,a,b,t,gf);
input au_en;
input [3:0] ac;
input [7:0] a;
input [7:0] b;
output reg [7:0] t;
output reg gf;
always @(au_en,ac,a,b)
begin
gf=1'b0;
t=8'b00000000;
if(au_en==1'b0)
begin
t=8'hZZ;
end
else if(au_en==1'b1)
begin
if(ac==4'b1000)
begin
t=a+b;
end
else if(ac==4'b1001)
begin
t=b+(~a)+8'b00000001;
if(t[7]==0)gf=1;
else if(t[7]==1)gf=0;
end
else if(ac==4'b0100 || ac==4'b0101 || ac==4'b1101)
begin t=a; end
else
begin t=8'hZZ; end
end
end
endmodule
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
调试过程无错误
图示为警告信息
图示为资源消耗
D) RTL 视图
结果分析及结论:
分析:通过观察 RTL 视图可知:左侧为输入,右侧为输入,电路中有很多的元器件进行连接,如:比较器(输入相等输出 1,输入不相等输入 0)等,以及含有多路复用器,输入信号包含使能信号 au_en、控制信号 ac 以及八位二进制数 a、b,输出信号为 ab 之间进行计算得到的结果 t, 个输出端口以及输入端口由导线相连接。
结论:一个功能的实现需要多重门的处理,Verilog 中简单的代码对应的实际元件内部的结构原理十分复杂。
E) 功能仿真波形
结果分析及结论:
结果分析:
功能仿真是指不考虑器件延时和布线延时的理想情况下对源代码进行逻辑功能的验证。由仿真波形可得,对于输入状态的变化,输出结果实时变化,没有延迟,其结果与电路设计的真值表的结果相对应。
au_en 为使能信号,当 au_en 为 0 时,无论 ab 输入多少均输出高阻态;当 au_en 为 1 时,使能有效:
当 ac=1000 时,执行加法操作:
输出 t=a+b,a=00000001,b=00000101 时,t=a+b=00000100,gf=0;当 ac=1001 时,执行减法操作:
输出 t=b-a,a=00000001,b=00000101 时,t=b-a=00000100,b>a 输出 gf=1; a=11111011,b=00000001 时,t=b-a=00000110,b>a 输出 gf=1; a=00000001,b=11111011 时,t=b-a=11111010,b<a 输出 gf=0; a=11111011,b=11111111 时,t=b-a=00000100,b>a 输出 gf=1;
结论:
功能仿真操作简单,能体现和验证实验的功能,但忽略延迟的影响会使结果与实际结果有一定误差。
F) 时序仿真波形
结果分析及结论:
分析:
时序仿真是指在布线后进行,是最接近真实器件运行的仿真,它与特定的器件有关,又包含了器件和布线的延时信息。由波形可得,当输入状态发生改变时,输出结果并未同时改变,而是有一定延迟,同时由于输入状态的改变,导致电路出现“冒险”,导致输出结果并未与预期结果相同。结论:
1、时序仿真可以用来验证程序在目标器件中的时序关系。同时考虑了器件的延迟后,其输出结果跟接近实际情况,但是考虑的情况过多,不容易操作,容易产生错误。
2、时序仿真不 仅反应出输出和输入的逻辑关系,同时还计算了时间的延时信息,是与实际系统
更接近的一种仿真结果。不过,要注意的是,这个时间延时是仿真软件“估算”出来的。
G) 时序分析
结果分析及结论:
结果分析:
由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。比如从 a[1]到 t[7] 的最坏定时情况的 tpd 为 18.546ns。下面的 tpd 报告表则给出了源节点和目标节点之间的 tpd 延迟时间,比如第二行中 a[1]到 t[5]的 tpd 为 18.520ns。
结论:实际连接图中个元器件连接之间是存在时间延迟的,而且不同的元器件之间的时间延迟也不相同。
四、思考题
1. 指令译码器必须要 12 个输出吗?可否将一些输出合并,哪些可以合并,为什么?
答:不一定,mova 和 add 可以合并,因为这两条输出指令在模型机中对应的控制信号完全相同,即进行相同的操作,以及 add、sub、in1、out1 可以进行合并,因为这四条输出指令对应的功能及控制信号基本一致,且输出为使能信号,可以用一个合并使能信号来代替这四个信号的使能信号。
2. AU 中的 S[3…0]控制信号是来自哪里或者说与什么信息相同?
答:AU 中的 S[3…0]控制信号来自于指令码 ir。
3、为何 AU 算术单元不执行加、减运算和 MOVA、MOVB 和 OUT 指令的数据传送功能时,输出为高阻态?
答: 因为 AU 算数单元的输出端与其他输出单元共用一根总线,当 AU 在不执行相应的运算和数据传送功能时,输出高阻态从而与总线断开,避免对其他输出端产生影响。
五、实验总结、必得体会及建议
从需要掌握的理论、遇到的困难、解决的办法以及经验教训等方面进行总结。
答:需要掌握的理论:对于本实验的进行,需要基本了解模型机的内部结构和工作原理,同时需要熟悉译码器和 ALU 的工作原理,以及需要熟练使用 Verilog 语言进行电路程序的编写。遇到的困难:对 Quartus II 软件的使用不熟练,不了解功能仿真以及时序仿真的使用方法,通过与同学之间讨论以及积极向老师提问解决了该问题。经验教训:遇到不懂的问题一定要及时想办法解决,不要将问题积累,同时多使用仿真对电路进行检验。