资源描述
第一章 可编程集成电路基础1.1 概述1.2 在系统可编程逻辑器件的结构 1.2.1 ispLSI1016 1.2.2 编程接口和编程 第二章 硬件描述语言VHDL基础 2.1 概述2.2 VHDL语言语法规则2.2.1 标识符 ( Identifiers) 2.2.2 数据对象 ( Data Objects )2.2.3 数据类型 ( Data Types )2.2.4 运算符 ( Operators)2.3 VHDL的语句结构分类2.3.1 库2.3.2 实体说明2.3.3 结构定义2.4 顺序语句2.4.1 信号赋值语句2.4.2 变量赋值语句2.4.3 if_then_else语句2.4.4 case_when语句2.5 并行语句2.5.1 when_else语句2.5.2 with_select_when语句 2.6 结构体的子结构描述2.6.1 block语句2.6.2 Proess ( 进程 ) 语句2.6.3 子程序2.6.4 程序包 2.7 基本逻辑电路设计第三章 ispDesignEXPERT 开发系统第四章 设计示例第二章 硬件描述语言VHDL基础2.1 概 述随着集成电路的设计规模的增大和复杂程度日益增高,传统的数字电路设计方法不适合设计大规模的系统。众多软件公司开发研制了具有自己特色的电路硬件描述语言(Hardware Description Language,HDL),存在着很大的差异,因此,需要一种强大的、标准化的硬件描述语言,作为可相互交流的设计环境。美国国防部在80年代初提出了VHSIC(Very High Speed Integrated Circuit)计划,其目的是为大规模集成电路设计,建立一项新的描述方法。1981年提出了一种新的HDL,称之为VHSIC Hardware Description Language,简称为VHDL,VHDL语言可描述一个数字电路的输入、输出以 及相互间的行为与功能,它特有的层次性设计语法结构适合大型设计项目的团队合作,是目前最通用的硬件描述语言。这种语言有如下的诸多优点:1. 可描述复杂的数字电路系统;2成为国际的硬件描述语言标准,1987年被采纳为IEEE1076标准3与硬件独立,一个设计可用于不同的硬件结构,而且设计时不必了解过多的硬件细节;4有丰富的软件支持VHDL的综合和仿真,从而能在设计阶段就能发现设计中的Bug,缩短设计时间,降低成本;5VHDL有良好的可读性,容易理解。2.2 VHDL语言的语法规则2.2.1VHDL标识符(Identifiers) 基本标识符由字母、数字和下划线组成; 第一个字符必须是字母; 最后一个字符不能是下划线; 不允许连续2个下划线; 保留字(关键字)不能用于标识符; 大小写是等效的。2.2.2 数 据 对 象 ( Data Objects )VHDL中常用的数据对象有:常量、信号和变量,常量相当于电路中的恒定电平,信号和变量相当于电路中的连线和连线上的信号值。1 常 量 (Constant)常量声明即为一个常量名赋予一个固定值,其一般格式为:CONSTANT 常量名:数据类型:=表达式;常量可在Library、Entity、Architecture、Process 中进行定义,其有效范围也相应限定。例如:CONSTANT w: integer := 8; - “w” 是整数类型的常数,其值为“8”2 信 号 (Signal)信号没有方向性,是一个全局量,用于进程之间的通信,声明电路内部的信号。在Entity中和Architecture中声明,信号声明语句格式为:SIGNAL 信号名:数据类型 约束条件:=表达式;例如:SIGNAL GROUND: BIT : = 0 ;符号“:=”表示直接赋值,用于指定信号的初始值。信号赋值语句的格式为: 信号名 = 表达式 AFTER 时间表达式;其中时间表达式指定延迟时间,如果省略AFTER语句,则延迟时间取默认值。3 变 量 (Variable)变量属于临时数据,没有物理意义,只能在Process和Function中定义,并只在其内部有效。其声明格式为:variable 变量名: 数据类型 约束条件:=表达式;例如:variable count: INTEGER RANCE 0 TO 255:=10;变量count为整数类型,RANCE 0 TO 255是对类型INTEGER的附加限制,该语句一旦执行,立即将初始值10赋予变量。2.2.3数据类型VHDL的数据类型定义非常严格,规定每一个对象都必须有明确的数据类型。不同类型之间的数据不可直接代入,连接不同数据类型的信号为非法。赋予一个值的对象只有一个类型,且只能具有该类型的值。1. 定义数据类型在std库中有一个标准程序包,其中定义了一些预定义的数据类型。用VHDL编写程序时,该库自动打开,所以使用这些数据类型时,不需要再次打开。常用的预定义的数据类型如下:(1)整数(Integer) VHDL的算术运算符均定义范围为32位的整数。描述算术运算时,一般使用整数类型,但是使用整数很难表示未知或三态等逻辑状态。 (2)实数(Real) 实数取值范围为-1.0E38+1.0E38。由于处理实数的运算需要大量资源,故一般可编程逻辑器件开发系统中的VHDL综合器不支持这种数据类型。 (3)位(Bit)和位矢量(Bit_Vector) 位和位矢量类型的通用性强。位只能取值0或1,其值放在单引号中;位矢量为双引号括的一组位数据,一般表示总线的状态,如: “001100” X”00cce2000” X表示是十六进制。 (4)布尔(Boolean) 布尔数据类型经常用于逻辑关系运算中,其取值只有TRUE或FALSE。 (5)字符(CHARACTER) 当对一个变量执行字符赋值操作时,应先声明后赋值。例如将字符A赋给变量C,声明如下: variable C: character;然后执行赋值操作: C:= A; 其中字符A放在单引号中。 (6)时间(Time)时间是一个物理量,其格式如下: TYPE 数据类型名 Is 范围; UNITS 基本单位; 单位; END UNITS; 例如,在STD库中的STANDARD程序包中,如下定义时间类型: TYPE Time IS -2147483647 TO 2147483647; UNITS fs;ps=1000 fs;us=1000 ps;us=1000 ns;ms=1000 us;sec=1000 ms;min=60 sec;hr=60 min;END UNITS;2. IEEE预定义的标准逻辑数据类型VHDL的标准数据“BIT”类型是一个不可描述高阻状态的逻辑数据类型,定义为该类型的数据对象的取值是0或1。在IEEE库中的程序包STD_LOGIC_1164中定义了包含高阻(Z)和不定(X)状态的标准逻辑位和逻辑矢量数据 STD_LOGIC和STD_ LOGIC_VECTOR类型。使用这类数据类型时,必须写出库声明语句和使用程序包集合的声明语句。3. 用户定义的数据类型 VHDL允许用户根据芯片的资源和实际的需要定义数据类型。用户定义的数据类型格式:TYPE 数据类型名 数据类型名 数据类型定义;可以由用户定义的数据类型有:枚举(Enumerated)类型、整数(Integer)类型、实数(Real)类型、数组(Array)类型、存取(Access)类型、文件(File)类型、记录(Record)类型及时间(Time)类型(物理类型),常用类型有:(1)枚举类型枚举类型是一种特殊的数据类型,用符号表示一组实际的二进制数。这种类型适合表示有限状态机的状态,有助于改善复杂电路的可读性。定义格式:TYPE 数据类型名 IS (元素,元素,);例如:TYPE states IS (stO, stl, st2, st3);在综合过程中,通常自动编码枚举类型。例如将上述语句中的stO编码为0,以后的元素依次加1。(2)整数(Integer)和实数(Real)类型整数和实数类型在标准程序包中已定义。在实际应用中,由于数据类型的取值范围比较小,故应重新定义。特别要注意限定取值范围,以提高芯片的利用率。例如,有很多开始学习编写VHDL程序的初学者,往往忘记添加定义整数类型名的约束范围,编写程序后,综合也可通过。但是将该程序转换为具体的在系统可编程逻辑芯片的熔丝图文件时,开发可编程逻辑器件的系统却显示该芯片的资源不够,即使一个使用非常少的逻辑门和寄存器即可完成的简单程序也不能够满足要求。这是因为不加约束范围时,EDA开发软件将该整数类型名的整数范围定义为默认范围,占用芯片内部的资源非常多。定义格式:TYPE 数据类型名 Is 数据类型定义 约束范围;例如:TYPE digit IS INTEGER RANGE 0 TO 9;TYPE digit IS REAL RANGE -10 TO 10;(3)数组(Array)类型数组是相同类型数据集合形成的一个新的数据类型,可以是一维或多维数组,定义格式为:TYPE 数据类型名 IS ARRAY 范围 OF 原数据名例如:TYPE word IS ARRAY (15 DOWNTO 0) OF BIT;其中15指定数组元素的个数为16个,DOWNTO指定下标以降序变化。例如:TYPE matrix IS ARRAY (1 TO 8,1 TO 8) OF BIT;TO指定下标以升序变化,按低到高的顺序排列8个元素。为了使整个设计保持一致的设计风格,建议采用关键字“DOWNTO”说明数组或向量。向量最高位的下标值最大,并且处于向量的最左边。(4)记录(Record)类型记录将不同类型的数据和数据名组织在一起形成一个新的数据类型,其定义格式为:TYPE 数据类型名 IS RECORD元素名:数据类型名;元素名:数据类型名;END RECORD;例如:TYPE bank IS RECORDaddr0:STD_ LOGIC_VECTOR(7 DOWNTO 0);r0: INTEGER;END RECORD; 4. 属性 VHDL中可以具有属性(attribute)的项(items)如下: (1)类型和子类型。 (2)过程和函数。 (3)信号、变量和常量。 (4)实体、结构体、配置和程序包。 (5)元件。(6)语句标号。 属性是上述项目的特征,通过预定义属性描述语句可以得到预定义项目的有关值、功能、类型和范围。预定义的属性类型有:类型(TYPES)、数组、信号和字符串。定义属性的一般格式为:项目名属性表示符;(1)类型(TYPES)的属性常用类型属性有: TLEFT:T中最左端的值。 TRIGHT:T中最右端的值。 THIGH:T中的最大值。 TLOW:T中的最小值。 TPOS(n):参数n在T中位置序号。 TVAL(n)T中位置为n的值。 TSUCC(n):得到的值为TVAL(TPOS(n)+1)。 TPRED(n):得到的值为TVAL(TPOS(n)-1)。 TLEFTOF(n):得到靠近输入n的左边的值。 TRIGHTOF(n):得到靠近输入n的右边的值。 例如: TYPE number IS INTEGER 0 TO 9;i :=numberLEFT; -i=0i :=numberRIGHT; -i=9 i :=numberHIGH; -i=9 i :=numberLOW; -i=0 (2)数组属性 常用的数组属性有: ALEFT(n):索引号n的区间的左端位置序号。 ARIGHT(n):索引号n的区间的右端位置序号。 AfHIGH(n):索引号n的区间的高端位置序号。 ALOW(n):索引号n的区间的低端位置序号。 ALENGTH(n):索引号n的区间的长度值。 ARANGE(n):索引号n的区间的范围。 例如: TYPE bitll IS ARRAY (10 TO 20) OF BIT;VARIABLE len: INTEGER; len:=bitllLENGTH; -len=11(3)信号属性 sDELAYED(t):延时t个时间单位的信号。sSTABLE(t):在t个时间单位内,如果没有时间发生,返回TRUE:否则返回FALSE。sQUIET(t):如果该信号在t个时间单位内没有发生变化,返回TRUE:否则返回FALSE。sTRANSACTION:建立一个BIT类型的信号,当s每次改变时,该BIT信号翻转。sEVENT:若在当前模拟周期内,该信号发生了某个事件(信号值变化),返回TRUE:否则返回FALSE。事件(EVENT)要求信号值发生变化。sACTIVE:若在当前模拟周期内该信号发生事件处理,返回TRUE:否则返回FALSE。信号的活跃(ACTIVE)指信号值的任何变化。sLAST_EVENT:该信号前一个事件发生到现在所经过的时间。sLAST_VALUE:该信号在最近一个事件发生以前的值。sLAST_ACTIVE;从前一个事件处理到现在所经过的时间。例如: 表示一个上升沿时钟clk:clkEVENT AND clk=1; 一种方法NOT clkSTABLE AND clk=1; 另种方法 表示一个下降沿时钟clk:clkEVENT AND clk=0;2.2.4. VHDL 运 算 符VHDL 为 构 造 计 算 数 值 的 表 达 式 提 供 了 许 多 预 定 义 运 算 符。 预 定 义 运 算 符 可 分 四 种 类 型: 算 术 运 算 符、 关 系 运 算 符、 逻 辑 运 算 符 与 连 接 运 算 符。 分 组 算 符 运 算 二 元 运 算 符+-*/modrem* 加 减 乘 除 求 模 求 余 乘 方 一 元 运 算 符+-abs 正 号 负 号 求 绝 对 值 关 系 运 算 符=/= 相 等 不 等 小 于 大 于 小 于 等 于 * 大 于 等 于 二 元 逻 辑 运 算andornandnorxor 逻 辑 与 逻 辑 或 与 非 或 非 异 或 一 元 逻 辑 运 算not 求 补 连 接& 连 接 *注:(1) 其 中 = 操 作 符 也 用 于 表 示 赋 值 操 作;(2) 连接运算符&用于位的连接。用于一维数组时,右边的内容接在左边之后形成一个新的数组。例如:a 和 b 都是具有两位长度的位矢量,用连接符号连接后 (y = a & b;),y(3) = a(1), y(0)= b(0)。2.3 VHDL语句结构分类VHDL的程序结构由三部分构成:库、实体说明和结构定义。2.3.1. 库 (LIBRARY)库 是 专 门 存 放 预 编 译 程 序 包 (package) 的 地 方, 这 样 它 们 就 可 以 在 其 它 设 计 中 被 调 用。最常用的资源库为IEEE库,包含有IEEE标准的程序包,其中std_logic_1164是重要的程序包,大部分基于数字系统的程序包均以此程序包中所设定的标准为基础。一般使用程序包中的数据类或子程序时,需要首先声名程序包所在的库(使用LIBERARY语句)和程序包的名称(使用USE语句, USE 语 句 后 跟 保 留 字 ALL, 表 示 使 用 库/ 程 序 包 中 的 所 有 定 义。)例 库内资源使用举例LIBRARY ieee; - IEEE 标 准 库 的 标 志 名USE ieee.std_logic_1164.ALL; - 程 序 包 名USE ieee.std_logic_unsigned.ALL;前两条语句表示打开IEEE标准库中的std_logic_1164程序包中的所有资源。“ieee.std_logic_unsigned” 库 允 许 对 “std_logic” 类 型 的 信 号 使 用 某 些 运 算 符。VHDL语言描述的对象称为实体(ENTITY),实体可以代表如CPU那样的复杂电路,也可以代表一块电路板、一个芯片或一个门电路。一个基本设计实体(Design Entity)由实体说明(Entity Declaration )和结构体 (Architecture Body)两部分构成。实体说明部分规定了设计单元的公共信息(输入输出端口信号或引脚),而结构体部分定义了设计单元具体的内部特性。2.3.2 实体说 明(entity)实体是设计中最基本的模块,用来定义一个IC引脚规格及基本参数。其结构如下:ENTITY实体名 IS类属参数说明;端口说明;END实体名;实 体的 通 信 点 是 端 口 (PORT) ,端口说明是对基本设计实体单元与外部接口的描述,一般书写格式为:PORT ( 端口名,端口名,:模式 数据类型名;端口名,端口名,:模式 数据类型名;端口名,端口名,:模式 数据类型名;);每 个 端 口 必 须 定 义 : 信 号 名: 端 口 信 号 名 在 实 体 中 必 须 是 唯 一 的 属 性: 它 包 括 模 式 (MODE): 决 定 信 号 的 方 向; 类 型 (TYPE): 端 口 所 采 用 的 数 据 类 型。 端 口 模 式 (MODE) 有 以 下 几 种 类 型: IN 信 号 进 入 实 体 但 并 不 输 出 OUT 信 号 输 出 到 实 体 外 部,但 不 会 在 内 部 反 馈 使 用 INOUT 信 号 是 双 向 的 (既 可 以 进 入 实 体,也 可 以 离 开 实 体) BUFFER 信 号 输 出 到 实 体 外 部, 但 同 时 也 在 实 体 内 部 反 馈 VHDL语言有10种数据类型,在逻辑电路设计中可以用std_logic说明的位逻辑数据bit,也可以使用 std_logic_vector 说明的位矢量 bit_vector 。在使用时,须在实体说明之前增加两条语句:LIBRARYIEEE;-IEEE库USEIEEE.STD_LOGIC_1164.ALL; -调用其中STD_LOGIC_1164程序包中所有的资源 (.ALL)例 实体的表述方法举例如 下 图 所 示,D 是 16-bit 输 入 总 线,CLK, Reset, 和 OE 是 输 入 信 号,Q 是 16-bit 三 态 输 出 总 线,AD 是 16-bit 双 向 总 线,INT 是 输 出 信 号, 但 也 在 内 部 使 用,AS 是 三 态 输 出 信 号 图1. 实体my_design1的外部端口实 体 my_design1 的VHDL 表 述 为:ENTITY my_design1 isPORT ( d:IN std_logic_vector (15 downto 0);clk,reset,oe:IN std_logic; q:OUT std_logic_vector (15 downto 0); ad:INOUT std_logic_vector (15 downto 0); int:BUFFER std_logic; as:OUT std_logic);END my_design1;2.3.3 结 构 体 (Architecture)结构体描述了实体中具体的逻辑功能,格式如下:ARCHITECTURE 结构体名 of 实体名 is定义语句 内部信号,常数,数据类型等的定义;BEGIN并发处理语句;END 结构体名;注:结构体包含的并发描述语句,语句执行的顺序与其出现的次序无关。例 结构体描述方法举例 ENTITY logic ISPORT ( a,b : IN std_logic;w, x, y:OUT std_logic; z:OUT std_logic_vector (3 downto 0);END logic;ARCHITECTURE behavior of logic isBEGINy = (a AND b);w = (a OR b);x = 1;z = “0101”;END behavior;2.4 顺序语句 ( Sequential 语 句 )顺序描述语句按出现的次序顺序执行,出现在进程(Process)或子程序中。VHDL中的顺序语句有:2.4.1 信号赋值语句格式为: 信号名 = 信号变量表达式赋值符号两边信号量的类型和长度应该一致。2.4.2 变量赋值语句格式为:变量名:= 表达式;变量赋值仅用在进程、函数和过程中。赋值符号也可为任何对象赋初值。Process,Function,Procedure中的语句都是顺序执行的,2.4.3 IF-THEN-ELSE该语句根据一个或一组条件的布尔运算而选择某一特定的执行通道,其格式如下:IF THEN顺序处理语句;ELSIF THEN顺序处理语句;ELSE顺序处理语句;END IF;例 IF-THEN-ELSE 语句举例 PROCESS (sel, a, b, c, d)BEGINif (sel = “00”) then step = a;elsif (sel = “01”) thenstep = b;elsif (sel = “10”) thenstep = c;else step 顺序处理语句;END CASE;CASE 和 IS 间的表达式取值满足条件表达式的值时,程序执行由符号=指定的顺序处理语句。例 CASE语句举例library ieee;use ieee.std_logic_1164.all;entity mux is port (a,b,c : in std_logic;output: out std_logic );end mux;ARCHITECTURE archdesign OF mux ISSIGNAL option: std_logic_vector(0 TO 1);BEGINdecode: PROCESS (a, b, c, option)BEGINCASE option ISWHEN 00 = output output output output = 0;END CASE;END PROCESS decode;END archdesign;2.4.5 WAIT 语句进程(PROCESS)的执行过程可以由WAIT等待语句控制,WAIT语句有以下4种格式:WAIT : 无限等待;WAIT ON (信号名表):当其中任何一个信号发生变化,激活该进程;WAIT UNTIL (条件表达式):当条件表达式的取值为真时,激活该进程;WAIT FOR (时间表达式): 给出了进程被挂起的最长时间,一旦超过该值,则激活进程。2.5 并 行 (Concurrent) 语 句并行语句位于进程外部,语句不分先后,同时执行。在此主要讲述常用的 WHEN-ELSE 语句和 WITH-SELECT-WHEN 语句。2.5.1 WHEN-ELSE 语句这种条件型信号赋值语句根据不同的条件,将不同的值赋给信号,其格式如下:信号名=表达式1when 条件1 else 表达式2when 条件2 else 表达式3when 条件3 else 表达式4when 条件4 else 表达式5when 条件5 else 在每个表达式后都跟有“WHEN”指定的条件,满足该条件时,将表达式的只赋给信号,最后一个表达式可以不跟条件,它表明当上述条件都不满足时,将该表达式的值赋给信号。例 用WHEN-ELSE语句描述四选一多路选择器library ieee;use ieee.std_logic_1164.all;entity mux4 is port( a,b,c,d,I,j: IN std_logic; x: OUT std_logic);end mux4;architecture archmux of mux4 issignal s : std_logic_vector (1 downto 0);begins = I&j;x = a when ( s = “00” ) else b when ( s = “01” ) else c when ( s = “10” ) else d;end archmux;2.5.2 WITH-SELECT-WHEN 语 句选择型信号赋值语句用于并行的信号赋值,其格式为:with 表达式 select 信号名=表达式1when 条件1 else 表达式2when 条件2 else 表达式3when 条件3 else 表达式n-1when 条件n-1 else 表达式nwhen 条件n else 注:WITH-SELECT-WHEN 必 须 指 明 所 有 互 斥 条 件例 WITH-WHEN-ELSE语句举 例- 四 选 一 多 路 开 关 (mux)library ieee;use ieee.std_logic_1164.all;entity mux is port (a, b, c, d:in std_logic; s:in std_logic_vector(1 downto 0); x:out std_logic );end mux;architecture archmux of mux isbeginwith s select x = a when “00”,- x 根 据 s 的 不 同 而 赋 值 b when “01”, c when “10”, d when “11”;end archmux;小结:几种语句的比较 语句With-select-whenWhen-elseIf-elseCase-when选择条件一个信号的不同值,互斥多个信号多种组合,不必互斥多个信号多种组合,不必互斥一个信号的不同值,互斥语句属性并行并行顺序顺序用途编码、译码、多路选择器优先编码器,地址译码器优先编码器,地址译码器编码、译码、多路选择器,2.6 结构体的子结构描述一个结构体可以用多个子结构组成, 有利于编程和查错。 VHDL语言可以使用3种子结构描述语句,即BLOCK语句、PROCESS语句和子程序。2.6.1 BLOCK语句 该语句组合结构体中的并行描述语句,可增加并行描述语句及其结构的可读性,使结构体层次清晰, 对程序的修改和移植非常有用. 该语句的结构为:块结构名:BLOCKBEGINEND BLOCK块结构名;BLOCK语句中描述的各个语句可并发执行, 举例如下:例: 采用BLOCK语句描述二选一电路ENTITY mux IS PORT ( d0,d1: IN BIT;Sel: IN BIT; Q: OUT BIT );END mux;ARCHITECTURE connect OF mux IS SIGNAL tmp1, tmp2, tmp3: BIT;BEGINcale:BLOCKBEGIN tmp1 = d0 AND sel;tmp2 = d1 AND ( NOT sel) ;tmp3 = tmp1 OR tmp2;q = tmp3;END BLOCK cale;END connect;其中, cale:为块结构名, SIGNAL 为信号说明语句的关键字.2.6.2 进 程 (PROCESS)语句进程 (PROCESS)用于描述顺序(sequential)事件并且包含在结构体中。顺序描述语句按语句出现的次序顺序执行。进程语句的结构为: 进程名 :PROCESS( 敏感信号1,敏感信号2, )BEGINEND PROCESS;进程语句包括三部分 :敏 感 表 (Sensitivity list) :当 敏 感 表 中 的 某 个 信 号 变 化 时 进 程 被 激 活进 程 (PROCESS) :对 行 为 的 描 述结 束 语 句 (END) :描 述 进 程 的 结 束进程启动后,PROCESS中的语句将由上到下逐句执行一遍,执行到最后一个语句后,返回到开始语句,等待敏感信号的出现,因此,只要PROCESS中指定的敏感信号变化一次,该进程就执行一次。注:一个结构体可以包含多个进程语句;当进程中使用了WAIT语句时,进程不允许带有敏感信号。例 简单的进程实例:mux: PROCESS (a, b, s) - 敏 感 表BEGINif ( s = 0 ) thenx = a; else- 定 义 一 段 进 程x = b; end if;END PROCESS mux;这 里 进 程 mux 对 于 信 号 a, b, s 敏 感 ,无 论 何 时, 信 号 a, b 或 s 发 生 变 化, 进 程 中 的 语 句 将 被 重 新 赋 值 计 算。2.6.3 子 程 序在VHDL中子程序由一系列说明和语句组成,可调用其他子程序,其本身也可以嵌套子程序。子 程 序 有 过 程 (PROCEDURE) 和 函 数 (FUNCTION) 两种类型。 函 数 只 能 用 以 计 算 数 值, 而 不 能 用 以 改 变 与 函 数 形 参 相 关 的 对 象 的 值。因 此,函 数 的 参 量 只 能 是 方 式 为 IN 的 信 号 与 常 量, 而 过 程 的 参 量 可 以 为 IN,OUT,INOUT 方 式。过 程 能 返 回 多 个 变 量, 函 数 只 能 有 一 个 返 回 值.1. 过程语句 ( Procedure )结构如下:PROCEDURE 过程名(参数1:参数2:) IS 定义语句;(变量等定义)BEGIN顺序处理语句;(过程处理语句)END 过程名注:过程中的输入/输出参数均应列在紧跟过程名的括号中。例 过 程 举 例: ENTITY PROC IS PORT ( A: IN BIT_VECTOR (0 TO 2);M: OUT BIT_VECTOR (0 TO 2);END PROC;ARCHITECTURE EXAMPLE OF PROC ISPROCEDURE SIMPLE ( W,X,Y: IN BIT; Z: OUT BIT ) ISBEGIN Z=(W AND X) OR Y;END SIMPLE;PROCESS (A)BEGINSIMPLE (A(0),A(1),A(2),M(0);SIMPLE (A(2),A(1),A(0),M(1);SIMPLE (A(1),A(2),A(0),M(2);END PROCESS;END EXAMPLE;2. 函数语句 ( Function )结构如下:FUNCTION 函数名(参数1:参数2:)RETURN 数据类型名 IS定义语句;BEGIN顺序处理语句;RETURN 返回变量名;END 函数名;注:函数语句括号内的所有参数都是输入参数或输入信号,函数必须以RETURN语句结束,并且返回一个值。例 函 数 举 例:- 此 函 数 返 回 两 数 中 的 较 小 数FUNCTION Min( x,y : INTEGER) RETURN INTEGER ISBEGINIF x RETURN 1;WHEN 1 = RETURN 0;WHEN z = RETURN z;END CASE;END Invert;END Logic;2.7 用VHDL描述基本逻辑电路2.7.1 描述组合电路1. 用VHDL语言描述一个如图所示的三态门。doutdinen图3 三态门程序如下: LIBRARY IEEE; USE IEEESTD_LOGIC_1164.ALL; ENTITY tri_gate IS PORT(din,en : IN STD_LOGIC; Dout :OUT STD_LOGIC); END tri_gate; ARCHITECTURE example OF tri_gate IS BEGIN PROCESS (din,en) BEGIN IF en=l THEN dout = din;ELSE dout =Z;END IF; END PROCESS;END example; 2. 用VHDL语言描述如图所示的电路:cabm图4 逻辑电路 ENTITY combine IS PORT(a,b,c:IN BIT; m:OUT BIT);END combine; ARCHITECTURE example OF combine IS PROCESS(a, b, c) VARIABLE n: BIT; BEGIN IF a=l THEN n:= b;ELSE n:= C;END IF; m = n; END PROCESS; END example;注:用进程描述组合电路时,将输入信号a、b和c都写到敏感列表中,保证每个输入信号的变化均启动该进程,引起输出信号发生变化;否则未列入敏感列表的信号变化不启动该进程,这意味着该进程描述的电路引入了锁存器。2.7.2 设计时序电路1. D 型 锁 存 器描述一个时钟信号为clk,数据输入信号为data,输出信号为q的锁存器。时钟信号clk为高电平时,输出信号q随数据信号data变化而变化;为低电平时,输出信号保持不变,电路处于锁存状态。程序如下:entity latch isport(data,clk:in bit;q:out bit);end latch;architecture behave Of latch iSbeginprocess(clk,data)beginif(clk= 1)thenq=data;end if;end process;end behave;2. 上升沿触发的D型触发器带有异步复位(reset,高电平有效)、异步置位(set,高电平有效)功能和上升沿触发的D型触发器。 程序如下: library ieee; use ieeestd_logic_1164all; entity dff is port(d,clk,reset,set:in std_logic; q:out std_logic); end dff; architecture async_set_reset of dff is BEGIN setreset:process(clk,reset,set) beginif reset= l then q= 0;elsif set= l then q= 1;elsif rising_edge(clk) then q= d;end if; end process setreset; end async_set_reset;程序中rising_edge(clk)表示如果输入信号clk的上升沿来到时,将输入信号d赋给输出信号q。上升沿rising_edge和下降沿fallin_edge函数包含在标准库ieeestd_logic_1164a11中,用于描述上升沿和下降沿有效的事件。3. J_K型触发器带有复位(-clr,低电平有效)置位(-set,低电平有效)功能和上升沿触发的J-K型触发器的程序如下; LIBRARY IEEE; USE IEEESTD_LOGIC _1164ALL; ENTITY jkff ISPORT (set,clr,clk,j,k :IN STD_LOGIC;q,qb :OUT STD_LOGIC); END jkff ; ARCHITECTURE rtl OF jkff IS SIGNAL q_s, qb_s: STD_LOGIC; BEGIN PROCESS( set,clr,clk,j,k) BEGIN IF ( set =0) THEN q_s = l; qb_s =0;-置位; ELSIF ( clr =0) THEN q_s = 0; qb_s = 1;-复位; ELSIF (clk EVENT AND clk=1) THENIF (j =0) AND ( k =1) THEN q_s = 0; qb_s =1;ELSIF (j =1) AND ( k =0) THEN q_s = 1; qb_s =0;ELSIF (j=1) AND ( k=1) THEN q_s = NOT q_s; qb_s = NOT qb_s;END IF; END IF;q = q_s;qb = qb_s;END PROCESS; END rtl;4. 计数器用VHDL描述一个具有清零和计数允许功能的十进制计数器,输入信号为clk,清零控制信号为clr(低电平有效),计数允许控制信号为en(高电平有效)。程序如下: library ieee; use ieeestd _logic_1164all; entity counter0 is port( clk,clr,en:in std_logic; count:out integer range 0 to 15); end; architecture counter0_arch of counter0 is begin process(clk,clr) variable countl;inteqer range 0 to 15; begin if(clr=0)thencountl:=0; elsif rising_edge(clk)thenif(en=l) thenif countl=9 thencountl:=0; else countl:= countl+1; end if; end if; end if;count=countl;end process; end counter0 _arch; 5. 寄 存 器 ( Register ) 三 种 描 述 寄 存 器 的 方 法1.PROCESS (clk,d)BEGINIF (clkeve
展开阅读全文