习题3.1比较常用硬件描述语言VHDL、Verilog和ABEL语言的优劣。1.VHDL:描述语言层次较高,不易控制底层电路,因而对综合器的性能要求较高。有多种EDA工具选择,已成为IEEE标准。应用VHDL进行工程设计的优点是多方面的,具体如下:(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力。(2)VHDL具有丰富的仿真语句和库函数,使得在任何大系统的设计早期,就能查验设计系统的功能可行性,随时可对系统进行仿真模拟,使设计者对整个工程的结构和功能可行性做出判断。(3)VHDL语句的行为描述能力和程序结构,决定了它具有支持大规模设计的分解和已有设计的再利用功能。(4)用VHDL完成一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动把VHDL描述设计转变成门级网表(根据不同的实现芯片)。(5)VHDL对设计的描述具有相对独立性。(6)VHDL具有类属描述语句和子程序调用等功能,对于完成的设计,在不改变源程序的条件下,只需改变类属参量或函数,就能轻易地改变设计的规模和结构。2.Verilog:设计者需要了解电路的结构细节,对综合器的性能要求较低。有多种EDA工具选择,已成为IEEE标准。3.ABEL:设计者需要了解电路的结构细节,对综合器的性能要求较低。支持ABEL的综合器只有一家,ABEL正朝国际化标准努力。3.2VHDL程序一般包括几个组成部分?每部分的作用是什么?(1)三个基本组成部分:库、程序包使用说明,实体描述和实体对应的结构体描述。(2)库、程序包使用说明:用于打开调用本设计实体将用到的库、程序包实体描述:用于描述该设计实体与外界的接口信号说明结构体描述:用于描述该设计实体内部的组成及内部工作的逻辑关系结构体配置语句主要用于层次化的方式对特定的设计实体进行元件的例化,或是为实体选定某个特定的结构体3.3VHDL语言中数据对象有几种?各种数据对象的作用范围如何?各种数据对象的实际物理含义是什么?(1)数据对象有三种:变量、常量、信号(2)常量的作用范围取决于其所定义的位置。若在程序包中定义,则可以用在调用该程序包的所有设计实体中。若定义在实体中,则可在这个实体的所有结构体中使用。若定义在结构体中,则只能用于该结构体。若定义在进程/子程序中,则只能用于该进程/子程序。变量属于局部量,作用范围仅限于所定义的进程或子程序内部。信号属于全局量,作用范围取决于其所定义的位置。若在程序包中定义,则可以用在调用该程序包的所有设计实体中。若定义在实体中,则可在这个实体的所有结构体中使用。若定义在结构体中,则只能用于该结构体。(3)信号表示硬件中的连线,用于各并行语句模块之间的通信。变量一般用于存储局部/临时数据。常量表示电路中的恒定电平,可使代码中常数易于阅读和修改。3.4什么叫标识符?VHDL的基本标识符是怎样规定的?(1)标识符用来定义常量、变量、信号、端口、子程序或者参数的名字。(2)VHDL的基本标识符就是以英文字母开头,不连续使用下划线,不以下划线结尾的,由26个英文大小写字母,数字0-9以及下划线组成的字符串。3.5信号和变量在描述和使用时有哪些主要区别?(1)变量只能在进程或子程序内部定义,用于存储局部/临时数据。信号只能在进程或子程序的外部定义,表示硬件中的连线,用于各并行语句模块之间的通信。(2)信号用signal关键字定义,赋值符号为”=”。变量用variable关键字定义,赋值符号为”:=”(3)信号赋值,可以设定延时量,需要延时一段时间后才执行;变量赋值立即执行。3.6VHDL语言中的标准数据类型有哪几类?用户可以自己定义的数据类型有哪几类?并简单介绍各数据类型。(1)标量型:属单元素最基本的数据类型,通常用于描述一个单值数据对象,它包括实数类型、整数类型、枚举类型和时间类型。复合类型:可以由细小的数据类型复合而成,如可有标量复合而成。复合类型主要有数组型和记录型。存取类型:为给定的数据类型的数据对象提供存取方式。文件类型:用于提供多值存取类型。(2)用户可自定义的数据类型:枚举类型、整数类型、数组类型、记录类型、时间类型、实数类型等3.7BIT数据类型和STD_LOGIC数据类型有什么区别?BIT数据类型只能取值0或1,而STD_LOGIC数据类型是BIT数据类型的扩展,除了0和1外,还包括7种数据类型,分别是U,X,Z,W,L,H,_3.8用户怎样自定义数据类型?试举例说明。利用类型定义语句TYPE和子类型定义语句SUBTYPE实现。如TYPEWEEKIS(SON,MON,TUE,WED,THU,FRI,SAT)SUBTYPEDIGITSINTEGERRANGE0TO93.9VHDL语言有哪几类操作符?在一个表达式中有多种操作符时应按怎样的准则进行运算?下列三个表达式是否等效:①A=NOTBANDCORD;②A=(NOTBANDC)ORD;③A=NOTBAND(CORD).(1)主要有四种操作符逻辑运算符,关系运算符,算术运算符,符号运算符此外还有重载运算符。(2)按照操作符的优先级高低进行运算(3)这三个表达式不等效。1式表达错误,对同一优先级的不同运算符应加上括号。2和3VHDL操作符优先级:(关系操作符的结果只有TRUE或FALSE两种。)3.10简述六种移位操作符SLL、SRL、SLA、SRA、ROL和ROR的含义及操作规定?并举例说明。(1)SLL:逻辑左移,bit或布尔一维数组SRL:逻辑右移,bit或布尔一维数组SLA:算数左移,bit或布尔一维数组SRA:算数右移,bit或布尔一维数组ROL:逻辑循环左移,bit或布尔一维数组ROR:逻辑循环右移,bit或布尔一维数组(2)A=“10010101Asll2得01010100(逻辑左移,用'0'填补空位)Asrl3得00010010(逻辑右移,用'0'填补空位)Asla3得10101111(算术左移,用最左端位填补空位)Asra2得11100101(算术右移,用最右端位填补空位)Arol3得10101100(循环左移)Aror5得10101100(循环右移)3.11什么叫重载操作符?使用重载操作符有什么好处?怎样使用重载操作符?含有重载操作符的运算怎样确定运算结果?(1)对已存在的操作符重新定义,使其能进行不同类型操作数之间的运算。(2)方便各种不同数据类型间的运算。(3)引用数据包:STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED和STD_LOGIC_即可使用重载操作符。3.12VHDL程序设计中的基本语句系列有几种?它们的特点如何?它们各使用在什么场所?它们各自包括些什么基本语句?答:(1)顺序语句与并行语句。(2)顺序语句的执行与它们的书写顺序基本一致(指仿真或逻辑上的顺序执行),但实际上硬件电路是并行工作的。顺序语句用在进程和子程序的内部。并行语句的执行与书写顺序无关,各语句是同时执行的,在执行过程中各并行语句之间可通过信号进行通信,同步运行;也可以互为独立、互不相关,异步运行。(3)顺序语句:变量/信号赋值语句,流程控制语句(if,case,loop,next,exit),等待语句,子程序调用语句,返回语句,空操作语句等。并行语句:进程语句,块语句,信号赋值语句,元件例化语句,生成语句,子程序调用等语句。3.13VHDL中信号赋值和变量赋值的有什么区别?其赋值符号是否异同?信号赋值延时更新数据,一般生成时序电路,用的是=变量赋值立即更新数据,一般生成组合电路,用的是:=(变量具有局部特征,它的有效性只局限于所定义的一个进程中,或一个子程序中,它是一个局部的、暂时性数据对象,对于它的赋值是立即发生的。信号具有全局特征,它不但可以作为一个设计实体内部各单元之间数据传送的载体,而且可通过信号与其他的实体进行通信,信号的赋值不是立即发生的,它发生在一个进程结束时。)3.14段下标元素和集合块元素是怎样赋值的?试举例说明。(1)段下标元素赋值目标表示形式:标识符(下标1TO或DOWNTO下标2)(其中下标1、下标2必须用具体数值表示,并且其数值范围必须在所定义的数组下标范围内)例如:VARIABLEa,b:STD_LOGIC_VECTOR(1TO4)b(1TO4):=”1011”;a:=b;a(1TO2):=b(3TO4);--a(1)=’1’,a(2)=’1’;a(1TO4):=”1011”;(2)集合块元素3.15转向控制语句有几种?它们各用在什么场所?它们使用时特别需要注意什么?IF语句;CASE选择语句;LOOP循环语句;NEXT语句和EXIT语句(1)if条件表达式1then顺序语句;elsif条件表达式2then顺序语句;else条件表达式nthen顺序语句;endif;if语句可根据一个或多个布尔条件,有选择的执行指定的顺序语句。使用时应注意:1.关键字then后可包含一个或多个顺序语句。2.elsif子句可以有多个或没有,每个elsif子句执行时具有向前与的作用。3.else子句可以没有。4.关键字then后的顺序语句可以是if语句,即if语句可以嵌套。(2)case选择表达式iswhen选择值1=顺序语句;when选择值2=顺序语句;......endcase;case语句可根据一个表达式的不同取值执行不同的顺序语句。使用时应注意:1.表达式的值可以是整型或枚举型的,或是这些数据类型构成的数组。2.选择值可以是单个取值,如4;也可以是一个取值范围,如2to5;也可以是多个并列的取值,如2|6;还可以是以上三种取值方式的混合。3.case语句执行时,根据选择表达式的值来选择执行哪个顺序语句,选择的结果和每个选择值的顺序无关,只要求对于选择表达式的每个可能取值,有且仅有一个选择值与之匹配即可。4.常用whenothers表示其它未列出的选择值。5.“=”后面的顺序语句可以有多个。(3)[标号:]for循环变量in范围loop[标号:]while条件loop顺序语句;顺序语句;endloop[标号];endloop[标号];for循环用于循环次数已知的情况;while循环用于循环次数未知的情况。使用时应注意:for循环中的循环变量无需事先定义,可自动加/减1。(4)next;无条件中止当前循环,返回循环起点,开始下次循环。exit;无条件退出当前循环。nextloop标号;无条件中止LOOP标号标明的循环,返回LOOP标号处,开始下次循环。exitloop标号;无条件退出LOOP标号标明的循环。nextloop标号when条件;条件为真时中止LOOP标号标明的循环,返回LOOP标号处,开始下次循环。exitloop标号when条件;条件为真时退出LOOP标号标明的循环。3.16在CASE语句中在什么情况下可以不要WHENOTHERS语句?在什么情况下一定要WHENOTHERS语句?答:case语句执行时,根据选择表达式的值来选择执行哪个顺序语句,要求对于选择表达式的每个可能取值,有且仅有一个选择值与之匹配。因此,当已列出的选择值能够覆盖选择表达式的所有可能取值时,可以不要whenothers语句。否则,要用whenothers表示其它未列出的选择值。3.17FOR-LOOP语句应用于什么场合?循环变量怎样取值?是否需要事先在程序中定义?在重复的次数已知的情况下可以使用该语句。循环变量的取值是根据系统的功能要求给定的,要事先在程序上定义。3.18分别用IF语句、CASE语句设计一个四—十六译码器。a:用IF语句设计一个四-十六译码器PROCESS(G1,g2a,g2b,sel)beginif(g1='1'andg2a='0'andg2b='0')thenif(sel=0000)theny=1111111111111110;elsif(sel=0001)theny=1111111111111101;elsif(sel=0010)theny=1111111111111011;elsif(sel=0011)theny=1111111111110111;el