一、实验目的
1.熟悉多路复用器、加法器的工作原理。
2.学会使用 VHDL 语言设计多路复用器、加法器。
3.掌握 generic 的使用,设计 n-1 多路复用器。
4.兼顾速度与成本,设计行波加法器和先行进位加法器。
二、实验内容
1.用 VHDL 语言设计 8 重 3-1 多路复用器;
2.用 VHDL 语言设计 n-1 多路复用器,调用该 n-1 多路复用器定制为 8-1
多路复用器。
3.用 VHDL 语言设计 4 位行波进位加法器。
4.用 VHDL 语言设计 4 位先行进位加法器。
三、实验方法
使用Quartus II软件完成VHDL程序。
四、实验步骤和实验过程
1.用VHDL语言设计8重3-1多路复用器
① 理解题意,题目要求完成一个三选一的多路复用器,输入为一个两位数据(涵盖三种选择情况),选出一个八位的数据。
② 打开Quartus II,新建工程,编写源代码。
a.新建工程。【Create A New Project】->【Next】->设置文件路径为全英路径+设置project name为fuyongqi_8_3_1 ->【Next】->【Next】->Family 框处选择【Cyclone】->【Next】->【Next】->【Finish】。工程创建完毕。
b.新建编程文件。【File】->【New】->【VHDL File】,编程文件创建完毕。
③ 写好源代码,保存文件。(如图为源代码,VHDL实现)
LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity fuyongqi_8_3_1 is
port (x,y,z:in std_logic_vector(7 downto 0);
s:in std_logic_vector(1 downto 0);
d:out std_logic_vector(7 downto 0));
end fuyongqi_8_3_1;
architecture shixian of fuyongqi_8_3_1 is
begin
d <= x when s="00" else
y when s="01" else
z when s="10" else
"XXXXXXXX";
end shixian;
④ 编译与调试。确保顶层实现的命名和工程名一致。点击【processing】-【star compilation】或者
,进行文件编译,编译成功。
⑤ 查看RTL视图。【Tools】->【Netlist Viewer】->【RTL Viewer】
⑥ 结果分析及结论。如RTL图所示:
a.当输入为00时,第一个复用器DATAB打开,允许y信号输入;第二个复用器DATAB打开,允许z信号输入,同时拒绝了第一个复用器传递的y,最终输出x数据。
b.当输入为01时,第一个复用器DATAB打开,允许y信号输入;第二个复用器DATAA打开,允许第一个复用器传递的y通过,最终输出y数据。
c.当输入为10时,第一个复用器DATAA打开,允许z信号输入;第二个复用器DATAA打开,允许第一个复用器传递的z通过,最终输出z数据。
⑦ 功能仿真的波形及验证。新建一个vector waveform file,按照程序所述插入所有输入输出节点。
a.新建波形文件。【File】->【New】->【Vector Waveform File】->【OK】->双击->【Node Finder】->pins=all;【list】->【>>】->【OK】->【OK】->设置X、Y的波形图->保存文件
b.生成网表,功能仿真。【Processing】->【Simulation Tool】->【Simulation mode】框选择【Functional】->【Generate Functional Simulation Netlist】。生成网表成功。
网表生成后才可以功能仿真。【Processing】->【Start Simulation】
功能仿真波形如下图:
c.结果分析及结论
0-10.0ns,s=00,输出d=x=1,仿真无误。
40.0-50.0ns,s=01,输出d=y=2,,仿真无误。
80.0-90.0ns,s=10,输出d=z=3,仿真无误。
其余时间无输入,对应也就没有输出。
⑧ 实现时序仿真。【Processing】->【Simulation Tool】->【Simulation mode】框选择【Timing】->【Start】。
a.时序仿真成功。
时序仿真波形图如图所示:
b.结果分析及结论
0-10.0ns,s=00,输出d=x=1(00000001),仿真无误。
10.0-20.53ns,无输入,因为存在延时,输出d=x=1(00000001)。
40.0-48.45ns,s=01,输出应为d=y=2(00000010),因为存在延时,无输出。
48.45-50.0ns,s=01,输出d=y=2(00000010),,仿真无误。
50.0-59.56ns,无输入,因为存在延时,输出d=y=2(00000010)。
80.0-88.08ns,s=10,输出应为d=z=3(00000011),因为存在延时,无输出。
88.08-90.0ns,s=10,输出d=z=3(00000011),仿真无误。
90.0-97.74ns,无输入,因为存在延时,输出d=z=3(00000011)。
c.编译【classic timing analysis】-在compilation report中选择【timing analysis】-【tpd】(引脚到引脚的延时)
从S0到d0耗时最长,为10.407ns,从x1到d1耗时最短,为7.243ns,可结果由耗时最长的那个决定,故整体耗时为10.407ns。
(注:因后续三个VHDL语言设计的实现和第一个设计操作相近,故后续两个实现操作步骤略去)