实验三 简易模型机中组合部件的实现-数字电路与逻辑设计-湖南大学课程实验

这个报告VHDL设计我记得有几处错误,请自行辨别

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
实验三 简易模型机中组合部件的实现
一、实验目的
1.了解简易模型机的内部结构和工作原理。
2.分析模型机的功能,设计 ALU 和移位逻辑。
3.分析模型机的工作原理,设计模型机控制信号产生逻辑。
二、实验内容
1.用 VHDL语言设计模型机的 ALU模块;
2.用 VHDL语言设计 模型机的移位模块;
3.用 VHDL语言设计 模型机的控制信号产生逻辑。
三、实验方法
1、 实验方法
采用基于FPGA进行数字逻辑电路设计的方法。
采用的软件工具是Quartus II。
2、 实验步骤
1、 新建,编写源代码。
(1).选择保存项和芯片类型:【File】-【new project wizard】-【next】(设置文件路径,在本次实验中,我将三个实验项目分别设置project name为ALU、shift和control)-【next】(add添加文件,三个实验项目分别设置文件名ALU.vhd、shift.vhd和control.vhd)-【properties】(检查文件类型type=VHDL)-【next】(三个项目都统一选择芯片类型family=Cyclone;name= EP1C3T100A8(实验过程中修改后调整为Stratix II
EP2S15F484C3))-【next】-【finish】
(2).新建:【file】-【new】(选择VHDL File)-【OK】
2、写好源代码,保存文件(分别为ALU.vhd、shift.vhd和control.vhd)。
3、编译与调试。确定源代码文件为当前工程文件,点击【processing】-【start compilation】进行文件编译。
4、RTL Viewer:【Tools】-【netlist viewer】-【RTL viewer】。
5、形仿真及验证(包括功能仿真和时序仿真)。
新建一个vector waveform file。通过操作:右击 -【insert】-【insert node or bus】-【node finder】(pins=all;【list】)-【>>】-【ok】-【ok】。接着设置输入波形,然后点击【start simulation】开始仿真,查看时序仿真输出波形图。
在【assignments】-【setting】-【simulator settings】-【simulation mode】中,将timing修改为functional,然后再点击【processing】- 【Generate Functional Simulation Netlist】成功后点击【start simulation】开始仿真,查看输出功能仿真波形图。
6、 分析:选择【start classic timing analyzer】-在compilation report中选择【timing analysis】-【tpd】(查看引脚到引脚的延时)

四、实验过程
Ⅰ. ALU模块
1、 编译过程
a)源代码如图(VHDL设计)

b)编译、调试过程
编译的警告信息以及资源消耗。

c) RTL视图

d)结果分析
程序成功通过编译,提示58条警告。对警告进行分析如下:
第一部分警告提示在进程中读取了部分信号但是该信号并不作为进程的敏感信号,检查发现这些信号本来就不需要作为敏感信号,ALU的敏感信号只需包括SS[3 DOWNTO 0]和M即可,甚至理论上M也不需要。但为了减少警报,我将警告中的信号添入了敏感信号中。
第二、三部分警告提示未对条件语句的其他情况进行处理,导致产生了锁存器,这原本是不用进行处理的,因为其他指令情况本身就不需要进行处理,但是在进行时序仿真是发现调用太多锁存器以及线路的不恰当导致时序仿真结果错乱,并且由于芯片性能不佳,时延很大。因此我又重构了一下程序写法,更换了芯片将所有情况下都对输出信号赋值,消除了锁存器,减小了时延,消除了和锁存器有关的全部告警。下图是修改后的程序代码和编译结果:

修改代码后编译出现三则警告提示,均和信号的引脚没有分配有关,由于我们的此次试验没用在实体电路板上运行,因此引脚可以暂时不做分配。
最后附上RTL原理图:

2、 波形仿真
a) 波形仿真过程:插入M、SS、S、D、T、Zf和Cf七个节点(M、SS、S、D为输入节点,T、Zf和Cf为输出节点),设置合适的输入波形,保存并对应仿真。
b) 功能仿真波形图及结果分析
我们看到0~55ns内M=0,表示传入的操作指令为算术运算或者直接经过:
0-15ns 内SS=1001,表示进行加法运算,其中有三组不同的S/D输入,我们看到
第一组为S=00101010,D=10100011,输出T=11001101=S+D,输出结果不为0,Zf为0,计算结果没有发生最高位进位,Cf=0,结果正确;
第二组为S=11110101,D=01111111,输出T=01110100=S+D(舍去进位),输出结果不为0,Zf为0,计算结果发生最高位进位,Cf=1,结果正确;
第三组为S=00000000,D=00000000,输出T=00000000=S+D,输出结果为0,Zf为1,计算结果没有发生最高位进位,Cf=0,结果正确;

15-30ns 内SS=0110,表示进行减法运算,其中有三组不同的S/D输入,我们看到
第一组为S=00101101,D=00010000,输出T=11100011=D-S(舍去借位),输出结果不为0,Zf为0,计算结果发生最高位借位,Cf=1,结果正确;
第二组为S=00001010,D=01000011,输出T=01000011=D-S,输出结果不为0,Zf为0,计算结果不发生最高位借位,Cf=0,结果正确;
第三组为S=10101010,D=10101010,输出T=00000000=D-S,输出结果为0,Zf为1,计算结果没有发生最高位借位,Cf=0,结果正确;

30-40ns 内SS=1111,表示传入MOV指令,要把S口数据传到T口实现直接经过,观察到输出T总等于S,正确;

而后SS先后为 1010和0100,分别表示RSR/RSL指令与OUT指令,都要求吧D口数据传到T口实现直接经过,观察到输出T总等于D,正确;

110-150ns内M=1;表示进行逻辑运算:
110-115ns内SS=1011,表示指令为或运算,输入S=00011101,D=10010011,输出T=10011111=S OR D,结果正确。
115ns-120ns内SS=0101,表示指令为取反运算,输入S=00011100,D=00010001,输出T=11101110=NOT D,结果正确。

c) 时序仿真波形图

d)结果分析及结论
可以看出每次输出有约10ns的延迟,且输出信号作出反应时产生了在短时间内的信号波动,其余表现同功能仿真。同时观察到在160ns左右出现了一次冒险。

3.时序分析
a)时序分析图
b)结果分析及结论
SS[0]引脚到Cf引脚的实际p2p时间最长决定了电路总体时延为11.836ns.

Ⅱ 移位逻辑模块
1、 编译过程
a)源代码如图(VHDL设计)

b)编译、调试过程
编译的警告信息以及资源消耗。
c) RTL视图

d)结果分析及结论
在吸取上一个实验的教训后,我将进程中所有信号全部加入敏感信号,并且补全了所有条件情况下对信号的赋值,程序成功通过编译,提示三个警告,均与引脚分配有关,均暂不做处理。

2、 波形仿真
3、 波形仿真过程:插入A、F_BUS、FL_BUS、FR_BUS、W和Cf七个节点(A、F_BUS、FL_BUS、FR_BUS为输入节点,W和Cf为输出节点),设置合适的输入波形,保存并对应仿真。
4、 功能仿真波形图及结果分析
我们看到0-10ns,当F_BUS、FL_BUS、FR_BUS均为0时,输出成高阻态,正确;
10-20ns,当F_BUS=1, FL_BUS、FR_BUS为0时,实现直接通过的功能,输出W=A,正确;
20-30ns,当FL_BUS=1,F_BUS、FR_BUS为0时,实现循环左移功能,输出W=10100100将A=01010010循环左移了,并把A的最高位0赋给Cf,正确;
30-40ns,当FR_BUS=1,F_BUS、FL_BUS为0时,实现循环右移功能,输出W=10101001将A=01010011循环右移了,并把A的最低位1赋给Cf,正确;

5、 时序仿真波形图

d)结果分析及结论
可以看出每次输出有约10ns的延迟,且输出信号作出反应时产生了在短时间内的信号波动,其余表现同功能仿真。

3.时序分析
a)时序分析图
b)结果分析及结论
FR_BUS引脚到W[4]引脚的实际p2p时间最长,决定了电路总体时延为10.936ns.

Ⅲ 控制信号产生逻辑
1、 编译过程
a) 源代码如图(VHDL设计)

b)编译、调试过程
编译的警告信息以及资源消耗。

c) RTL视图

d)结果分析及结论
程序正常通过编译,有三个警告,和先前一致,为引脚分配问题。

2、 波形仿真

1、 波形仿真过程:插入M、SS、S、D、T、Zf和Cf七个节点(M、SS、S、D为输入节点,T、Zf和Cf为输出节点),设置合适的输入波形,保存并对应仿真。
2、 功能仿真波形图及结果分析

3、 时序仿真波形图

d)结果分析及结论
可以看出每次输出有约10ns的延迟,且输出信号作出反应时产生了在短时间内的信号波动,其余表现同功能仿真。同时观察到在160ns左右出现了一次冒险。

3.时序分析
a)时序分析图
b)结果分析及结论
RSL引脚到CS引脚的实际p2p时间最长,决定了电路总体时延为9.987ns.

五、实验结论
1、思考题
1.移位逻辑不工作时,输出应该为何值?为什么?
输出应成高阻,防止数据通路发生冲突,产生主线竞争。
2 ALU的输出 Cf和 Zf应该如何处理?
输出Cf和 Zf只受算术运算和移位指令影响,其他时刻应当保持原状态,故这两个信号应该借助触发器/锁存器储存。
3.如何产生正确的控制信号以及具体的编程实现
应当逐个分析每个控制信号在不同的指令下对应的状态,利用逻辑函数进行状态的总和。

2、实验总结与实验心得
这次实验让我对模型机的工作原理有了更加深入的了解,同时在运行调试过程中的锁存器问题也让我对组合电路以及时序电路的区别与表现理解更为细致。在编写模型机各个部件时也应当具有全局观念,要考虑把这个部件最终组合后可能的运行情况,使得设计的差错尽可能在最初的时候就能避免。

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值