您的当前位置:首页正文

ALU(算术逻辑运算单元)的设计

2020-03-12 来源:易榕旅网
EDA技术与应用实验报告(四)实验名称:ALU(算术逻辑运算单元)的设计姓学班时名:号:级:间:陈丹100401202电信(2)班2012.12.11南京理工大学紫金学院电光系一、实验目的

1、学习包集和元件例化语句的使用。2、学习ALU电路的设计。二、实验原理

1、ALU原理ALU的电路原理图如图1所示,主要由算术运算单元、逻辑单元、选择单元构成。图1ALU功能表如表1所示。表12、元件、包集

在结构体的层次化设计中,采用结构描述方法就是通过调用库中的元件或者已经设计好的模块来完成相应的设计。在这种结构体中,功能描述就像网表一样来表示模块和模块之间的互联。如ALU是由算术单元、逻辑单元、多路复用器互相连接而构成。而以上三个模块是由相应的VHDL代码产生的,在VHDL输入方式下,如果要将三个模块连接起来,就要用到元件例化语句。元件例化语句分为元件声明和元件例化。1、元件声明在VHDL代码中要引入设计好的模块,首先要在结构体的说明部分对要引入的模块进行说明。然后使用元件例化语句引入模块。元件声明语句格式:component引入的元件(或模块)名port(端口说明);endcomponent;注意:元件说明语句要放在“architecture”和“begin”之间。2、元件例化语句为将引入的元件正确地嵌入到高一层的结构体描述中,就必须将被引用的元件端口信号与结构体相应端口信号正确地连接起来,元件例化语句可以实现该功能。元件例化语句格式:标号名:元件名(模块名)portmap(端口映射);标号名是元件例化语句的唯一标识,且结构体中的标识必须是唯一的;端口映射分为:位置映射、名称映射。位置映射指portmap中实际信号的书写顺序与component中端口说明中的信号书写顺序一致,位置映射对书写顺序要求很严格,不能颠倒;名称映射指portmap中将引用的元件的端口信号名称赋予结构体中要使用元件的各个信号,名称映射的书写顺序要求不严格,顺序可以颠倒。3包集在实体及结构体中定义的对象、数据类型,对另外代码的实体是不能使用的。但是在同一工程的不同VHDL文件中,有些对象、数据类型、子程序等常常被重复使用。为方便VHDL代码的编写,简化电路设计,故引入包集。包集也称为程序包。包集主要由两部分组成:程序包说明和程序包体。其中,程序包体是可选的,一般程序包说明列出所有项的名称,而程序包体给出各项的细节。程序包说明中包含的内容很多,只要是通用的全局量,都可以在程序包中加以说明。主要内容如下:★对象(常量、变量、信号)的数据类型说明。★对象(常量、变量、信号)子类型的数值范围说明。★函数与过程说明。★元件语句说明。程序包说明的书写格式如下:package程序包名is说明语句;end程序包名;程序包名:设计者自定义便于记忆的标识符。说明语句:包括各种类型的说明语句。程序包体书写格式如下:packagebody程序包名is52顺序语句;end程序包名;注意:程序包定义的内容不是自动可见的,不是自动被使用。若某个实体及结构体设计需要使用程序包,可以使用use语句制定要使用的程序包。如:usework.程序包名.all;三、实验内容

1、算术单元arith_unitlibraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityarith_unitisport(a,b:instd_logic_vector(7downto0);sel:instd_logic_vector(2downto0);cin:instd_logic;x:outstd_logic_vector(7downto0));end;architecturerhgofarith_unitisbeginwithselselectx<=awhen\"000\a+1when\"001\a-1when\"010\bwhen\"011\b+1when\"100\b-1when\"101\a+bwhen\"110\a+b+cinwhenothers;endrhg;仿真结果:2、逻辑单元logic_unitlibraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitylogic_unitisport(a,b:instd_logic_vector(7downto0);sel:instd_logic_vector(2downto0);x:outstd_logic_vector(7downto0));end;architecturerhgoflogic_unitisbeginwithselselectx<=notawhen\"000\notbwhen\"001\aandbwhen\"010\aorbwhen\"011\anandbwhen\"100\anorbwhen\"101\axorbwhen\"110\not(axorb)whenothers;endrhg;仿真结果:3、多路复用器sellibraryieee;useieee.std_logic_1164.all;entityselisport(sel:instd_logic;arith:instd_logic_vector(7downto0);logic:instd_logic_vector(7downto0);y:outstd_logic_vector(7downto0));end;architecturerhgofselisbeginwithselselecty<=arithwhen'0',logicwhenothers;end;仿真结果:4、包集packagealulibraryieee;useieee.std_logic_1164.all;packagealuiscomponentarith_unitisport(a,b:instd_logic_vector(7downto0);sel:instd_logic_vector(2downto0);cin:instd_logic;x:outstd_logic_vector(7downto0));endcomponent;componentlogic_unitisport(a,b:instd_logic_vector(7downto0);sel:instd_logic_vector(2downto0);x:outstd_logic_vector(7downto0));endcomponent;componentselisport(sel:instd_logic;arith:instd_logic_vector(7downto0);logic:instd_logic_vector(7downto0);y:outstd_logic_vector(7downto0));endcomponent;componentclk_4isport(clk:instd_logic;y:bufferstd_logic_vector(3downto0));endcomponent;endalu;5、clk_4libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityclk_4isport(clk:instd_logic;y:bufferstd_logic_vector(3downto0));end;architecturerhgofclk_4isbeginprocess(clk)variables:std_logic_vector(3downto0);beginifclk'eventandclk='1'thenifs=\"1111\"thens:=\"0000\";elses:=s+1;endif;endif;y<=s;endprocess;endrhg;仿真结果:6、主程序alu_unitlibraryieee;useieee.std_logic_1164.all;usework.alu.all;entityalu_unitisport(a,b:instd_logic_vector(7downto0);clk:instd_logic;cin:instd_logic;selout:outstd_logic_vector(3downto0);y:outstd_logic_logic_vector(7downto0));end;architecturethgofalu_unitissignalx1,x2:std_logic_vector(7downto0);signalx3:std_logic_vector(7downto0);beginu1:arith_unitportmap(a,b,x3(2downto0),cin,x1);u2:logic_unitportmap(a,b,x3(2downto0),x2);u3:selportmap(x3(3),x1,x2,y);u4:clk_4portmap(clk,x3);selout<=x3;end;仿真结果:管脚配置:四、小结与体会

通过这次实验我知道了什么是顺序关联法和名称关联法以及他们的区别。在VHDL代码中要引入设计好的模块,首先要在结构体的说明部分对要引入的模块进行说明。然后使用元件例化语句引入模块。掌握了如何使用多个模块编译代码,掌握了如何使用包集。

注意每次运行检验的时候都要将文件置顶,否则编译无法通过。

因篇幅问题不能全部显示,请点此查看更多更全内容