一、实验目的
1.了解简易模型机的内部结构和工作原理。
2.分析模型机的功能,设计 8 重 3-1 多路复用器。
3.分析模型机的功能,设计 8 重 2-1 多路复用器。
4.分析模型机的工作原理,设计模型机控制信号产生逻辑。
二、实验内容
1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器
多路复用器是一个组合电路,它可以从多个输入中选择一个输入,将其数据 传输到输出。选择哪一路数据输入由一组选择输入变量控制。通常, 2 n 条数据输 入要 n 个选择输入,选择输入的位组合决定选择哪个数据输入。 8 重 3-1 多路复用器有 3 个数据输入、2 位选择输入、1 个输出,每个数据输 入和输出都是 8 位,所以称之为 8 重,S 选择将哪个数据输入传至输出,8 重 3- 1 多路复用器的引脚如图所示:
引脚之间的相互关系如下表所示:
2、用 VERILOG 语言设计模型机的 8 重 2-1 多路复用器
8 重 2-1 多路复用器有 2 个数据输入、1 个选择输入、1 个输出,每个数据输 入和输出都是 8 位,S 选择将哪个数据输入传至输出,8 重 2-1 多路复用器的引 脚如图所示:
引脚之间的相互关系如下表所示:
3.用 VERILOG 语言设计模型机的控制信号产生逻辑。
控制信号产生逻辑接收指令译码器的输出,在 SM、IR[7…0]以及状态位 G 的配合下产生每个模块所需要的控制信号。 控制信号产生逻辑的输入输出引脚如下图所示:
三、实验过程
1、8重3-1多路复用器
A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
首先定义模块名,与项目名称相同。 声明输入变量和输出变量如图。包括三个 8 位的输入 a、b、c,由于三个数我们选择最少也要两位选择输入位,因此设置选 择输入信号 s 是两位二进制数,而输出就是 a 或 b 或 c 之一,因此是一个 8 位二进制数。 利用条件语句 if – else 语句,当然也可以使用 switch – case 语句进行条件判断。 激活选择器逻辑变化的条件是 s 选择信号发生改变。依照 次序,00 表示选择 a 信号,01 表示选择 b 信号,10 表示选择 c 信号,11 表 示选择 a 信号。事实上不应该出现 11 的 s 输入
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
警告信息:
资源消耗:
D) RTL 视图
视图分析及结论:
我们可以从 RTL 视图中看到,我们的三选一多路开关,其实是由 3 个二选一多路复用器并行接入,串行执行进行信号选择。
当我们输入 00 时,MUX1 选择低电平输出,并且接入 MUX2,此时 MUX2 又会选择低电平,MUX3 最终选择 a 数据进行输出得到我们要的数据。
当我们输入 01 时,MUX1 选择 8’h0,也就是低电平输出,并接入MUX2,此时 MUX2 选择 b 数据的输入进行输出,并且把它接入MUX3,此时 MUX3 选择输入的 b 数据,而不选择 c 数据,因此最终输出 b 数据。
当我们输入 10 时,MUX1选择 c 数据,接下来的两个选择器依次都是选择输入的 c 数据,最终输出 c 的数据。
E) 功能仿真波
结果分析及结论:
如图所示,当我们输入s信号为 00 时,输出的数据为 10000000 这与 a 信号相同,当我们输入的s信号为 01 时,输出的数据为01000000,这与输入的 b 的数据相同,当我们输入的s信号为 10 时,输出的数据为 00100000,这与输入的 c 信号相同,当我们输入s信号为 11(即其他) 时,输出的数据为 10000000 这与 a 信号相同。
综上验证,该逻辑能够完成信号的选择。
F) 时序仿真波
结果分析及结论:
观察上图我们可以看到输出波形,总体和功能仿真大无二致,但还是有一点小区别,就是在不同的输出之间有一小段短暂的失真,这是由于传输延迟造成。由于我们每一段验证信号的时间较短,都在 ns 级别,但是电路的传输延迟也在 ns 级别,因此这种延迟造成的误差看起来就显得不可以忽略了
G) 时序分析
操作方法是:编译后,在compilation report中选择【timing analysis】-【summary】和【tpd】
结果分析及结论:
由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。比如从 c[4]到 y[4]的最坏定时情况的 tpd 为 14.036ns。下面的tpd 报告表则给出了源节点和目标节点之间的 tpd 延迟间,比如第二行中 s[1]到 y[5] 的tpd 为 13.907ns。
2、8重2-1多路复用器
A)创建工程(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
首先定义模块名,与项目名称相同。 声明输入变量和输出变量如图。包括两个 8 位的输入 a、b,由于只有两个数,我们设置选择输入信号s是一位二进制数,而输出就是 a 或 b 之一,因此是一个 8 位二进制数。 利用条件语句 if – else 语句,当然也可以使用 switch – case 语句进行条件判断。 激活选择器逻辑变化的条件是s选择信号发生改变。依照次序,0表示选择 a 信号,1 表示选择 b 信号。
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
警告信息:
资源消耗:
D) RTL 视图
结果分析及结论:
我们可以从 RTL 视图中看到,该电路为一个单独的二选一多路复用器并行
当我们输入 0时,MUX1 输出a数据;当我们输入 1时,MUX1输出 b 的数据。
E) 功能仿真波形
结果分析及结论:
如图所示,当我们输入s信号为 0 时,输出的数据为 10000000 这与 a 信号相同,当我们输入的s信号为 1 时,输出的数据为00000011,这与输入的 b 的数据相同。
综上验证,该逻辑能够完成信号的选择。
F) 时序仿真波形
结果分析及结论:
1、观察上图我们可以看到输出波形,总体和功能仿真大无二致,但还是有一点小区别,就是在不同的输出之间有一小段短暂的失真,这是由于传输延迟造成。由于我们每一段验证信号的时间较短,都在 ns 级别,但是电路的传输延迟也在 ns 级别,因此这种延迟造成的误差看起来就显得不可以忽略了
2、时序仿真可以用来验证程序在目标器件中的时序关系。同时考虑了器件的延迟后,其输出结果跟接近实际情况,但是考虑的情况过多,不容易操作,容易产生错误。时序仿真不仅反应出输出和输入的逻辑关系,同时还计算了时间的延时信息,是与实际系统更接近的一种仿真结果。
G) 时序分析
结果分析及结论:
由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。比如从s到 y[6]的最坏定时情况的 tpd 为 15.022ns。下面的tpd 报告表则给出了源节点和目标节点之间的 tpd 延迟间,比如第二行中 s到 y[3] 的tpd 为14.88ns。
3、控制信号产生逻辑
A)创建工程(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
首先要声明输入和输出变量,包括几种输入指令以及 ir。
但是由于不同的指令需要的提供的信号较为复杂,为了避免错误。我们可以先列一个真值表。
当我们书写所需信号的真值的时候。我们按行书写。依照信号传递以及需要的信号,我们把需要的信号是 1 还是 0 写上。
但是判断输出信号的值时候,我们纵向查看表。例如这里的we信号是执行区间的信号。它为 1 的情况只有在 mova=1 或者 movc = 1 或者 movd= 1 或者 movi=1或者add=1或者sub=1或者in=1成功执行的时候才为一。这么读下来,就能够发现。需要将这几种情况“或”起来,最终就是我们要的表达式。
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
警告消息:
资源消耗:
D) RTL 视图
结果分析及结论:
由视图可得,视图左边为输入,右边为输出。其中连接有一系列的元器件。比如比较器:当输入相等时输出 1,不相等时输出 0;还有大部分的与或门。图中输入信号为 sm 等15个,输出信号包括 reg_sr 等16种情况。各个输出端口之间通过导线相连。
经过检验,RTL 电路逻辑与逻辑表达式含义一致。
E) 功能仿真波形
结果分析及结论:
我们可以一一验证,经过检验发现与我所写的真值表输出结果一致。
F) 时序仿真波形
结果分析及结论:
1、观察上图我们可以看到输出波形,总体和功能仿真大无二致,但还是有一点小区别,就是在不同的输出之间有一小段短暂的失真,这是由于传输延迟造成。由于我们每一段验证信号的时间较短,都在 ns 级别,但是电路的传输延迟也在 ns 级别,因此这种延迟造成的误差 看起来就显得不可以忽略了。
2、时序仿真可以用来验证程序在目标器件中的时序关系。同时考虑了器件的延迟后,其输出结果跟接近实际情况,但是考虑的情况过多,不容易操作,容易产生错误。时序仿真不仅反应出输出和输入的逻辑关系,同时还计算了时间的延时信息,是与实际系统更接近的一种仿真结果。
G) 时序分析
结果分析及结论:
由图可得,Timing Analyzer Summmary 总结所有经典定时分析的结果,并报告每个定时特性的最坏情况定时。比如从mova 到 reg_sr[1] 的最坏定时情况的 tpd 为 17.984ns。下面 的 tpd 报告表则给出了源节点和目标节点之间的 tpd 延迟时间,比如第二行中 add 到reg_sr[1] 的 tpd 为17.861ns。
四、思考题
1、任选一条指令,介绍指令的过程、信息流动的情况以及执行时控制信号的值。
mova指令:
要求完成的操作:源寄存器 Rs 中的数据写入目的寄存器 Rd,即(Rs)→Rd。
执行过程:根据控制信号 SR1、SR0 选择源寄存器 Rs 的数据从通用寄存器 S 口输出, 在 AC3~AC0 和 AU_EN 的控制下,经 AU 送入总线 BUS;S0 为 1,BUS 上的数据传送至 通用寄存器的输入端;在 WE 和 DR1、DR0 的控制下,时钟下降沿将输入端的数据写入目 的寄存器 Rd。
首先此时是执行指令,因此 LDPC 以及 INPC 都是 0;该过程不涉及 RAM 的读写操作,因此 RE 和 WR 都是 0;然后不是取指令周期,所以 SM_EN为1;SM 是 1,表示执行指令。 然后涉及到的部分,也就是示意图的右半部分。首先我们根据控制单元输出的信号 SR 和 DR 信号可以对应到通用寄存器组中具体的两个寄存器,一个作为源寄存器,另一个是目的寄存器。这里我们假设 A 是源寄存器,B 是目的寄存器。 他们分别从 D 通道和 S 通道读出去。进入算术单元;经总线运输后经过2_1选择器进入目的寄存器,完成执行指令周期。
2、如何产生正确的控制信号以及具体的编程实现?
首先要声明输入和输出变量,包括几种输入指令以及 ir。 但是由于不同的指令需要的提供的信号较为复杂,为了避免错误。我们可以先列一个真值表。
当我们书写所需信号的真值的时候。我们按行书写。依照信号传递以及需要的信纵向查看表。将信号为1的指令情况“或”起来,最终就是我们要的表达式
五、实验总结、必得体会及建议
1、从需要掌握的理论、遇到的困难、解决的办法以及经验教训等方面进行总结。
(1)需要掌握的理论:基本了解了简易模型机的内部结构和工作原理。同时学会使用 Verilog 语言编写简单电路。
(2)遇到的困难:对于 QuartusII 的使用还不够熟练,特别是进行波形仿真的功能仿真和 时序仿真时花费时间过长。
(3)解决方法:通过上网查询相关资料,与同学一起讨论,并请教老师。
(4)经验教训:不懂的地方要多向老师请教,对于电路的搭建要多动手,要学会利用好软 件工具,不仅是在实验中,在平时的学习中也要学会利用工具。
2、对本实验内容、过程和方法的改进建议(可选项)。
编写程序前列写的真值表非常重要,一定要理解通透。