1、3 VHDL语言VHDL: VHSIC Hardware Description Language.3.1 VHDL语言基础3.2 VHDL基本结构3.3 VHDL语句3.4 状态机在VHDL中的实现3.5 常用电路VHDL程序3.6 VHDL仿真3.7 VHDL综合HDL-Hardware Description Language一种用于描述数字电路的功能或行为的语言。目的是提为电路设计效率,缩短设计周期,减小设计成本,可在芯片制造前进行有效的仿真和错误检测。优点:HDL设计的电路能获得非常抽象级的描述。如基于RTL(Register Transfer Level)描述的IC,可用于不同的工
2、艺。HDL设计的电路,在设计的前期,就可以完成电路的功能级的验证。HDL设计的电路类似于计算机编程。常用的HDL语言:VHDL 、VerilogHDLVHDL是美国国防部在20世纪80年代初为实现其高速集成电路硬件VHSIC计划提出的描述语言;IEEE从1986年开始致力于VHDL标准化工作,融合了其它ASIC芯片制造商开发的硬件描述语言的优点,于93年形成了标准版本(IEEE.std_1164)。1995年,我国国家技术监督局推荐VHDL做为电子设计自动化硬件描述语言的国家标准。VHDL 概述:VHDL VHSIC HardwarterDescription LanguageVery Hig
3、h speed integrated circuitVHSIC覆盖面广,系统硬件描述能力强,是一个多层次的硬件描述语言;VHDL语言具有良好的可读性,既可以被计算机接受,也容易被人们所理解;VHDL语言可以与工艺无关编程;VHDL语言已做为一种IEEE的工业标准,便于使用、交流和推广。VHDL语言的不足之处:VHDL优点:设计的最终实现取决于针对目标器件的编程器,工具的不同会导致综合质量不一样。3.1.1 标识符(Identifiers)要求:l首字符必须是字母l末字符不能为下划线l不允许出现两个连续的下划线l不区分大小写lVHDL定义的保留字(关键字),不能用作标识符l标识符字符最长可以是3
4、2个字符。注释由两个连续的虚线()引导。3.1 VHDL语言基础标识符用来定义常数、变量、信号、端口、子程序或参数的名字,由字母(AZ,az)、数字(09)和下划线(_)字符组成。例如:ABS,ACCESS,AFTER,ALL,AND,ARCHITECTURE,ARRAY,ATTRIBUTE,BEGIN,BODY,BUFFER,BUS,CASE ,COMPONENT,CONSTANT,DISCONNECT,DOWNTO,ELSE,ELSIF,END,ENTITY,EXIT,FILE,FOR,FUNCTION,GENERIC,GROUP,IF,INPURE,IN,INOUT,IS,LABEL,L
5、IBRARY,LINKAGE,LOOP,MAP,MOD,NAND,NEW,NEXT,NOR ,NOT,NULL,OF,ON,OPEN ,OR ,OTHERS,OUT,PACKAGE,POUT,PROCEDURE ,PROCESS,PURE,RANGE ,RECODE,REM,REPORT,RETURN,ROL,ROR,SELECT,SHARED,SIGNAL,SLA,SLL,SRA,SUBTYPE,THEN,TRANSPORT,TO,TYPE ,UNAFFECTED,UNITS,UNTIL,USE,VARIABLE,WAIT,WHEN,WHILE,WITH,XOR ,XNOR关键字(保留字):
6、关键字(keyword)是VHDL中具有特别含义的单词,只能做为固定的用途,用户不能用其做为标识符。3.1.2 数据对象(Date Objects)常量ConstantConstant bus_width:integer :=8; -定义总线宽度为常数8数据对象包括常量、变量、信号和文件四种类型。常量是对某一常量名赋予一个固定的值,而且只能赋值一次。通常赋值在程序开始前进行,该值的数据类型则在说明语句中指明。Constant 常数名:数据类型:表达式ConstantVcc:real:=5.0; -定义Vcc的数据类型是实数,赋值为5.0V常量所赋的值应和定义的数据类型一致;常量在程序包、实体、
7、构造体或进程的说明性区域内必须加以说明。定义在程序包内的常量可供所含的任何实体、构造体所引用,定义在实体说明内的常量只能在该实体内可见,定义在进程说明性区域中的常量只能在该进程内可见。Variable 变量名:数据类型 :初始值;Variable count: integer 0 to 255:=20; -定义count整数变量,变化范围0255,初始值为20。变量Variable变量只能在进程语句、函数语句和过程语句结构中使用。变量的赋值是直接的,非预设的,分配给变量的值立即成为当前值,变量不能表达“连线”或存储元件,不能设置传输延迟量。变量赋值语句:目标变量名 := 表达式;变量定义语句:
8、x:=10.0; -实数变量赋值为10.0Y:=1.5+x; -运算表达式赋值,注意表达式必须与目标变量的数据类型相同A(3 to 6):=(“1101”); -位矢量赋值Signal 信号名: 数据类型:初始值Signal clock:bit :=; -定义时钟信号类型,初始值为0信号Signal信号表示逻辑门的输入或输出,类似于连接线,也可以表达存储元件的状态。信号通常在构造体、程序包和实体中说明。信号定义语句:Signal count:BIT_VECTOR(3 DOWNTO 0); -定义count为4位位矢量信号赋值语句:目标信号名 ) OF BIT; -基于Bit类型的数组,用于逻辑
9、运算SIGNAL a:Bit_Vector(0 TO 7);SIGNAL a:Bit_Vector( 7 DOWNTO 0) VHDL的预定义数据类型在VHDL标准程序包STANDARD中定义好,实际使用过程中,已自动包含进VHDL源文件中,不需要通过USE语句显式调用。TYPE BOOLEAN IS (FALSE, TRUE); -取值为FALSE和TRUE,不是数值,不能运算,一般用于关系运算符l 整数:(Integer)取值范围 -(231-1) (231-1),可用32位有符号的二进制数表示variable a:integer range -63 to 63在实际应用中,VHDL仿真器
10、将Integer做为有符号数处理,而VHDL综合器将Integer做为无符号数处理;要求用RANGE子句为所定义的数限定范围,以便根据范围来决定表示此信号或变量的二进制数的位数。l字符:(Character)TYPE CHARACTER IS (NUL, SOH,STX, , , !,); -通常用引起来,区分大小写;l字符串:(String)VARIABLE string_var: STRING (1 TO 7);string_var:=“A B C D” ; -通常用“”引起来,区分大小写;l 实数:(Real)取值范围 -1.0E38 +1.0E38,仅用于仿真不可综合1.0 -十进制浮
11、点数843.6e+4 -八进制浮点数43.6E-4 -十进制浮点数l 时间:(Time)物理量数据,完整的包括整数和单位两个部分,用至少一个空格隔开,仅用于仿真不可综合;fs,ps,ns,us,ms,sec,min,hrl 错误等级(Severity Level):表示系统状态,仅用于仿真不可综合;TYPE severity_levelIS (NOTE、WARNING、ERROR、FAILURE);IEEE预定义标准逻辑位与矢量l 标准逻辑位(Std_Logic)l 标准逻辑位矢量(Std_Logic_vector)基于Std_Logic类型的数组;使用Std_Logic和Std_Logic_
12、Vector要调用IEEE库中的Std_Logic_1164 程序包;就综合而言,能够在数字器件中实现的是“、0、1、Z”四种状态。在条件语句中,必须要全面考虑Std_Logic的所有可能取值情况,否则综合器可能会插入不希望的锁存器。U:Uninitialized; X:Forcing Unkown; 0:Forcing 0 1:Forcing 1 Z:High Impedance W:Weak UnknownL:Weak 0 H:Weak 1 :Dont care枚举:type states is (idle,decision,read,write);type boolean is (fal
13、se,true);type bit is (0,1);数组:type value_type is array (127 downto0) of integer;type matrix_type is array (0 to 15, 0 to 31) of std_logic;用户自定义l TYPE 数据类型名IS 数据类型定义OF 基本数据类型或 TYPE 数据类型名IS 数据类型定义l SUBTYPE 子类型名IS 基本数据类型定义RANGE 约束范围subtype digit is integer range 0 to 9;3.1.3 数据类型转换VHDL为强定义类型语言,不同类型的数据不
14、能进行运算和直接赋值。l类型标记法Variable A: integer; Variable B: real;A= integer (B); B=real (A);l函数法Conv_interger(A);-由std_logic转换为integer型,在std_logic_unsigned包。l常数转换法/ 常量转换法Type conv_tableis array(std_logic) of bit;Constant table: conv_table:=(0|L=0, 1|H=1, others=0);Signal a: bit; signal b: std_logic;A ,=l 逻辑运算
15、符:AND,OR,NAND,NOR,XNOR,NOT,XORl 赋值运算符:l 其他运算符:,SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ;.a ,=逻辑运算符:AND,OR,NAND,NOR,XNOR,NOT,XOR移位运算符的左边为一维数组,其类型必须是BIT或BOOLEAN,右边必须是整数移位次数为整数的绝对值。移位运算符操作示意图“1100”SLL1 =“1000” “1100”SRL1 =“0110” “1100”SLA1 =“1000”“1100”SRA1 =“1110” “1100”ROL1 =“1001” “1100”ROR1 =“0110
16、”SLL:将位向量左移,右边移空位补零;SRL:将位向量右移,左边移空位补零;SLA:将位向量左移,右边第一位的数值保持原值不变;SRA:将位向量右移,左边第一位的数值保持原值不变;ROL和ROR:自循环左右移位。取余运算(a REM b)的符号与a相同,其绝对值小于b的绝对值。例如:(-5)REM 2=(-1) 5 REM 2=(1)取模运算(a MOD b)的符号与b相同,其绝对值小于b的绝对值。例如:(-5)MOD 2=1 5 MOD (-2)=(-1)3.2 VHDL基本结构实体(Entity):描述所设计的系统的外部接口信号,定义电路设计中所有的输入和输出端口;结构体(Archite
17、cture):描述系统内部的结构和行为;包集合(Package):存放各设计模块能共享的数据类型、常数和子程序等;配置(Configuration):指定实体所对应的结构体;库(Library):存放已经编译的实体、结构体、包集合和配置。LIBRARY IEEE; -库、程序包的说明调用USE IEEE.Std_Logic_1164.ALL;ENTITY FreDeviderIS -实体声明PORT(Clock: IN Std_logic;Clkout: OUT Std_logic);END;ARCHITECTURE Behavior OF FreDeviderIS -结构体定义SIGNAL
18、Clk:Std_Logic;BEGINPROCESS(Clock)BEGINIF rising_edge(Clock) THENClk=NOT Clk;END IF;END PROCESS;Clkout=Clk;END;VHDL的基本设计单元结构:程序包说明、实体说明和结构体说明三部分。3.2.1 实体(Entity)ENTITY实体名IS GENERIC(常数名:数据类型:设定值)PORT( 端口名1:端口方向端口类型;端口名2:端口方向端口类型;.端口名n:端口方向端口类型);END 实体名;实体描述了设计单元的输入输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。ENTITY F
19、reDeviderISPORT(Clock: IN Std_logic;Clokout: OUT Std_logic);END;实体名最后一条端口声明语句无分号端口方向端口类型端口名实体名由设计者自由命名,用来表示被设计电路芯片的名称,但是必须与VHDL程序的文件名称相同。要与文件名一致;例如:GENERIC(wide:integer:=32); -说明宽度为32GENERIC(tmp:integer:=1ns); -说明延时1 ns 类属说明类属为设计实体与外界通信的静态信息提供通道,用来规定端口的大小、实体中子元件的数目和实体的定时特性等。格式:GENERIC(常数名:数据类型:设定值;常
20、数名:数据类型:设定值);端口方向:IN,OUT,INOUT,BUFFERINOUTINOUTBUFFER“OUT”和“BUFFER”都可定义输出端口;若实体内部需要反馈输出信号,则输出端口必须被设置为“BUFFER”,而不能为“OUT”。同方向、同类型的端口可放在同一个说明语句中。ENTITY Full_adderISPORT( a, b, c: IN BIT;sum, carry: OUT BIT);END Full_adder;3.2.2 结构体(Architecture)ARCHITECTURE结构体名OF实体名IS声明语句BEGIN功能描述语句END 结构体名;用于声明该结构体将用到的信号、数据类型、常数、子程序和元件等。声明的内容是局部的。具体描述结构体的功能和行为。结构体定义了设计单元具体的功能,描述了该基本设计单元的行为、元件和内部的连接关系。一个实体可对应多个结构体,每个结构体代表该实体功能的不同实现方案或不同实现方式。同一时刻只有一个结构体起作用,通过CONFIGURATION决定用哪个结构体进行仿真或综合。在结构体描述中,具体给出了输入、输出信号之间的逻辑关系。