hnu 数字电路 实验3.1 ALU

一、实验目的
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语言设计的实现和第一个设计操作相近,故后续两个实现操作步骤略去)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值