eda知识点梳理_第1页
eda知识点梳理_第2页
eda知识点梳理_第3页
eda知识点梳理_第4页
eda知识点梳理_第5页
已阅读5页,还剩14页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、知识点:VHDL文字规则1. 数字型文字由数字、小数点和下划线组成(1)整数文字 5, 678, 156E2, 45_234_287(=45234287)(2)实数文字 188.993,88_670_551.453_909(3)以数制基数表示的文字格式:数制#数值#(指数)例如:10#170# 16#FE#2#1101_0001#8#376# 16#E#E14)物理量文字例如:60 s,100 m2. 字符串文字字符以单引号括起来的数字、字母和符号(ASCII码)例如:0,1,A,B,a,b字符串一维的字符数组,用双引号括起来。 (1)文字字符串例如:“ABC”,“A BOY.”,“A”, “

2、1011”(2)数值字符串位矢量格式:数制基数符号“数值字符串”其中: B二进制基数符号;O八进制基数符号;X16进制基数符号;例如:B“111_011_110”;矢量数组,长度为9O“15”;等效B“001101”,长度为6X“AD0”;等效B“101011010000”, 长度为12 数值字符串中可添加下划线,不影响其长度3. 标识符是用户给常量、变量、信号、端口、子程序或参数定义的名字规则(87标准, 又称短标识符):标识符由字母(AZ;az)、数字和下划线字符组成任何标识符必须以英文字母开头末字符不能为下划线不允许出现两个连续下划线标识符中不区分大小写字母VHDL定义的保留字或称关键字

3、,不能用作标识符VHDL93标准支持扩展标识符,以反斜杠来定界,允许以数字开头,允许使用空格以及两个以上的下划号。扩标用反斜杠界定。如:multi_screens。允许包含图形符号、空格符。如:mode A, $100等。反斜杠之间的字符可用保留字。如:buffer, entity等。扩标的界定符两个斜杠之间可以用数字打头。如:100$,2chip,4screens等。扩标中允许多个下划线相连。如:Four_screens, TWO_Computer_sharptor等。扩展标识符中的一个反斜杠,要用两个反斜杠来代替扩标区分大小写。如: EDA 与eda不同。扩标与短标不同。如:Compute

4、r 与Computer不同。 4.下标名数组用途:用于指示数组型变量或信号的某一个元素格式:标识符(表达式)例如:b(3);表示数组型变量或信号b的第3个元素5.段名多个下标名的组合用途:用于指示数组型变量或信号的某一段元素格式:标识符(表达式 方向 表达式)方向:TO下标序号由低到高 DOWNTO下标序号由高到低例如:D(7 DOWNTO 0);表示数据总线D7D0 D(5 TO 7 );表示数据总线D5D76.注释 VHDL中的注释由两个连续的短线(-)开始,直到行尾。 VHDL数据对象存放各种类型数据的容器,包括变量、常量、信号和文件 1. 变量(VARIABLE)规则:只能在进程(PR

5、OCESS)、函数(FUNCTION)和过程(PROCEDURE)中说明和使用的局域量定义格式:VARIABLE 变量名:数据类型(范围)(:=初始值) 如:VARIABLE a:INTEGER; VARIABLE b:INTEGER :=2; VARIABLE c:INTEGER RANGE 0 TO 7 :=2;变量赋值语句:目标变量名:=表达式例如:VARIABLE x,y:REAL VARIABLE a,b:BIT VECTOR(0 TO 7); x:=100.0; y:=1.5+x; a:=“10101011” a(3 TO 6):=(1,1,0,1); a(0 TO 5):=b(2

6、 TO 7);变量使用要点:变量是一个局部量,只能在进程和子程序中使用,不能将信息带出对它作出定义的当前设计单元。变量赋值立即发生,无延时行为。VHDL不支持变量附加延时语句。变量的初值不是必需的,综合器将略去所有初值。变量常用在实现某种算法的赋值语句中。2. 信号(SIGNAL)规则:信号是在结构体(ARCHITECTURE)、程序包(PACKAGE)和实体中声明的全局量。 信号定义格式:SIGNAL 信号名:数据类型(范围)(:=初值)例如:SIGNAL temp:STD LOGIC:=0; SIGNAL flaga,flagb:BIT SIGNAL data:STD LOGIC VECT

7、OR(15 DOWNTO 0); 信号赋值语句: 目标信号名=表达式例如:x=9; y=x; z=x AFTER 5 ns; 注意信号和变量赋值方法的区别:变量用“:=”号赋值,而信号用“=”赋值;在声明中对信号和变量赋初值,两者都用“:=”号。信号使用要点信号类似于连接线。信号可以作为设计实体中并行语句模块间的信息交流通道。信号不但可以容纳当前值,也可以保持历史值。这一属性与触发器的记忆功能有很好的对应关系。信号的初值不是必需的,而且仅在仿真中有效。信号的赋值允许允许设定延时,如:T1<=T2 AFTER 20 ns,但仅用于仿真。当信号用在顺序描述语句中时,其值在相应的进程,函数或过

8、程完成之后才更新。实体中定义的端口默认为信号。3. 常量(CONSTANT)规则:常量在程序前部定义,且一旦被赋值就不能再改变。常量定义格式:CONSTANT 常量名:数据类型:=初值;例如:CONSTANT fbus:BIT VECTOR:=“010111”;CONSTANT Vcc:REAL:=5.0;CONSTANT dely:TIME:=25 ns; 常量使用要点:常量设置使得设计实体中的常数易阅读和修改。如将位矢的宽度定义为一个常量,只要修改这个常量就能改变宽度,从而改变硬件结构。常量是一个恒定不变的值,一旦作了数据类型的赋值定义后,在程序中不能再改变,有全局意义。常量与表达式类型必

9、须一致,只能是标量类型或复合类型。常量的可视性(其使用范围取决于定义的位置):定义在程序包中的常量,具有最大全局化特征,可以用在调用此程序包的所有设计实体中;定义在设计实体中的常量,其有效范围为这个实体定义的所有的结构体;定义在设计实体的某一结构体中的常量,则只能用于此结构体;定义在结构体的某一单元的常量,如一个进程中,则这个常量只能用在这一进程中。4. 文件(FILE)(VHDL 1076-1993标准) 文件是传输大量数据的客体,包含一些专门数据类型的数值。在仿真测试时,测试的输入激励数据和仿真结果的输出都可用文件来进行。文件的声明方式为:FILE identifier : file_ty

10、pe OPEN mode IS “file_name”;VHDL数据类型VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且只有数据类型相同的量才能互相传递和作用。1. 标量型(Scalar Type)单元素的最基本数据类型(1)实数类型(2)整数类型(3)枚举类型(4)时间类型2. 复合类型(Composite Type) (1)数组型(Array) (2)记录型(Record) 3. 存取类型(Access Type)为数据对象提供存取方式 4.文件类型(Files Type)提供多值存取类型3.2.4 VHDL的预定义数据

11、类型在STD库中的标准程序包(STANDARD)中预先定义的数据类型。 1. 位(BIT)数据类型BIT是一个二值枚举类型,包括0和1。可用于表示变量、信号等数据对象的状态。定义语句:TYPE BIT IS(0,1) 2. 位矢量(BIT VECTOR)数据类型位矢量是由多个BIT组成的数组,BIT是其元素,形式为用双引号把多个BIT位括在一起,如“0011”。可用于表示总线的状态。定义语句:TYPE BIT VECTOR IS ARRAY(NATURAL RANGE)OF BIT;RANGE表示宽度未定,NATURAL表示其宽度的范围和自然数的范围相同规则:使用位矢量必须注明位宽,例如:SI

12、GNAL a:BIT VECTOR(7 DOWNTO 0);-定义a是一个宽为8位的位矢量,左为a(7)右为a(0);例: SIGNAL a:BIT_VECTOR(7 DOWNTO 0); SIGNAL b:BIT_VECTOR(3 DOWNTO 0); SIGNAL c:BIT; b<=“1110”; b(3)<=1; b<=a(7 DOWNTO 4); a(7 DOWNTO 4)<=a(3 DOWNTO 0); a(3 DOWNTO 0)<= b; a(7)<=C; 3. 布尔(BOOLEAN)数据类型BOOLEAN也是一个二值枚举类型,一个布尔量具有两

13、种状态:逻辑“假”(FALSE)和逻辑“真”(TRUE)。布尔量没有具体数值的含义,也不能进行算术运算,但是可以进行逻辑运算,并作为关系运算的结果。定义语句:TYPE BOOLEAN IS(FALSE,TRUE);-以枚举类型定义 4. 字符(CHARACTER)数据类型字符是用单引号括起来的ASCII码字符,如A a 0 9。字符有大小写区分,如B不同于b。定义语句:TYPE CHARACTER IS(ASCII码字符表中的全部字符) 5. 字符串(STRING)数据类型字符串是用双引号括起来的字符序列,也称字符矢量或字符串数组。例如,“A BOY.”,“10100011” 6. 整数(IN

14、TEGER)数据类型整数包括:正整数、负整数和零范围:32位带符号整数,即-(231-1)+(231-1) 即(-2147483647+2147483647) 整数常量的书写方式示例如下:2 -十进制整数10E4 -十进制整数16#D2# -十六进制整数2#11011010# -二进制整数硬件实现时,整数由不超过32位的二进制数来表示。 当端口类型设为整数型时一般应对其范围给予限定,这时端口的宽度为可以表示该整数的最小宽度;如没有限定范围,则综合后的位宽为32位。 如:SIGNAL s : INTEGER RANGE 0 TO 15; 表示信号 s 的取值范围是0-15,可用4位二进制数表示,

15、因此 s 将被综合成由四条信号线构成的信号。7.自然数(NATURAL)和正整数(POSITIVE)数据类型自然数和正整数都是整数的子集自然数包括0和正整数正整数不包括0的正整数 其定义如下:定义如下: SUBTYPE NATURAL IS INTEGER RANGE 0 TO INTEGERHIGH; SUBTYPE POSITIVE IS INTEGER RANGE 1 TO INTEGERHIGH;8. 实数(REAL)数据类型VHDL的实数类型类似于数学上的实数,或称浮点数。由正负号、小数点和数字组成。范围:-1.0E+38 TO +1.0E+38 实数常量的书写方式举例如下: 659

16、71.333333 -十进制浮点数 8#43.6#E+4 -八进制浮点数 43.6E-4 -十进制浮点数实数类型仅能在EDA仿真器中使用,因为其实现相当复杂,EDA综合器目前尚不支持。9. 时间(TIME)数据类型时间是物理量数据,由整数数据和单位两部分组成,整数和单位之间至少留一个空格,如55 ms,20 ns。时间及其他物理量数据可以用于仿真,但不可综合。定义如下:TYPE TIME IS RANGE 2147483647 TO 2147483647UNITSfs;-飞秒(10-15S)VHDL中的最小时间单位ps=1000fs;-皮秒ns=1000ps;-纳秒us=1000ns;-微秒m

17、s=1000us;-毫秒sec=1000ms;-秒min=60sec;-分hr=60min;-时END UNITS; 10.错误等级(Severity Level)错误等级属于枚举数据类型,用于表征系统的状态,包括:NOTE(注意),WARNING(警告),ERROR(出错),FAILURE(失败) 。在仿真过程中,可输出这4种值来提示被仿真系统当前的工作状态。其定义如下:TYPE SEVERITY_LEVEL IS(NOTE,WARNING,ERROR,FAILURE);3.2.5 IEEE预定义的标准逻辑位和矢量在IEEE库的程序包STD_LOGIC_1164中,定义了两个非常重要的数据类

18、型,即标准逻辑位STD_LOGIC 和标准逻辑矢量STD_LOGIC_VECTOR。 1. 标准逻辑位(STD LOGIC)数据类型 TYPE STD LOGIC IS(U,-未初始化的 X,-强未知的 0,-强0 1,-强1 Z,-高阻态 W,-弱未知的 L,-弱0 H,-弱1 -忽略); 两个或以上数字逻辑电路的输出端连接到同一个节点时,节点的电平该如何取值?节点的电平取值取决于:两者或多方当前的输出电平值;两者的驱动能力强弱。驱动能力强的电路可以将节点电平强行拉高或拉低,因此需建立多值逻辑系统加以细分。多个输出连接到同一个节点上时,节点的电平取值:数值关系归纳:X或-与其它数值连接时,最

19、终电平取值均为X;Z与其它数值连接时,最终电平取值均为其它数值;强逻辑和弱逻辑连接时,取强逻辑的数值;W与L/H数值连接时,最终电平取值均为W;0与1、L与H连接时,最终电平取值分别为X、W;2. 标准逻辑矢量(STD LOGIC VECTOR)数据类型标准逻辑矢量在电路中用来表示总线。其定义如下:TYPE STD LOGIC VECTOR IS ARRAY(NATURAL RANGE)OF STD LOGIC ; - RANGE表示宽度未定,NATURAL表示其宽度的范围和自然数的范围相同注意:在程序中使用上述两种数据类型前,需加入下面语句:LIBRARY IEEE;USE IEEE.STD

20、_LOGIC_1164.ALL;对标准逻辑位及标准逻辑位矢量赋值时,H L Z等不能用小写在9种逻辑值中,只有1 0 和Z可综合,其他仅用于仿真STD_LOGIC_VECTOR类型数据不能直接进行算术运算SIGNAL a: BIT;SIGNAL b: BIT_VECTOR(7 DOWNTO 0);SIGNAL c: STD_LOGIC;SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL e: INTEGER RANGE 0 TO 255;例:a<=b(3) 合法 b(2)<=a; c<=d(5); d(0)<=c; a<=c

21、; 非法 d<=b; e<=b; e<=d;1. 枚举类型(Enumerated)枚举该类型的所有可能的值。定义格式:TYPE 数据类型名 IS (元素,元素.,元素);例如:TYPE week IS (sun,mon,tue,wed,thu, fri,sat); TYPE my_logic IS (1,0,Z);枚举类型的编码: 综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0,以后的依次加1。编码用位矢量表示 ,位矢量的长度将取所需表达的所有枚举元素的最小值。如:TYPE color IS(blue, green, yellow, red); 编码为

22、: blue=“00”; green=“01”; yellow=“10”; red=“11”;2. 整数类型和实数类型定义格式:TYPE 数据类型名 IS RANGE 范围;例如:TYPE num1 IS RANGE 0 TO 100; 3. 数组类型 数组是将相同数据类型的数据集合在一起形成的一种新的数据类型。可以是1D、2D或1D*1D,更高维数的数组往往是不可综合的。 数组的结构:VHDL中预定义的数据类型仅包括标量类型(单个位)和矢量类型(一维数组)两类,并没有预定义2D和1D*1D数组,用户可以自定义。定义格式:TYPE 数组名 IS ARRAY (数据范围) OF 数据类型;例如:

23、TYPE data_bus IS ARRAY (7 DOWNTO 0) OF STD_LOGIC;-定义数据总线,下标由高到低,即D7位权值最高,D0位权值最低。TYPE data_bus IS ARRAY (0 TO 7) OF STD_LOGIC;-定义数据总线,下标由低到高,即D0位权值最高,D7位权值最低。一种定义1D*1D数组的方法: TYPE row IS ARRAY (7 DOWNTO 0) OF STD_LOGIC;-1D数组; TYPE matrix IS ARRAY (0 TO 3) OF row; -1D*1D数组,矢量数组; SIGNAL x:matrix; -声明是1

24、D*1D信号另一种定义1D*1D数组的方法: TYPE matrix IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0);二维数组的定义方法: TYPE matrix2D IS ARRAY(0 TO 3,7 DOWNTO 0) OF STD_LOGIC; 数组的赋值方法:x<=“0001”;对一维数组赋值x<= (0, 0,0,1,);对一维数组赋值y<=(0, 0,0,1,),(0, 0,0,1,);对1×1维或二维数组赋值4. 记录类型(Record)记录是一组不同数据类型的元素的组合。定义格式:TYPE 记录类型

25、名 IS RECORD元素名:元素数据类型;元素名:元素数据类型;:END RECORD 记录类型名 ;访问记录体元素的方式:记录体名.元素名TYPE a_and_b IS RECORD a : STD_LOGIC_VECTOR(7 DOWNTO 0); b : INTEGER RANGE 0 to 3; END RECORD ; SIGNAL x, y, z : a_and_b ; SIGNAL data : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL num : INTEGER ; . x.a <= “11110000” ; x.b <= 2 ;

26、data <= y.a ; num <= y.b ; z <= x ; 数据类型转换 由于VHDL是一种强类型语言,不同类型的数据对象必须经过类型转换,才能相互操作。常见的实现数据类型转换的方法有以下两种:写一段专用于数据类型转换的VHDL代码调用程序包中预定义的数据类型转换函数,如程序包STD_LOGIC_1164。 IEEE库中提供了若干数据类型转换函数: STD_LOGIC_1164程序包定义的转换函数:函数 TO_STDLOGICVECTOR(A)-由位矢量BIT_VECTOR转换为标准逻辑矢量STD_LOGIC_VECTOR函数 TO_BITVECTOR(A) -由

27、标准逻辑矢量STD_LOGIC_VECTOR转换为位矢量BIT_VECTOR函数 TO_STDLOGIC (A) -由BIT转换为STD_LOGIC函数 TO_BIT(A) -由标准逻辑STD_LOGIC转换BITSTD_LOGIC_ARITH程序包定义的转换函数:函数 CONV_STD_LOGIC_VECTOR(A,B)-由INTEGER,SINGED,UNSIGNED或STD_LOGIC转换成位宽为B的STD_LOGIC_VECTOR函数 CONV_INTEGER(A); -由SIGNED,UNSIGNED和STD_LOGIC转换成INTEGER函数 TO_STDLOGIC (A) -由B

28、IT转换为STD_LOGIC例:数据类型转换 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; . SIGNAL a: IN INTEGER RANGE 0 TO 15; SIGNAL b: IN INTEGER RANGE 0 TO 15; SIGNAL y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); . y<=CONV_STD_LOGIC_VECTOR(a+b),8);VHDL操作符VHDL的各种表达式由操作数和操作符组成,其中,操作数是各种运算的对象,而操作符则

29、规定运算的方式。操作符种类及对应的操作数类型在VHDL中,一般有四类操作符: 逻辑操作符(Logical Operator) 关系操作符(Relational Operator) 算术操作符(Arithmetic Operator) 符号操作符(Sign Operator)3.2.8 属性(ATTRIBUTE)描述与定义语句属性从指定的客体或对象中获取关心的数据或信息。利用属性可以使VHDL源代码更加简明扼要,易于理解;语法: 对象属性预定义的属性:数值类属性和信号类属性数值类属性:获取数组或一般数据的相关信息。VHDL预先定义的、可综合的数值类属性: LEFT:索引的左边界值 RIGHT:索

30、引的右边界值 HIGH:索引的上限值 LOW:索引的下限值 LENGTH:索引的长度值 RANGE:索引的位宽范围 REVERSE_RANGE:索引的反向位宽范围 例: VARIABLE my_vector : BIT_VECTOR (5 DOWNTO 0);各属性如下: my_vectorLEFT 5 my_vectorRIGHT 0 my_vectorHIGH 5 my_vectorLOW 0 my_vectorLENGTH 6 my_vectorRANGE (5 DOWNTO 0) my_vectorREVERSE_RANGE (0 TO 5)例:TYPE number IS INTEG

31、ER RANGE 9 DOWNTO 0;I:=numberLEFT;-I=9I:=numberRIGTH;-I=0I:=numberHIGH;-I=9I:=numberLOW;-I=0枚举类型数值的属性:通常是不可综合的 VAL(pos): 指定位置(pos)的值 POS(value):给定数值的位置序号 LEFTOF(value):给定数值的左侧值 RIGHTOF(value):给定数值的右侧值 SUCC(value):返回数据类型定义中该数据值的 下一个值 PRED(value):返回数据类型定义中该数据值的前一个值TYPE week IS(monday,tuesday,wednesday

32、,thursday,friday,saturday,sunday);那么根据上面的属性函数定义,不难得出如下的结果:week'POS(tuesday)=1week'VAL(3)=thursdayweek'SUCC(thursday)=fridayweek'PRED(thursday)=wednesdayweek'LEFTOF(friday)=thursdayweek'RIGHTOF(friday)=Saturday信号类属性:VHDL预定义的,对于信号s:EVENT: 如果s值发生了变化,则返回值为true,否则为false , 常用于于时钟信号

33、的判定。STABLE:如果s值保持不变,则返回值为true,否则为false。ACTIVE:如果s值被处理,则返回值为true,否则为false。QUIET<time>:如果在指定的time内s值保持不变,则返回值为true,否则为false。LAST_EVENT:返回从上一次事件发生的时间到当前时间的时间差。LAST_ACTIVE:最后一次s被处理到当前所经历的时间长度值。LAST_VALUE:最后一次变化前s的值; 除EVENT和STABLE属性是可以综合的之外,其它的属性都不可综合,仅用于仿真。其中以EVENT最为常用。属性EVENT通常用于确定时钟信号的边沿。例如:cloc

34、kEVENT-检测以clock为属性测试项目的事件clockEVENT AND clock=1;-检测clock的上升沿clockEVENT AND clock=0;-检测clock的下降沿EVENT和ACTIVE有何区别?事件发生:信号值的发生变化,如由0变到1是一个事件,而0变到0则不是一个事件,原因是信号值没有变。信号活跃:信号值的任何变化,如由0变到1是一个信号活跃,而信号从0变到0也是一个信号活跃。怎么理解这句话啊?所有的事件都是活跃,但并非所有的活跃都是事件改错:例:“1”计数器错误LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY c

35、ount_one ISPORT (din:IN STD_LOGIC_VECTOR (7 DOWNTO 0);ones:OUT INTEGER RANGE 0 TO 8);END count_one;ARCHITECTURE test OF count_one IS SIGNAL temp: INTEGER RANGE 0 TO 8; BEGIN PROCESS (din)BEGINtemp<=0;FOR i IN 0 TO 7 LOOP IF(din(i)='1') THEN temp<=temp+1; END IF; END LOOP; ones<=temp

36、; END PROCESS;END test;例:“1”计数器正确LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY count_one ISPORT (din:IN STD_LOGIC_VECTOR (7 DOWNTO 0);ones:OUT INTEGER RANGE 0 TO 8);END count_one;ARCHITECTURE test OF count_one ISBEGIN PROCESS (din) VARIABLE temp: INTEGER RANGE 0 TO 8;BEGINtemp:=0;FOR i IN 0 TO 7

37、LOOP IF(din(i)='1') THEN temp:=temp+1; END IF; END LOOP; ones<=temp; END PROCESS;END test;例:合法与非法的数组赋值:TYPE row IS ARRAY(7 DOWNTO 0) OF STD_LOGIC;TYPE array1 IS ARRAY(0 TO 3) OF row;TYPE array2 IS ARRAY(0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0);TYPE array3 IS ARRAY(0 TO 3,7 DOWNTO 0) OF STD

38、_LOGIC; SIGNAL x: row;SIGNAL y: array1;SIGNAL z: array2;SIGNAL u: array3x(1)<=y(1)(3)合法x(1)<=z(2)(3)合法x(2)<=u(2,1)合法y(1)(2)<=z(0)(0); 合法z(0)(3)<=u(3,0);合法x<=z(1);-非法,类型不匹配,x是row类型,而z(1)是STD_LOGIC_VECTOR类型的。x<=u(2); 非法,u必须带两个索引值;x<=u(2,2 DOWNTO 0); 非法,x是row类型的,而右侧是STD_LOGIC类型的

39、。z(0)<=u(2,2 DOWNTO 0); -非法,z(0)是STD_LOGIC_VECTOR类型的,右侧是STD_LOGIC类型的,数据类型不匹配。u(1,5 DOWNTO 1)<=z(2)(4 DOWNTO 0);-非法,类型不匹配。y(1)(7 DOWNTO 3)<=x(4 DOWNTO 0);-合法。z(1)(7 DOWNTO 3)<= z(2)(4 DOWNTO 0); 合法。u(1,5 DOWNTO 1)<=z(2)(4 DOWNTO 0); 非法,数据类型不匹配。代码:【例3.1】或门的描述LIBRARY IEEE;USE IEEE.STD LO

40、GIC 1164.ALL; ENTITY or1 ISPORT(a,b:IN STD_LOGIC;y:OUT STD LOGIC);END or1;ARCHITECTURE example1 OF or1 ISBEGIN y<=a OR b;END example1;【例3.2】半加器的描述LIBRARY IEEE;USE IEEE.STD LOGIC 1164.ALL ; ENTITY h_adder ISPORT(a,b:IN STD LOGIC;so,co:OUT STD LOGIC);END h_adder ;ARCHITECTURE example2 OF h_adder IS

41、BEGIN so<=a XOR b;co<=a AND b;END example2; 【例3.3】2选1数据选择器的描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux21 ISPORT ( a, b: IN STD_LOGIC; s: IN STD_LOGIC; y: OUT STD_LOGIC);END mux21;ARCHITECTURE example3 OF mux21 ISBEGIN y<=a WHEN s=0 ELSE b;END ARCHITECTURE example3;【例3.3】2选1数据选择器的

42、描述(另一种编程方法)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux21 ISPORT(a,b:IN STD_LOGIC; s:IN STD_LOGIC; y:OUT STD_LOGIC);END mux21;ARCHITECTURE example3 OF mux21 ISBEGIN y<=(a AND NOT s) OR (b AND s);END ARCHITECTURE example3;【例3.4】锁存器的描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY latch1

43、ISPORT (d:IN STD_LOGIC;ena:IN STD_LOGIC; q:OUT STD_LOGIC);END latch1;ARCHITECTURE example4 OF latch1 ISBEGIN PROCESS (d,ena)BEGINIF ena='1' THENq<=d;END IF; END PROCESS;END example4;例:h_adder合法 mux21,合法 and非法,关键词不能作为标识符_Decoder 非法,起始不能为下划线3DOP 非法,起始不能为数字 Large#number 非法, “#”不能成为标识符的构成符号 D

44、ata_bus 非法,不能有双下划线 Copper_非法,最后字符不能为下划线D-Link非法, “-”不能成为标识符的构成符号Verilog hdl知识点:4.2.6 操作符 操作符也称为运算符,是Verilog HDL预定义的函数名字,这些函数对被操作的对象(即操作数)进行规定的运算,得到一个结果。 操作符通常由13个字符组成,例如,“+”表示加操作,“= =”(两个=字符)表示逻辑等操作,“= = =”(3个=字符)表示全等操作。有些操作符的操作数只有1个,称为单目操作;有些操作符的操作数有2个,称为双目操作;有些操作符的操作数有3个,称为三目操作。 1. 算术操作符(Arithmeti

45、c operators)常用的算术操作符: +(加)、-(减)、*(乘)、/(除)、%(求余)、*(求幂)其中%是求余操作符, 在两个整数相除的基础上,取出其余数。例如,5 % 6的值为5;13 % 5的值是3。算术操作符的主要性质:任意操作数如有一位是x或z,则结果为x。求余数操作的结果符号和第一个操作数符号相同。整数除法将截断小数部分(没有四舍五入)。算术运算结果的位宽由操作数中位宽最大者的位宽决定;在赋值语句中,算术运算的结果位宽由目标变量的位宽决定。2. 逻辑操作符(Logical operators )逻辑操作符包括:&&(逻辑与)、|(逻辑或)、!(逻辑非)注意:非

46、零的位矢量被当作1处理。 比如:a=b0010, b=b0001; 则 a&&b=1, a | b=1, !a=0如果操作数中包含x或z,则结果视具体情况而定。 比如:b1|bx=1, b1&&bx=x, !x=x 3. 位运算(Bitwise operators)位运算是将两个操作数按对应位进行逻辑操作。位运算操作符包括:(按位取反)、&(按位与)、|(按位或)、(按位异或)、或(按位同或)。在进行位运算时,当两个操作数的位宽不同时,计算机会自动将两个操作数按右端对齐,位数少的操作数会在高位添0补齐。注意: 如操作数包含x或z的位, 则0&x=

47、0; 1|x=1; 0&z=0; 1|z=1; 其他情况相应的位结果均为x。4. 关系操作符(Pelational operators)关系操作符有: <(小于)、<=(小于等于)、>(大于)、>=(大于等于)。其中,<=也是赋值运算的赋值符号。 关系运算的结果是1位逻辑值。在进行关系运算时,如果关系是真,则计算结果为1;如果关系是假,则计算结果为0;如果某个操作数的值不定,则计算结果不定(为x)。 如果两个操作数位宽不同,位宽较短的操作数在高位添0补齐。5. 等式操作符(Equality operators)等值操作符包括:= =(等于)、!=(不等于)

48、、= = =(全等)、!= =(不全等)4种。等值运算的结果也是1位逻辑值,当运算结果为真时,返回值1;为假则返回值0。相等操作符(= =)与全等操作符(= = =)的区别是:当进行相等运算时,如果某些位是不定或高阻状态,其相等比较的结果就会是x;而进行全等运算时,对不定或高阻状态位也进行比较,当两个操作数完全一致时,其结果的值才为1(真),否则结果为0(假)。全等和不全等操作符不可综合 6. 缩减操作符(Reduction operators)缩减操作符包括:&(与)、&(与非)、|(或)、|(或非)、(异或)、或(同或)。 缩减操作运算法则与位运算操作相同,但操作的运算对象

49、只有一个。在进行缩减操作运算时,对操作数进行与、与非、或、或非、异或、同或等缩减操作运算,产生1位的操作结果。 例如,A = 8b11010001,则& A = 0,|A = 1。缩减操作符的主要性质:对于缩减与:只要操作数中有一位是0,结果为0;如果操作数所有位都不为0且包含x或z,则结果为x,否则结果为1。对于缩减或:只要操作数中有一位是1,结果为1;如果操作数所有位都不为1且包含x或z,则结果为x,否则结果为0。对于缩减异或:只要操作数中有一位是x或z,结果为x;如果操作数所有位都不为x或z,则如有偶数个1,结果为0,有奇数个1,则结果为1。缩减与非,缩减或非和缩减异或非的结果和

50、上述相反。7. 转移操作符(Shift operators)转移操作符包括:>>(逻辑右移)、<<(逻辑左移)、>>>(算术右移)、<<<(算术左移)操作数 <<n;/将操作数的内容左移n位,同时从右边开始用0来填补移出的位数。操作数 >> n;/将操作数的内容右移n位,同时从左边开始用0来填补移出的位数。操作数 <<< n;/将操作数的内容左移n位,同时从右边开始用0来填补移出的位数。操作数 >>> n;/将操作数的内容右移n位,同时从左边开始用0(对无符号数)或符号位(对有符号数)来填补移出的位数。n总是被视为无符号数8. 条件操作符(Conditional operators)条件操作符为:?:条件操作符的操作数有3个,其使用格式为操作数 = 条件 ? 表达式1:表达式2;即当条件为真(条件结果值为1)时,操作数 = 表达式1;为假(条件结果值为0)时,操作数 = 表达式2。9. 位并接操作符(Concatenation operators)并接操作符为:并接操作符的使用格式为操作数1的某些位,操作数2的某些位,操作数n的某些位;即将操作数1的某些位与操作数2的某些位与与操作数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论