HNU 大数据 电子电路 实验二 完整报告

本文详细描述了使用VERILOG语言设计简易模型机的指令译码器和ALU的过程,涉及实验目的、内容、编译调试、功能与时序仿真,以及遇到的问题和解决方案。重点强调了功能仿真与时序仿真在理解和电路设计中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为大二学的了,我都忘光了,不记得对不对了,而且有部分问答题我也不确定答案对不对,你们就只是参考一下,有错误要自己发现,或者和同学讨论一下!!

然后请不要照抄,因为我的仅供参考!!!!!!!!!!!!

一、实验目的

1.了解简易模型机的内部结构和工作原理。

2.熟悉译码器、运算器的工作原理。

3.分析模型机的功能,设计指令译码器。

4.分析模型机的功能,设计ALU。

二、实验内容

1.用VERILOG语言设计指令译码器;

2.用VERILOG语言设计ALU。

三、实验过程

1、指令译码器

A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)

步骤:左上角file->New Project Wizard->选择工程位置和工程名->选择芯片CycloneII,available device中选择EP2C5T144C8->点击next->最后点击finish完成创建工程

工程创建图:

B) 编写源代码

根据实验指导和要求实现的功能写出对应的 Verilog 代码。

步骤:左上角file->new->Verilog hdl file->编写代码(模块名需与工程名一致)

->编译 成功后保存到工程文件中

代码图如下:

C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)

确定源代码文件为当前工程文件,点击【processing】-【start compilation】进行文件编

译,编译成功,保存文件。

警告信息如下:

资源消耗如下:

D) RTL视图

视图分析及结论:

分析:

我们仔细观察RTL视图,易得左边输入右边输出,包括一系列的元器件。

例如比较器:当输入相等时输出 1,不相等时输出 0;

还有大部分的 2-1 选择器构成,当控制信号为0 时输出第一位,否则输出第二位。

图中输入信号为 ir 和 en,输出信号包括 add 等 16 种情况,输出端口之间通过导线连接。

结论:

一个功能的实现需要经过多重门的处理后才能实现,一个元件的内部原理结构图十分复杂

E) 功能仿真波形

结果分析及结论:

分析:

功能仿真是指不考虑器件延时和布线延时的理想情况下,对源代码进行逻辑功能的验证;

由仿真波形可得,对于输入状态的变化,输出结果实时变化,没有延迟,其结果与电路设计的真值表的结果相对应;

目的是分析电路的逻辑关系的正确性,仿真速度快,可以根据需要观察电路输入输出端口和电路内部任一信号和寄存器的波形;

当 en 为 0 时,不管 ir 为何值,16 个输出全为 0

当 en 为 1 时:

当 ir = 11000000 时,mova = 1;

当 ir = 11001100 时,movb = 1;

当 ir = 11000011 时,movc = 1;

当 ir = 10010000 时,add = 1;

当 ir = 01100000 时,sub = 1;

当 ir = 10110000 时,and1 = 1;

当 ir = 01010000 时,not1 = 1;

当 ir = 10100000 时,rsr = 1;

当 ir = 10100011 时,rsl = 1;

当 ir = 00110000 时,jmp = 1;

当 ir = 00110001 时,jz = 1;

当 ir = 00110010 时,jc = 1;

当 ir = 00100000 时,in1 = 1;

当 ir = 01000000 时,out1 = 1;

当 ir = 01110000 时,nop = 1;

当 ir = 10000000 时,halt = 1;

其余时候都为0;

结论:

功能仿真操作比较简单,能体现和验证实验的功能。

注:因为功能仿真仅关心输出和输入的逻辑关系是否正确,不考虑时间延时信息,但其实忽略延迟的影响会使结果与实际结果有一定误差)

F) 时序仿真波形

结果分析及结论:

分析:

时序仿真也叫后仿真,是使用布局布线后器件给出的模块和连线的延时信息,在最坏的情况下对电路的行为作出实际地估价;

时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的;惟一的差别是为时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时,并且在仿真结果波形图中,时序仿真后的信号加载了时延, 而功能仿真没有。

结论:

时序仿真可以用来验证程序在目标器件中的时序关系。同时考虑了器件的延迟后,其

输出结果跟接近实际情况,但是考虑的情况过多,操作偏难且易错。时序仿真不仅反应出输出和输入的逻辑关系,同时还计算了时间的延时信息,是与实际系统更接近的一

种仿真结果。不过,要注意的是,这个时间延时是仿真软件“估算”出来的

G) 时序分析

操作方法是:编译后,在compilation report中选择【timing analysis】-【summary】和【tpd】

 

 

结果分析及结论:

分析:

由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。如上图,比如en到not1的最坏定时情况的tpd为15.130ns,tpd 报告表则给出了源节点和目标节点之间的 tpd 延迟时间,比如ir[5]到rsr 的tpd 为 9.446ns。

结论:

实际连接图中个元器件连接之间存在时间延迟,且不同元器件之间的时间延迟也不相同。

2、算术逻辑单元ALU

A)创建工程(选择的芯片为family=FLEX10K;name=EPF10K20TI144-4)

B) 编写源代码

C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)

D) RTL视图

结果分析及结论:

分析:

由视图可得,视图左边为输入,右边为输出。其中连接有一系列的元器件。

比如比较器:当输入相等时输出 1,不相等时输出 0;

还有大部分的 2-1 选择器构成,当控制信号为0 时,输出第一位,否则输出第二位。

图中输入信号为 m,s,a,b,输出信号为 t,cf,zf,各个输出端口之间通过导线相连。

结论:

一个功能的实现需要经过多重门的处理后才能实现,元件的内部原理结构图十分复杂。

E) 功能仿真波形

结果分析及结论:

分析:

功能仿真也被称作 RTL 级行为仿真,前仿真,目的是分析设计电路逻辑关系的正确性。

缺点:

不带有任何的门延时、线延时等等,只是理想情况下的仿真。

优点:

仿真速度快,可以根据需要观察电路输入输出端口和电路内部任一信号和寄存器的波形。

由仿真波形可得,对于输入状态的变化,输出结果实时变化,没有延迟,其结果与电路设计的真值表的结果相对应。

当控制信号 m = 1,s 为 1001 时,执行 t=a+b;

当控制信号m = 1,s 为 0110 时,执行 t=b-a;

当控制信号m = 1,s 为 1011 时,执行 t=a&b;

当控制信号m = 1,s 为 0101 时,执行 t=非b;

当控制信号m = 1,s 为 1010 时,执行 t=b;

当控制信号m = 0,s 为 1100或0100 时,执行 t=a;

有进位和借位时 cf = 1,否则= 0;

和=0或差=0 时 zf = 1,否则= 0;

结论:

功能仿真操作简单,能体现和验证实验的功能

(但请注意:忽略延迟的影响会使结果与实际结果有一定误差)

F) 时序仿真波形

结果分析及结论:

分析:

时序仿真使用布局布线后器件给出的模块和连线的延时信息,在最坏的情况下对电路的行为作出实际地估价。

由波形可得,当输入状态发生改变时,输出结果并未同时改变,而是有一定延迟,同时由于输入状态的改变,导致电路出现“冒险”,导致输出结果并未与预期结果相同。

结论:

时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的;惟一的差别是为时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时,并且在仿真结果波形图中,时序仿真后的信号加载了时延,是与实际系统更接近的一种仿真结果。不过,要注意的是,这个时间延时是仿真软件“估算”出来的。

G) 时序分析

结果分析及结论:

分析:

由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。

比如从 b[0]到zf的最坏定时情况的 tpd 为 59.800ns。

下面的 tsu报告表则给出了源节点和目标节点之间的 tpd 延迟时间,比如第一行中 a[1]到b[2]的 zf为 51.100ns。

结论:

实际连接图中个元器件连接之间是存在时间延迟的,不同元器件之间的时间延迟也不相同。

四、思考题

1.指令译码器必须要16个输出吗?可否将一些输出合并,哪些可以合并,为什么?

答:有的可以合并,有的不可以,所以不一定。

根据这个图我们可以发现,JMP,JZ,JC可能先经过判断,然后把add逻辑运算的结果存入PC,所以我们无需再开三个引脚输出JMP,JZ,JC,直接将add和这三者合并即可。

2.ALU中的S[3..0]控制信号是来自哪里或者说与什么信息相同?

答:CPU通过取指,就会把指令从内存中取出,并放到IR寄存器也就是存放指令编码的寄存器,指令译码电路看到这条指令的编码之后,根据 opcode 域为全0,知道了这是条R型的指令,再根据function 域的值,分析出这是一条什么指令,从而控制电路会向ALU发出对应的控制信号,指明接下来要进行什么运算。

3、为何S[3..0]等于1100或0100时将输入a传给t,S[3..0]等于1010时将输入b传给t?

答:

因为在指令处于 1100 时,是需要将最初(RAA 中的数据)的数据进行处理之后再在寄存器入口将总线上的值传给 b,而指令 1010 和 0100 是将寄存器中的结果(RWDA 中的数据)进行直接输出或者是进行操作之后再存入。指令不同,需执行的数据的位置自然也会有可能不司。

五、实验总结、必得体会及建议

1、从需要掌握的理论、遇到的困难、解决的办法以及经验教训等方面进行总结。

掌握理论:

1.在小班课就要对于模型机内部的逻辑要全面了解;

2.以及对指令译码器和ALU需要执行的操作流程充分理解;

3.quartus软件里时序仿真以及功能仿真如何操作,两者的差别以及优缺点分别是什么;

4.最重要的是知道怎么把理论转化为 verilog语言;

5.如何查看RTL图,还要知道每个门的用处和门与门之间的关系。

遇到的困难:

1.对于quartus软件的布局和使用实在是不太熟悉,摸索了很久;

2.刚开始新建project的时候我的芯片就没留心,选择错误了,后来又得重头做一遍;

3.接着第一次自己使用quartus敲着没有C++高级熟悉的语言,敲了很多遍,报错不停;

4.如何去理解报错的英文,并且根据报错找出自己的错误;

5.对功能仿真和时序仿真不太了解。

解决方法:

1. 通过百度等搜索引擎,再次熟悉quartus软件;

2. 去适应Verilog语言,多错多打几遍来让自己对其更加了解;

3. 翻译好报错信息,并且根据报错信息一条一条地更改好,最后代码运行通过,耶;

4. 询问身边的同学和查阅CSDN上的译码器和ALU的相关博客,了解时序仿真和功能仿真;

5. 给其他同学讲解自己还不是特别熟练的知识点和操作,加深印象!

经验教训:

在仿真的时候应该把每种情况按照相应的顺序和规律进行设置,以免验收的时候显得过于凌乱,需要到处找,同时要把老师提供的所有资料都要仔细阅读之后再对自己的仿真和代码进行修改,以免信息不对等,想当然的设计等事情的发生,比如说我弄错芯片,弄错时序仿真等错误行为,当然写代码一定要耐心,否则报错很多改起来很是费劲。

交完代码发现自己的ALU的zf,cf,t未初始化,导致了错误,所以以后还是要仔细查看功能看是否正确,不能光看是否有error,隐含的错误得需要挖掘并修正。

2、对本实验内容、过程和方法的改进建议(可选项)

答:(这里我乱写的,不要相信,O(∩_∩)O)

1.根据我们的上面思考题里面的回答,是不是可以把部分门合并来减少实际电路的成本呢?

2.说实话,如果quartus能用高级一点的语言写,会不会更好更快,更不容易出错?

3.最后就是看那个时序仿真,观察的出来,似乎冒险比较明显且多,波形比较杂乱,不易研究,而且再看那个tpd的分析报告,发现部分路径的传输时间差特别大,也就是每一条线路上门的数量差别大,那么同一个输入从两个路径影响输出,的确大概率有冒险,那可以优化一下电路图,使得每条路径的延时相近,这样冒险不会太多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值