一、实验目的
1.了解简易模型机的内部结构和工作原理。
2.分析模型机的功能,设计 ALU 和移位逻辑。
3.分析模型机的工作原理,设计模型机控制信号产生逻辑。
二、实验内容
1.用 VHDL 语言设计模型机的 ALU 模块;
2.用 VHDL 语言设计模型机的移位模块;
3.用 VHDL 语言设计模型机的控制信号产生逻辑。
三、实验方法
使用Quartus II软件完成VHDL程序。
四、实验步骤和实验过程
1.用VHDL语言设计模型机的ALU模块
① 理解题意,题目要求完成模型机的ALU模块,根据信号M和S4S0),对S和D进行不同的操作,输出不同的T信号和ZF,CF信号。M=1时,进行算术运算操作,S4S0=1001时执行加法操作,S4~S0=0110时执行减法操作,并将进位/借位位通过CF输出,运算结果为0时,ZF=1,否则ZF=0;M=0时,进行对应的逻辑运算操作,CF,ZF信号保持不变。
② 打开Quartus II,新建工程,编写源代码。
a.新建工程。【Create A New Project】->【Next】->设置文件路径为全英路径+设置project name为ALU_built ->【Next】->【Next】->Family 框处选择【Cyclone】->【Next】->【Next】->【Finish】。工程创建完毕。
b.新建编程文件。【File】->【New】->【VHDL File】,编程文件创建完毕。
写好源代码,保存文件。
LIBRARY IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ALU_built is
port(M:in std_logic;
sl:in std_logic_vector(3 downto 0);
S:in std_logic_vector(7 downto 0);
D:in std_logic_vector(7 downto 0);
T:out std_logic_vector(7 downto 0);
cf,zf:out std_logic);
end ALU_built;
architecture achieve of ALU_built is
signal x,trans1,trans2:std_logic_vector(8 downto 0);
begin
trans1<='0'&D;
trans2<='0'&S;
process(S,D,M,sl)
begin
if(M='0') then
if(sl="1001") then
x<=trans1+trans2;
cf<=x(8);
T<=x(7 downto 0);
if(x="00000000") then zf<='1';
else zf<='0';
end if;
elsif(sl="0110") then
x<=trans1+('0'&((not trans2(7 downto 0)+1)));
cf<=not x(8);
if(x(8)='1') then T<=x(7 downto 0);
else T<=not(x(7 downto 0))+1;
end if;
if(x="00000000") then zf<='1';
else zf<='0';
end if;
elsif (sl="1111") then
x<=trans2;
T<=x(7 downto 0);
zf<='0';
cf<='0';
elsif (sl="1010") then
x<=trans1;
T<=x(7 downto 0);
zf<='0';
cf<='0';
else
zf<='0';
cf<='0';
T<="00000000";
end if;
end if;
if(M='1') then
if(sl="1011") then
x<=trans1 or trans2;
T<=x(7 downto 0);
elsif(sl="0101") then
x<=not trans1;
T<=x(7 downto 0);
else
T<="00000000";
end if;
end if;
end process;
end achieve;
(如图为源代码,VHDL实现)
④ 编译与调试。确保顶层实现的命名和工程名一致。点击【processing】-【star compilation】或者
,进行文件编译,编译成功。
⑤ 查看RTL视图。【Tools】->【Netlist Viewer】->【RTL Viewer】
⑥ RTL图如上图所示。可以明显看出,这个视图较为复杂,通过视图来判断逻辑是否正确难度较大,所以逻辑的正确性我们将通过后续的波形图来
⑦ 功能仿真的波形及验证。新建一个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-30.0ns时,M=0,sl=1001,进行加法运算。
0-10.0ns,T=S+D=15+63=78,此时无进位,进位位cf=0;T不为0,zf=0,输出无误。
10.0-20.0ns,T=S+D=0+0=0,此时无进位,进位位cf=0;T为0,zf=1,输出无误。
20.0-30.0ns,T=S+D=64+249=57(+266),此时进位位cf=1;T不为0,zf=0,输出无误。
40.0-70.0ns时,M=0,sl=0110,进行减法运算。
40.0-50.0ns,T=S-D=26-15=11,此时无借位,借位位cf=0;T不为0,zf=0,输出无误。
50.0-60.0ns,T=S-D=0-1=0,因为采用转化为补码运算,此时有借位,cf=1;T为0,zf=1,输出无误。
60.0-70.0ns,T=S-D=15-26=(-)11,此时借位位cf=1;T不为0,zf=0,输出无误。
80.0-90.0时,M=1,sl=1011,进行或逻辑运算。T=S OR D=12(00001100) OR 19(00010011)=31(00011111),输出无误。
100.0-110.0ns时,M=1,sl=0101,进行非逻辑运算。T=NOT D=NOT 63(00111111)=192(11000000),输出无误。
120.0-130.0ns时,M=1,sl=1111,输出S。T=S=27。输出无误。
140.0-150.0ns时,M=1,sl=1010,输出D。T=D=77。输出无误。
⑧ 实现时序仿真。【Processing】->【Simulation Tool】->【Simulation mode】框选择【Timing】->【Start】。
a.时序仿真成功。
时序仿真波形图如图所示:
b.结果分析及结论
可以看出,输出和功能仿真相比,集体都有一定的延时,除此之外,在一些本该低电平的地方突然出现了高电平,本该高电平的地方突然出现了低电平,这是时序仿真的过程中出现了冒险现象。
c.编译【classic timing analysis】-在compilation report中选择【timing analysis】-【tpd】(引脚到引脚的延时)
从T0到T0耗时最长,为10.411ns,从cf到cf耗时最短,为7.017ns,可结果由耗时最长的那个决定,故整体耗时为10.411ns。
(注:因后续三个VHDL语言设计的实现和第一个设计操作相近,故后续两个实现操作步骤略去)