一、实验目的
1.了解简易模型机的内部结构和工作原理。
2.熟悉译码器、运算器的工作原理。
3.分析模型机的功能,设计指令译码器。
4.分析模型机的功能,设计 AU 算术单元
二、实验内容
1.用 VERILOG 语言设计指令译码器
指令译码器是根据指令系统表中的指令编码,对指令的操作码进行解析,判定是哪条指令,该指令对应的输出为 1,否则输出为 0。
指令译码器的输入输出引脚如上图所示。en 为使能信号,ir[3…0]是指令的 4位操作码,输出是对应的 12 条指令。引脚之间的相互关系如下表所示:
2.用 VERILOG 语言设计 AU 算术单元。
算术逻辑运算类指令:
ADD Rd, Rs
SUB Rd, Rs
这类指令的执行过程为:
这类指令的执行过程为: 控制信号 SR1、SR0 选择源寄存器 Rs 的数据从 S 口输出,控制信号 DR1、 DR0 选择目的寄存器 Rd 的数据从 D 口输出;在 AC3~AC0 和 AU_EN 的控制下, 在 AU 中进行加法(减法)运算后将相加的和(相减的差)送入总线 BUS;S0 为 1,BUS 上的数据传送至通用寄存器的输入端;在 WE 和 DR1、DR0 的控制 下,时钟下降沿将输入端的数据写入目的寄存器 Rd。其中 SUB 指令影响状态位 G,如果 Rd>Rs,则 G=1,否则 G=0。
指令具体功能如下:
AU算术单元除了要完成 ADD、SUB 运算外,还需在 MOVA、MOVB 和 OUT三条指令执行时,提供将数据传送至总线的数据通路。ALU 模块的输入输出引脚如下图所示:
其中au_en和ac[3…0]是控制信号,控制a[7…0]和b[7…0]输入的数据进行什么操作,并将产生的结果输出到t[7…0]和gf。各引脚间的相互关系如下表所示:
三、实验过程
1、指令译码器
A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)
工程文件中的文件名需要和项目名称保持一致否则容易出现错误。具体步骤为:1.new project – 选择项目的文件夹 – 输入项目名称 – 新建文件 – 选择Verilog 语言源代码文件 – 开始编写指令译码器源代码
B) 编写源代码
根据实验指导和要求实现的功能写出对应的 Verilog 代码。
步骤:左上角 file->new->Verilog hdl file->编写代码(模块名需与工程名一致)->编译成功后保存到工程文件中。注意编程语言中的引脚定义要与指导书中给出的引脚名相同。
具体编写过程可以分为以上三步走:首先是声明一下变量,包括 input 类型和 output 类型的各种变量;其次是给输出信号赋值,完成信号的输出。最后是编写逻辑。
我们按照指令的类别,将指令分成不同的模块来书写。首先我们知道指令 ir 以及 en 使能信号的变化指令译码器的输出情况可能会发生变化。
每次进行译码之前要把所有的输出信号置零,然后再对需要输出高电平的信号赋值。例如 MOVA 指令,我们首先从 ir 的高四位判断出这是 MOVA 指令,然后进一步利用 if -else
语句判断是 MOVA 还是 MOVB 还是 MOVC,把对应的信号输出。
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
警告信息:
资源消耗:
D) RTL视图
视图分析及结论:
左边为ir[3:0]输入,即AU指令;
语句中利用了许多 if-else 语句这对应了硬件器件中的选择器,因此可以看到有许多的2—1选择器接入电路中。而且使能信号和 ir 信号的变化触发电路输出信号发生改变。因此也可以看到在电路输入端后面接有上升沿触发器。最后对应的输出有包括mova、movb等的12中情况。
E) 功能仿真波形
结果分析及结论:根据不同的指令编码,译码器会给对应的指令信号输出高电平,其他信号 输出低电平。对应的指令与输出结果为:
但是这有一个前提,那就是使能信号 en 是有效的,否则,译码器不工作,如图右半部分。
F) 时序仿真波形
结果分析及结论:
1、图中波形整体分布与功能仿真无太大差别,但是唯一不同的是会发现图中有一些小毛刺,这是由于电路中有传输延迟导致的冒险现象。因为我们的信号区间仅有 50ns,属于纳秒级,但是门传输延迟也在 ns 级,因此这样的冒险现象就会有。但是这只是短暂的失真 现象,稍加注意可以减少或解决,例如在逻辑表达式中增加冗余项。
2、时序仿真可以用来验证程序在目标器件中的时序关系。同时考虑了器件的延迟后,其输出结果跟接近实际情况,但是考虑的情况过多,不容易操作,容易产生错误。
G) 时序分析
操作方法是:编译后,在compilation report中选择【timing analysis】-【summary】和【tpd】
结果分析及结论:
1、由图可得,Timing Analyzer Summmary总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。比如从 ir[2]到add的最坏定时情况的 tpd 为 14.934ns。下面的tpd 报告表则给出了源节点和目标节点之间的tpd延迟时间,比如第四行中 ir[2]到 sub 的tpd 为 14.203ns。
2、实际连接图中个元器件连接之间是存在时间延迟的,而且不同的元器件之间的时间延迟也不相同。
2、算术单元AU
A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)
创建 au 工程文件,与指令译码器相似。
B) 编写源代码
特别注意,当比较a,b两数大小时,由于为补码,不能直接进行比较,可以先比较符号位,若符号位相等,则可以直接比较;若符号位不相等,则符号位为0的大于符号位为1的。
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
警告信息:
资源消耗:
D) RTL视图
结果分析及结论:
由视图可得,视图左边为输入,右边为输出。其中连接有一系列的元器件。比如比较器、加法器,同时存在大量的 2-1 选择器,当控制信号为0 时,输出第一位,控制信号为1时,输出第二位。
E) 功能仿真波形
结果分析及结论:
根据波形图也可验证程序编写的正确性。对应的引脚关系为:
F) 时序仿真波形
结果分析及结论:
1、图中波形整体分布与功能仿真无太大差别,不同的是会发现图中有一些小毛刺,这是由于电路中有传输延迟导致的冒险现象。因为我们的信号区间属于纳秒级,但是门传输延迟也在 ns 级,因此这样的冒险现象就会有。但是这只是短暂的失真现象,稍加注意可以减少或解决,例如在逻辑表达式中增加冗余项。
2、时序仿真可以用来验证程序在目标器件中的时序关系。同时考虑了器件的延迟后,其输出结果跟接近实际情况,但是考虑的情况过多,不容易操作,容易产生错误。
G) 时序分析
结果分析及结论:
由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。比如从 ac[1]到 t[6] 的最坏定时情况的 tpd 为 19.491ns。下面的 tpd 报告表则给出了源节点和目标节点之间的 tpd 延迟时间,比如第二行中 ac[3]到 t[6]的 tpd 为 19.331ns。
四、思考题
1. 指令译码器必须要12个输出吗?可否将一些输出合并,哪些可以合并,为什么?
不必需要12个输出。movb和movc可以合并,因为movc是将movb后的数据写入Rd,则可以movb操作后直接movc;movd和jmp可以合并,因为两个操作刚好相反。
2. AU中的S[3…0]控制信号是来自哪里或者说与什么信息相同?
当au_en信号有效时,au发生逻辑运算,此时 s 信号截取于 ir 信号的高四位,代表进行某个运算。当au_en信号无效时,au不发生逻辑运算,此时 s 信号并不有效,但同样来自于 ir 的高四 位。也就是说 s 信号与 ir 的高四位相同。
3、为何AU算术单元不执行加、减运算和MOVA、MOVB和OUT指令的数据传送功能时,输出为高阻态?
算术单元不工作时,为了预防算术单元输出数据到总线中和其他位置输出到总线中的数据起冲突,应该阻止算术单元向总线输出数据,故此时算术单元输出为高阻态。
五、实验总结、必得体会及建议
1、从需要掌握的理论、遇到的困难、解决的办法以及经验教训等方面进行总结。
(1)需要掌握的理论:基本了解了简易模型机的内部结构和工作原理。同时学会使用 Verilog 语言编写简单电路。
(2)遇到的困难:对于 QuartusII 的使用还不够熟练,特别是进行波形仿真的功能仿真和时序仿真时花费时间过长。
(3)解决方法:通过上网查询相关资料,与同学一起讨论,并请教老师。
(4)经验教训:不懂的地方要多向老师请教,对于电路的搭建要多动手,要学会利用好软件工具,不仅是在实验中,在平时的学习中也要学会利用工具。
2、对本实验内容、过程和方法的改进建议(可选项)。
相比于直接按照逻辑表写实现代码,更加重要的步骤应在前面一步,就是电路中信号怎么走 的要先弄明白才更重要。