第四章 VHDL编程基础
主要内容 硬件描述语言及其特点 VHDL程序基本结构 VHDL语言要素 VHDL结构体描述方式
4.1 硬件描述语言及其特点 4.1.1 硬件描述语言的基本概念 4.1.2 常用硬件描述语言简介 4.1 硬件描述语言及其特点 4.1.1 硬件描述语言的基本概念 硬件描述语言很好地解决了文本语言描述和逻辑图描述存在的不足。它是一种类似于C、C++的计算机高级语言,允许设计者通过精确定义的语句描述逻辑网络的任何操作,更重要的可以通过计算机仿真设计好的逻辑网络,而且仿真中包含了硬件特性。 4.1.2 常用硬件描述语言简介 目前常用的硬件描述语言有 VHDL、Verilog、AHDL和 ABEL 语言。 VHDL 的英文全名是VHSIC(Very High Speed Integrated Circuit)Hardware Description Language, 1982年发源于美国国防部,1987年底被和美国国防部确认为标准硬件描述语言。1993年,IEEE 对 VHDL 进行了修订,公布了新版本的 VHDL,即 IEEE 标准的1076-1993版本。
4.1 硬件描述语言及其特点(续) 4.1.3 VHDL特点 VHDL具有更强的行为描述能力 支持团队设计模式 系统设计与硬件结构无关 4.1 硬件描述语言及其特点(续) 4.1.3 VHDL特点 VHDL具有更强的行为描述能力 支持团队设计模式 系统设计与硬件结构无关 具有较强的预测能力 自动化程度高 具有极强的移植能力
4.2 VHDL程序基本结构 4.2.1 实体描述 ENTITY simple gate IS PORT( A, B, C: IN BIT; 4.2.1 实体描述 实体是一个模块的表层设计单元,其功能是该模块与外部电路进行接口的描述,它定义了模块的输入输出接口信号或引脚,是模块经封装后对外的一个通信界面。 ENTITY simple gate IS PORT( A, B, C: IN BIT; F : OUT BIT ); END simple gate;
4.2.1 实体描述(续) 端口声明的语句格式是: 标识符:端口模式 数据类型; VHDL可综合的端口模式有以下四种: 4.2.1 实体描述(续) 端口声明的语句格式是: 标识符:端口模式 数据类型; VHDL可综合的端口模式有以下四种: “IN”通道为单向只读模式,规定数据只能通过此端口被读 入实体中。 “OUT”通道为单向输出模式,规定数据只能通过此端口从 实体向外流出,或者说可以将实体中的数据向此端口赋值。 “INOUT” 定义的通道确定为输入输出双向端口,即从端 口的内部看,可以对此端口进行赋值,也可以通过此端口读 入外部的数据;而从端口的外部看,信号既可以从此端口流 出,也可以向此端口输入信号,如RAM的数据端口。 “BUFFER” 功能与INOUT类似,区别在于当需要输入数据 时,只允许内部回读输出的信号,即允许反馈。
4.2.2 结构体描述 定义好模块的实体以后,就可以用结构体声明描述模块 具体做什么,实现怎样的逻辑功能。最典型的结构体描述方 式有以下三种: 行为描述:不考虑硬件实现的途径,直接建立输入与输出 之间的关系。 结构描述:通过组合如基本逻辑门电路等更初级的部件构 造实现逻辑功能。 数据流描述:通过定义模块中信号的流动方向描述模块功 能,也可以看作一种特殊的行为描述模式。
4.2.2 结构体描述(续) VHDL语言中,结构体描述的一般形式如下: ARCHITECTURE 结构体名 OF 实体名 IS 4.2.2 结构体描述(续) VHDL语言中,结构体描述的一般形式如下: ARCHITECTURE 结构体名 OF 实体名 IS 说明语句1; 说明语句2; … BEGIN 功能描述语句1; 功能描述语句2; END 结构体名;
4.2.3 模块设计实例 例4.1 双输入与非门的VHDL设计 --双输入与非门实体描述 ENTITY nand2 IS PORT 4.2.3 模块设计实例 例4.1 双输入与非门的VHDL设计 --双输入与非门实体描述 ENTITY nand2 IS PORT (A, B: IN BIT; F: OUT BIT ); END nand2; --以下是双输入与非门的结构体描述 ARCHITECTURE behavioral OF nand2 IS BEGIN F<=A NAND B; END behavioral;
4.2.3 模块设计实例(续) 例4.2 2选1多路选择器的VHDL设计 --2选1多路选择器的实体描述 ENTITY mux21 IS 4.2.3 模块设计实例(续) 例4.2 2选1多路选择器的VHDL设计 --2选1多路选择器的实体描述 ENTITY mux21 IS PORT(A,B: IN BIT; S: IN BIT; Y: OUT BIT); END mux21; --以下是2选1多路选择器的结构体描述ARCHITECTURE structural OF mux21 IS SIGNAL D, E: BIT; BEGIN D<=A AND S; E<=B AND (NOT S); Y<=D OR E; END structural;
4.3 VHDL语言要素 4.3.1 VHDL文字规则 1.数字 整数:所有的整数都是十进制的数,如 : 0,5,12,256,123E2(=12300) 实数:所有的实数都是十进制的数,但必须带小数点如: 0.125,34 567 890.012 345(=34567890.012345) 以数制基数表示的数,如: 10#234# --(表示十进制数234) 物理量文字(VHDL 综合器不接受此类文字 ),如: 60s(60秒),100m(100米),1KΩ(1000欧姆)等。
4.3.1 VHDL文字规则(续) 2. 字符和字符串 3. 标识符 4. 下标名和下标段名 字符:用单引号引起来的ASCII字符,可以是数字,也可以是符号或字母,如: ‘A’,‘a’,‘0’,‘1’,‘10’,‘-’,‘*’等。 字符串:是一个一维的字符数组,必须放在双引号中。VHDL 中有两种类型的字符串,一种是文字字符串,另一种是数位字符串。如: “RESULT”,“ERROR”, B“1 1100 0011”, X“FA0” 。 3. 标识符 用来定义常数、变量、信号、端口、子程序或参数名字。 4. 下标名和下标段名 下标名语句格式为: 数组类型信号名或变量名(表达式) 下标段名语句格式为: 数组类型信号名或变量名(表达式1 TO/DOWNTO 表达式2)
4.3.2 VHDL数据对象(Data Objects) 1. 常量(CONSTANT) 常量是一个被赋予固定值的量。其定义格式如下: CONSTANT 常量名:数据类型:=表达式;例如: CONSTANT VCC: REAL:= 3.3;--定义芯片的电源供电电压为3.3V 2. 变量(VARIABLE) 可以被赋予不同数值的数据对象被称为变量。语法格式如下: VARIABLE 变量名:数据类型及其约束:= 初始值或表达式;例如: VARIABLE num: INTEGER;--定义变量 num 为整型数 3. 信号 (SIGNAL) 它类似于硬件电路中的连接线,是硬件电路连接线在VHDL中的抽象表示。信号的定义格式如下: SIGNAL 信号名:数据类型及其约束:=初始值或表达式;例如: SIGNAL rst: BIT:= '0';--定义复位信号rst,并赋初值为0
4.3.3 VHDL数据类型(Data Type) 1. 预定义数据类型 整数(INTEGER):32位有符号的二进制数。 自然数(NATURAL):整数类型的一个子类型,即0和正整数。 实数(REAL):与数学上的实数定义相同,也称为浮点数,仅能在VHDL仿真器中使用。 位(BIT)和位矢量(BIT_VECTOR):位数据类型属于枚举类型,取值只能是1或0;位矢量是基于BIT数据类型的数组。 字符(CHARACTER)和字符串(STRING):字符数据类型使用单引号,字符串使用双引号标明。如:‘A’、“abcd”。 布尔量 (BOOLEAN):二值枚举型数据类型。 时间(TIME):VHDL中惟一的预定义物理类型是时间。 错误等级(SEVERITY_LEVEL):指示VHDL在编译、综合、仿真过程中的工作状态,共有四种可能的状态:NOTE(注意)、WARNING(警告)、ERROR(出错)、FAILURE(失败)。
4.3.3 VHDL数据类型(Data Type)(续1) 2. IEEE预定义的标准逻辑位与矢量 STD_LOGIC在IEEE库的程序包STD_LOGIC_1164中的定义格式如下: TYPE STD_LOGIC IS (‘U’,‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘-’ ); STD_LOGIC _VECTOR数据类型在IEEE库的程序包STD_LOGIC_1164中的定义格式如下: TYPE STD_LOGIC_VECTOR IS ARRAY (NATURAL RANGE<>) OF STD_LOGIC; 使用时须加入下面的库语句: LIBRARY IEEE; USE IEEE STD_LOGIC_1164.ALL;
4.3.3 VHDL数据类型(Data Type)(续2) 3. 自定义数据类型 枚举类型(ENUMERATED) 是用文字符号代替一组实际的二进制数的特殊数据类型,如,将一个星期WEEK定义为7状态的枚举数据类型: TYPE WEEK IS (sun, mon, tue, wed, thu, fri, sat); 整数类型(INTEGER)和实数类型(REAL) 对己作过预定义的数据类型,做取值范围约束。如: --定义数nat的取值范围为0~255 TYPE nat IS INTEGER RANGE 0 TO 255; 数组类型(ARRAY) 可以定义约束型数组和未约束型数组。约束型数组定义格式如下: TYPE 数组名 IS ARRAY (数组下标范围) OF 数据类型; 记录类型(RECORD)
4.3.3 VHDL数据类型(Data Type)(续3) 4. 数据类型转换 使用类型标记符实现数据类型转换 例如:VARIABLE A:INTEGER; VARIABLE B:REAL; A:=integer(B); --变量B取整后赋值给变量A B:=real(A); --变量A加上小数点变成实数后赋值给变量B 使用类型转换函数实现类型转换 函数名 功能 备注 TO_BIT() 由STD_LOGIC转换为BIT STD_LOGIC_1164程序包 TO_BIT_VECTOR() 由STD_LOGIC_VECTOR 转换为BIT_VECTOR TO_STD_LOGIC() 由BIT转换为STD_LOGIC TO_STD_LOGIC_VECTOR() 由BIT_VECTOR 转换为STD_LOGIC_VECTOR CON_STD_LOGIC_VECTOR() 由INTEGER转换为 STD_LOGIC_VECTOR STD_LOGIC_ARITH程序包 CON_INTEGER() 转换为INTEGER STD_LOGIC_UNSIGNED程序包
4.3.4 VHDL操作符 1. 算术操作符 求和操作符:包括加法操作符、减法操作符和并置操作符。 符号操作符:包括“+”(正)和“-”(负)两种操作符。 求积操作符:包括*(乘)、/(除)、MOD(取模)和RED(取余)四种。 混合操作符:包括乘方“**”和取绝对值“ABS”两种。 移位操作符:包括SLL(逻辑左移)、SRL(逻辑右移)、SLA(算术左移)、SRA(算术右移)、ROL(逻辑循环左移)和ROR(逻辑循环右移)六种操作符。 例4.3 利用移位操作实现的3-8译码器设计。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; ENTITY decoder3_8 IS PORT( cod: IN NATURAL RANGE 0 TO 7; Sult: OUT UNSIGNED( 7 DOWNTO 0)); END decoder3_8; ARCHITECTURE behave OF decoder3_8 IS CONSTANT num: UNSIGNED(7 DOWNTO 0):= "00000001"; BEGIN Sult <= num sll cod; --输出高电平有效 END behave;
4.3.4 VHDL操作符(续) 2. 关系操作符 3. 逻辑操作符 4. 重载操作符 VHDL提供了7种基本逻辑操作符,它们是AND、OR、 NOT、NAND、NOR、XOR和XNOR。 4. 重载操作符 VHDL中的重载操作符是为了使不同数据类型的数据 对象之间能够进行运算,对原有的基本操作符重新作了定 义,构成的新的操作符。
4.4 VHDL结构体描述方式 4.4.1 行为描述方式 LIBRARY IEEE; 4.4.1 行为描述方式 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY fulladder IS PORT (a, b, ci: IN STD_LOGIC; s, co: OUT STD_LOGIC); END fulladder; ARCHITECTURE behavioral OF fulladder IS BEGIN s <= '1' WHEN (a= '0' AND b= '1' AND ci= '0') ELSE '1' WHEN (a= '1' AND b= '0' AND ci= '0') ELSE '1' WHEN (a= '0' AND b= '0' AND ci= '1') ELSE '1' WHEN (a= '1' AND b= '1' AND ci= '1') ELSE '0'; co <= '1' WHEN (a= '1' AND b= '1' AND ci= '0') ELSE '1' WHEN (a= '0' AND b= '1' AND ci= '1') ELSE '1' WHEN (a= '1' AND b= '0' AND ci= '1') ELSE END behavioral; 一位全加器真值表 a b ci s co 1
4.4.2 数据流描述方式 例4.5 一位全加器的数据流描述方式。 由一位全加器的真值表不难得到其逻辑表达式: LIBRARY IEEE; 4.4.2 数据流描述方式 例4.5 一位全加器的数据流描述方式。 由一位全加器的真值表不难得到其逻辑表达式: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY fulladder IS PORT (a, b, ci : IN STD_LOGIC; S, co : OUT STD_LOGIC); END fulladder; --以下是一位全加器结构体数据流描述 ARCHITECTURE Dataflow OF fulladder IS BEGIN S <= a XOR b XOR ci; co <= (a AND b) OR (b AND ci) OR (a AND ci); END Dataflow;
4.4.3 结构描述方式 例4.6 一位全加器的结构描述方式。 --以下是半加器的描述 LIBRARY IEEE; 4.4.3 结构描述方式 例4.6 一位全加器的结构描述方式。 --以下是半加器的描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --以下是半加器的实体描述 ENTITY H_adder IS PORT (in_a, in_b : IN STD_LOGIC; out_s, out_co: OUT STD_LOGIC); END H_adder ; --以下是半加器结构体的数据流描述 ARCHITECTURE Dataflow OF H_adder IS BEGIN out_s<= in_a XOR in_b; out_co<= in_a AND in_b; END Dataflow;
4.4.3 结构描述方式(续) 例4.6 一位全加器的结构描述方式。 --以下是或门描述 LIBRARY IEEE; 4.4.3 结构描述方式(续) --以下是一位全加器结构描述的顶层设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --以下是一位全加器实体描述 ENTITY fulladder IS PORT (a, b, ci: IN STD_LOGIC; s, co: OUT STD_LOGIC); END fulladder; --以下是一位全加器结构体描述 ARCHITECTURE Structural OF fulladder IS COMPONENT H_adder --半加器部件声明 PORT (in_a, in_b : IN STD_LOGIC; out_s, out_co : OUT STD_LOGIC); END COMPONENT; COMPONENT Or_2 --或门部件声明 PORT (x, y: IN STD_LOGIC; z: OUT STD_LOGIC); SIGNAL u, v, w: STD_LOGIC; --定义内部三条连线 BEGIN U1: H_adder PORT MAP (in_a=>a, in_b =>b, out_s=>v, out_co=>u); --端口映射 U2: H_adder PORT MAP (in_a=>v, in_b=>ci, out_s=>s, out_co=>w); U3: Or_2 PORT MAP (x => u, y => w, z=>co); END Structural; 例4.6 一位全加器的结构描述方式。 --以下是或门描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --以下是或门实体描述 ENTITY Or_2 IS PORT (x, y: IN STD_LOGIC; z: OUT STD_LOGIC); END Or_2; --以下是或门结构体行为描述 ARCHITECTURE behavioral OF Or_2 IS BEGIN Z<= '1' WHEN (x= '0' AND y= '1') ELSE '1' WHEN (x= '1' AND y= '0') ELSE '1' WHEN (x= '1' AND y= '1') ELSE '0'; END behavioral;
本章小结 本章作为VHDL语言的编程基础主要介绍了VHDL语言的特 点,VHDL程序基本结构,VHDL语言要素和构造体的几种 描述方式。 硬件描述语言的种类很多,但只有VHDL和Verilog已经成 为IEEE标准。 不同于其他高级语言,为了更准确地描述硬件电路的特征, VHDL语言的程序结构采用将实体和结构体分别进行描述。 VHDL是一种强类型语言,对各种数据对象、数据类型, 各种操作符、运算符以及文字书写都有严格的规定。