教学用第1章硬件描述语言vhdl_第1页
教学用第1章硬件描述语言vhdl_第2页
教学用第1章硬件描述语言vhdl_第3页
教学用第1章硬件描述语言vhdl_第4页
教学用第1章硬件描述语言vhdl_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

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

文档简介

1、第 1 章硬件描述语言 VHDL数字系统设计分为硬件设计和设计, 但是随着计算机技术、超大规模集成电路(CPLD、FPGA)的发展和硬件描述语言(HDL, Hardware DescriptionLanguage)的出现,软、硬件设计之间的界限被打破,数字系统的硬件设计可以完全用来实现,只要掌握了 HDL 语言就可以设计出各种各样的数字逻辑电路。1.1 老的硬件设计方法老的硬件设计方法有如下几个特征:(1) 采用自下而上的设计方法使用该方法进行硬件设计是从选择具体元器件开始,并用这些元器件进行逻辑电路设计,从而完成系统的硬件设计,然后再将各功能模块连接起来,完成整个系统的硬件设计,(2) 采用

2、通用逻辑元器件通常采用 74 系列和 CMOS4000 系列的产品进行设计(3) 在系统硬件设计的后期进行调试和仿真只有在部分或全部硬件电路连接完毕,才可以进行电路调试,一旦考虑不周到,系统设计存在较大缺陷,则要重新设计,使设计周期延长。(4) 设计结果是一张电路图当设计调试完毕后,形成电原理图,该图包括元器件型号和信号之间的互连关系等等。老的硬件设计方法已经使用了几十年,是广大电子工程师熟悉和掌握的法,但是现在这种方法老了,不仅方法老了,就连使用的元器件也老了。1.2 使用 HTL 的硬件设计方法所谓硬件描述语言,就是利用一种人和计算机都能识别的语言来描述硬件电路的功能,信号连接关系及定时关

3、系,它可以比电原理图更能表示硬件电路的特性。该方法有如下特征:(1) 支持自顶向下的设计方法所谓自顶向下的设计方法就是从系统的总体要求出发,自顶向下分三个层次对系统硬件进行设计。第一个层次是行为描述,所谓行为描述,实际就是对整个系统的数学模型的描述,在行为描述阶段,并不真正考虑其实际操作和算法怎么实现,而是考虑系统的结构和工作过程是否能达到系统设计规格书的要求。第二个层次是数据流描述,又称为寄存器描述或 RTL 方式描述,该描述比行为描述更注重硬件的具体实现,通过该描述可以导出系统的逻辑表达式,为逻辑综合作准备,当然进行逻辑综合和逻辑综合工具的能力有关,当然设计还必须了解逻辑综合工具的说明和规

4、定,第三个层次为逻辑综合。该层次把 RTL 描述的程序转换成基本逻辑元件表示的文件,该文件就象老的设计方法中的电原理图。(2)采用大量的 ASIC(3)早期仿真以确定系统的可行性(4)使设计更容易只需写出系统的 HDL 源程序文件,其它由计算机去做(5) 全部设计文件就是 HDL 源程序文件1.3 VHTL 硬件设计语言当前 ASIC 制造商都自己开发了 HDL 语言,但是都不通用,只有国防部开发的 VHDL 语言成为了 IEEE. STD_1076 标准,并在全世界得到了承认。该语言集成了各种 HDL 语言的优点,使数字系统设计更加简单和容易。VHDL语言是一个规模庞大的语言,在使用它之前完

5、全学会它是很难的,本书介绍的只是 VHDL 语言的一部分。1.4VHDL 语言的基本结构VHDL 语言通常包含实体(Entity),构造体(Architecture),配置(Configuration) , 包集合(Package) , 和库(Library) 五部分. 其中实体用于描述所设计的系统的外部接口信号;构造体用于描述系统的结构和行为;建立输入和输出之间的关系;配置语句安装具体元件到实体结构体对,可以被看作是设计的零件;包集合存放各个设计模块共享的数据类型、常数和子程序等;库是专门存放预编译程序包的地方。如下详细介绍。1.4.1 基本设计单元VHDL 的基本设计单元就是实体,无论数字

6、电路复杂还是简单,都是由实体和构造体组成。(1)实体说明实体说明有如下结构:ENTITY实体名IS端口说明END实体名;(VHDL 语言中不分大小写字母)其中:端口说明是对设计实体中输入和输出借口进行描述,格式如下:PORT(端口名(,端口名):方向 数据类型名;:端口名(,端口名):方向 数据类型名);端口名是赋予每个系统引脚的名称,一般用几个英文字母组成。端口方向是定义引脚是输入还是输出,见下表:常用的端口数据类型有两种:BIT 和 BIT_VECTOR,当端口被说明为 BIT 时,只能取值“1”或“0”,当端口被说明为 BIT_VECTOR 时,它可能是一组二进制数。方向说明IN输入到实

7、体OUT从实体输出输出INOUT双向BUFFER输出(但可以反馈到实体内部)LINKAGE不指定方向例:PORT(n0, n1, select: IN BIT;q: OUT BIT;bus: OUT BIT_VECTOR(7 DOWNTO 0);本例中,n0, n1, select 是输入引脚,属于 BIT 型,q 是输出引脚,BIT型,bus 是一组 8 位二进制总线,属于 BIT_VECTOR,例:LIBRARY IEEE;USE IEEE.STD_LOGIC.1164.ALL;ENTITY mm ISPORT(n0,n1,select:IN STD_LOGIC;Q:OUT STD_LOG

8、IC;Bus:OUT STD_LOGIC_VECTOR(7DOWNTO 0);END mm;在此例中端口数据类型取自IEEE 标准库(该库中有数据类型和函数的说明),其中 STD_LOGIC 取值为“0”,“1”,“X”和“Z”。因为使用了库所以在实体说明前要增加库说明语句。(2) 构造体构造体是实体的一个重要部分,每一个实体都有一个或一个以上的构造体。1)一般说明构造体格式如下:ARCHITECTURE构造体名 OF 实体名 IS定义语句信号,常数,数据类型,函数等的定义BEGIN并行处理语句END 构造体名;例:ENTITY nax ISPORT(a0,a1:IN BIT;Sel:IN B

9、IT;Sh:OUT BIT);END nax;ARCHITECTUREdataflow OF nax ISBEGINsh=(a0 AND sel) OR (NOT sel AND a1);END dataflow;构造体描述设计实体的具体行为,它包含两类语句:并行语句并行语句总是在进程语句(PROS)的外部,该语句的执行与书写顺序无关,总是同时被执行顺序语句顺序语句总是在进程语句(PROS)的,从仿真的角度,该语句是顺序执行的一个构造体包含几个类型的子结构描述,这些描述是:*BLOCK 描述(块描述)*PROS 描述(进程描述)*SUNPROGRAMS 描述(子程序描述)2) BLOCK 语句

10、描述使用 BLOCK 语句描述的格式如下:块标号:BLOCKBEGIN:END BLOCK块标号:例:二选一电路ENTITY mux ISPORT (d0,d1,sel: IN BIT;q: OUT BIT);END mux;ARCHITECTUREconnect OFmuxISSIGNAL tmp1,tmp2,tmp3: BIT;BEGINcale:BLOCKBEGINtmp1=d0 AND sel;tmp2=d1 AND (NOT sel);tmp3=tmp1 OR tmp2;q=tmp3;END BLOCK cale;END connect;在对程序进行仿真时,BLOCK 中的语句是并行

11、执行的,与书写顺序无关,这一点和构造体中直接写的语句是一样的。3)进程(PROS)描述进程描述的格式如下:进程名:PROS(信号 1,信号 2,。)BEGIN:END PROS 进程名;* 一般用于组合电路进程模式:进程标记:PROS ( 信号名, 信号名, 信号名)VARIABLE 变量名 : STD_LOGIC;VARIABLE 变量名 : STD_LOGIC;BEGIN-指定信号-指定变量-过程调用-如果语句-CASE 语句-循环语句ENDPROS 进程标记;* 用于时序电路进程模式:进程标记:PROS ( 信号名, 信号名, 信号名)VARIABLE 变量名 : STD_LOGIC;V

12、ARIABLE 变量名 : STD_LOGIC;BEGINWAIT UNTIL 时钟信号 = 1;-指定信号-指定变量-过程调用-如果语句-CASE 语句- 循环语句END PROS 进程标记;例:ENTITY mux1 ISPORT (d0,d1,sel: IN BIT;q: OUT BIT);END mux1;ARCHITECTUREconnect OF mux1ISBEGINcale:PROS(d0,d1,sel)VARIABLE tmp1,tmp2,tmp3: BIT;-在进程中定义的变量BEGINtmp1:=d0 AND sel;-输入端口向变量赋值tmp2:=d1 AND (NOT

13、sel);tmp3:=tmp1 OR tmp2;q=tmp3;END PROS cale;ENDconnect;在 PROS 中的语句是顺序执行的,这一点和 BLOCK 中的语句是不一样的。当 PROS 所带的信号量发生变化时,PROS 中的语句就会执行一遍。4)子程序描述子程序的概念和其它高级程序中子程序的概念相同,在VHDL中有两种类型:过程(Procedure)函数(Function)1. 过程的格式:PROCEDURE 过程名(参数 1,参数 2。)IS定义变量语句BEGIN顺序处理语句END 过程名;例:PROCEDURE vector_to_(z: IN STD_LOGIC_VEC

14、TOR;x_flag : OUT;q: INEGER) ISBEGINq:=0;x_flag:=FALSE;FOR i IN z RANGE LOOPq:=q*2;IF(z(i)=1)THENq:=q+1;ELSEIF (z(i)/=10)THENx_flag:=TRUE;END IF;END LOOP;END vector_to_;在过程中,语句是顺序执行的。2函数函数的格式:FUNCTION 函数名(参数 1,参数 2。)RETURN数据类型名IS定义变量语句BEGIN顺序处理语句RETURN 返回变量名;END 函数名;在 VHDL 语言中函数的参数都是输入信号,例:FUNCTIONmi

15、n(x,y:EGER)RETURNEGERISBEGINIF XWHEN 1RETURN 0;=WHEN ZRETURN Z;=END CASE;END invert;END logic该包使用例:USE logic.three_level_logic,logic.invert;/使用数据类型和函数两个项目ENTITYinverter ISPORT(x:hree_level_logic ;y: OUT three_level_logic);END inverter;ARCHITECTURE inverter_body OF inverter ISBEGINkk:PROSBEGINYset, b

16、=qb, c=q)U2:nand2 PORT MAP(a=reset, b=q, c=qb)END rsff1;ARCHITECTURE rsff2 OF rs ISBEGINq=NOT(qb AND set);qb=NOT(q AND reset);END rsff2两个构造体,可以用配置语句进行设置:CONFIGRATION rscon OF rs IS /选择构造体 rsff1FORrsff1ENDFOR;ENDrscon;1.4.3VHDL 中使用的数据类型和运算操作VHDL 可以象其它高级语言一样定义数据类型,但还可以用户自己定义数据类型。(1)信号、常量和变量信号:通常认为信号是电

17、路中的一根线常数:可以在数字电路中代表电源、地线等等变量:可以代表某些数值1常数常数的描述格式:CONSTANT常数名:数据类型:=表达式例:CONSTANTVcc: REAL:=5.0;CONSTANTDALY: TIME:=100ns;FBUS: BIT_VECTOR:=”0101”;CONSTANT2变量变量只能在进程、函数和过程中使用,一旦赋值立即生效。变量的描述格式:VARIABLE变量名:数据类型 约束条件:=表达式例:VARIABLEx, y:EGER;VARIABLEcount:EGER RANGE 0 TO 255:=10;3信号信号除了没有方向的概念以外几乎和端口概念一致。

18、信号的描述格式:SIGNAL信号名:数据类型 约束条件:=表达式例:sys_clk: BIT:=0;SIGNALground: BIT:=0SIGNAL在程序中,信号值输入信号时采用代入符”=”,而不是赋值符“:=”,同时信号可以附加延时。信号传送语句:s1=s2 AFTER 10ns信号是一个全局量,可以用来进行进程之间的通信4信号与变量的区别信号赋值可以有延迟时间,变量赋值无时间延迟信号除当前值外还有许多相关值,如历史信息等,变量只有当前值进程对信号敏感,对变量不敏感信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见信号可以看作硬件的一根连线,但变量无此对应关系1.4.4VHD

19、L 中的数据类型(1) 标准数据类型1整数(EGER)范围:-2147483547-21474836462实数(REAL)范围:-1.0E38-1.0E38书写时一定要有小数。3位(BIT)在数字系统中,信号经常用位的值表示,位的值用带单引号的1和0来表示明确说明位数值时:BIT(1)4位矢量(BIT_VECTOR)位矢量是引号括起来的一组位数据“010101”5量()只有“真”和“假”两个状态,可以进行关系运算6字符(CHARACTER)字符量通常用单引号括起来,对大小写敏感明确说明 1 是字符时:CHARACTER(1)7字符串(STRING)字符串是双引号括起来的一串字符:“laksdk

20、lakld”8时间(TIME)时间的:fs,ps,ns,ms,sec,min,hr例: 10 ns整数数值和之间应有空格9错误等级(SEVERITY LEVEL)用来表示系统的状态,它共有 4 种:NOTE(注意)WARNING(警告)ERROR(错误)FAILURE(失败)10.大于等于零的整数(NATURAL)、正整数(ITIVE)只能是正整数数据除定义类型外,有时还需要定义约束范围。例:EGER RANGE100 DOWNTO 0BIT_ VECTOR (3 DOWNTO 0)REAL RANGE 2.0 TO 30.0(2)用户定义的数据类型用户定义的数据类型的一般格式:TYPE数据类

21、型名 ,数据类型名 数据类型定义不完整的数据类型格式:TYPE数据类型名 ,数据类型名;可由用户定义的数据类型为:* 枚举(ENUMERATED)格式:TYPE 数据类型名 IS(元素、元素、);例 1: TYPEk In,Tue,wed,Thu,Fri,Sat);例 2: TYPE STD_LOGIC IS(U,X,0,1,Z,W,L,H,-);* 整数(EGER)格式:TYPE 数据类型名 IS 数据类型定义 约束范围例:TYPEdigit ISEGER RANGE 0 TO 9* 实数(REAL)格式:TYPE 数据类型名 IS 数据类型定义 约束范围例:TYPEcurrent IS R

22、EALRANGE -1E4 TO 1E4* 数组(ARRAY)格式:TYPE数据类型名 ISARRAY范围 OF 原数据类型名;例:TYPE word IS ARRAY (1TO 8) OF STD_LOGIC;TYPE word IS ARRAY (EGER 1 TO 8) OF STD_LOGIC;TYPE instruction IS (ADD,SUB,INC,SRL,SRF,LDA,LDB);SUBTYPE digit ISEGER 0 TO 9;TYPE indflag IS ARRAY (instructionADDTOSRF)OFdigit;数组常在总线、ROM 和 RAM 中使

23、用。* 时间(TIME)格式: TYPE 数据模型名不副实 IS范围UNITS 基本;END UNITS;TYPE time RANGE 1E18 TO 1E18UNITSfs;ps=1000fs;ns=1000ps;us=1000ns;ms=1000us;sec=1000 ms;min=60 sec;hr=60 min;END UNITS;*(RECODE)将不同的数据类型放在一块,就是类型数据格式:TYPE 数组类型名 IS RECORD元素名:数据类型名;元素名:数据类型名;:END RECORD;例:TYPE bIS RECORDaddr0: STD_LOGIC_VECTOR(7 DO

24、WNTO0);addr1: STD_LOGIC_VECTOR(7 DOWNTO0);r0:EGER;END RECORD;存取(ACS)文件(FILE)(3)数据类型的转换数 据 类 型 转 换 函 数 有VHDL语言 的 包 提 供 , 例 如 :STD_LOGIC_1164,STD_LOGIC_ARITH 等等转换函数见表:函数说明STD_LOGIC_1164 包 TO_STDLOGICVECTOR(A) TO_BITVECTOR(A) TO_LOGIC(A) TO_BIT(A)由BIT_VECTOR转换成STD_LOGIC_VECTOR由STD_LOGIC_VECTOR转 换 成BIT_

25、VECTOR由 BIT 转换成 STD_LOGIC由 STD_LOGIC 转换成 BITSTD_LOGIC_ARITH 包CONV_STD_LOGIC_VECTOR(A,位长)CONV_EGER(A)由EGER,UNSIGNED 和 SIGNED 转换成STD_LOGIC_VECTOR由 UNSIGNED 和 SIGNED 转 换 成EGER例:由 STD_BIT_VECTOR 转换成EGERLIBRARYIEEEUSE IEEE.STD_LOGIC_1164.ALLUSE IEEE.STD_LOGIC_UNSIGNED.ALLENTITY add5 ISPORT(num: IN STD_LO

26、GIC_VECTOR(2DOWNTO0);:);END add5;ARCHITECTURE rtl OF add5 ISSIGNAL in_num:EGER RANGE 0 TO 5;:BEGINSTD_LOGIC_UNSIGNED 包CONV_EGERSTD_LOGIC_VECTOR 转换成EGERIn_num=CONV_EGER(num);END rtl;(5)有关 BIT_VECTOR 和 STD_BIT_VECTOR 的语句例:SIGNAL a: BIT_VECTOR(11 DOWNTO 8);SIGNAL b: STD_LOGIC_VECTOR(11 DOWNTO 0);a=X”A8

27、”; 十六进制可以赋予位矢量b=X”A8”;十六进制不可以赋予逻辑矢量,所以此句错,逻辑量中只能赋予二进制b=TO_STDLOGICVECTOR(X”AF7”);十六进制变换b=TO_STDLOGICVECTOR(O”5177”); 八进制变换b=TO_STDLOGICVECTOR(B”1010_1111_0111”); 三位二进制变换(6) IEEE 标准“STD_LOGIC”和”STD_LOGIC_VECTOR”1993 年制定的标准 IEEE STD1164 对 STD_LOGIC 的值做如下规定:U初始值X不定0011ZW弱信号不定L 弱信号 0H 弱信号 1-不可能情况1.4.5 V

28、HDL 语言的运算操作符优 先 级别类型操 作符说明高逻辑运算符AND逻辑与OR逻辑或NAND逻辑与非NOR逻辑或非XOR逻辑异或关系运算符=等号/=不等号大于=大于等于加、减、并+加(1)逻辑运算符要求运算符左右的数据类型必须相同,例:x=(a AND b) OR (NOT c AND d);x=bAND a ANDd AND e;x=bOR c OR dOR e;x=aXOR d XORe;a=(x1 AND x2)OR (y1 AND y2);(2) 算数运算符在使用乘法运算符时,应该特别慎重,因为它可以使逻辑门数大大增加。低置运算符-减&并置正负运算符+正-负乘除法运算符*乘/除MOD

29、取模REM取余*指数ABS取绝对值NOT取反(3)关系运算符应该注意小于等于=和代入运算符的不同(从上下文区别)(4)并置运算符并置运算符 ”&” 用于位连接,例如:y(0)=b(0)&eny(1)=b(1)&eny(2)=b(2)&eny(3)=b(3)&eny(4)=a(0)y(5)=a(1)y(6)=a(2)y(7)=a(3)从上可以看出 a,b 是四位长度的矢量,而 y 的位长是 7 位,上述情况可以表示成:tmp_b=b AND (en&en&en&en);y= a&tmp_b;若是位连接,可以简单写为:tmp_b=b AND (en,en,en,en);1.4.5VHDL 语言构造

30、体的描述方式有三种描述方式:行为描述,RTL 描述和 ASIC 描述,采用后两种描述方式可以进行逻辑综合。(1) 行为描述描述数字系统的行为,主要用于仿真和系统工作原理的研究。下面介绍一些语句。1)代入语句格式: 信号量=敏感信号量表达式;例如: z=a NOR(b NAND c);该例中有三个敏感量,无论哪一个发生变化都可以使 z 变化。具有时间延迟的代入语句:a=b AFTER 10 ns表示当 b 发生变化 10 ns 后 a 才变化。例:与门电路ENTITY and2 ISPORT(a,b : IN BIT;c: OUT BIT);END and2;ARCHITECTURE and2_

31、behaveOF and2 ISBEGINc=a AND b;END and2_behave;2)延时语句VHDL 中有两种延时语句:惯性延时和传输延时。*惯性延时VHDL 中惯性延时是缺省的,因为逻辑硬件电路总是有时间延迟的,若延迟时间是 20ns,那末输入信号时间若小于 20ns,则输出信号将不跟随输入信号的变化。有时为使延迟时间更真实际电路,就专门设置惯性时间:b=a AFTER 10 ns;* 传输延时传输延时常代表总线、连接线的延迟时间,该时间必须专门说明。该传输延时只对信号起纯延时作用。例:b=TRANSPORT a AFTER 20 ns;(2) 数据流描述方式数据流描述方式是一

32、种可以进行逻辑综合的描述方式,由于要进行逻辑综合所以对使用的语句有一定的限制,VHDL 中的每一个命令和语句都对逻辑综合能力进行了定义,要进行逻辑综合的设计实体就要使用有逻辑综合能力令和语句。例:四选一电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY mux42 ISPORT(input:IN STD_LOGIC_VECTOR(3DOWNTO 0);Sel:IN STD_LOGIC_VECTOR(1DOWNTO 0);Y:OUT STD_LOGIC);END mux42;ARCHI

33、TECTURE app OF mux42 ISBEGINyn1.b=n2,c=m);1.4.6VHDL 语言的主要描述语句(1)顺序描述语句顺序描述语句只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的出现的顺序加以执行的.如下分别介绍有关的顺序描述语句.1. WAIT 语句进程在执行过程中总是处于两种状态:执行或挂起,进程的状态变化受等待语句的控制,当进程执行到等待语句,就被挂起,并等待再次执行进程.等待语句的格式:WAIT 无限等待* WAIT ON 敏感信号变化格式:WAIT ON 信号,信号例: PROS(a,b)BEGINy=a AND b;END PROS;该例中的进

34、程与下例中进程相同:例: PROSBEGINy=aAND b;WAITON a,b;END PROS;* WAIT UNTIL 直到条件满足格式: WAIT UNTIL表达式当进程执行到该语句时,被挂起;若表达式为真时,进程将被启动.例: WAIT UNTIL (x*10)100)WAIT FOR 等到时间到格式: WAIT FOR 时间表达式当进程执行到该语句时,被挂起;等待一定的时间后,进程将被启动.例: WAIT FOR 20 ns*多条件 WAIT 语句例: WAIT ON nmi,errupt UNTIL (nmi=TRUE) OR (errupt=TRUE)FOR5 us该等待有三

35、个条件:第一,信号 nmi 和errupt 任何一个有一次刷新动作第二, 信号 nmi 和errupt 任何一个为真第三, 等待 5 us只要一个以上的条件被满足,进程就被启动.*超时等待若在程序中所设置的等待条件不会满足,则进程就不能启动,为防止进入无限等待情况,应做一些处理.2. 断言语句(ASSERT)格式: ASSERT 条件 REPORT 输出信息SEVERITY 级别执行到断言语句时,判断条件,若条件满足就继续执行,否则输出文字串和错误级别信息.例: ASSERT (tiaojian=1)REPORT “some thing wrong”SEVERITY ERROR;3. 信号代入

36、语句格式: 目的信号量=信号量表达式例: a=b;4. 变量赋值语句格式: 目的变量:=表达式例: c:=a+d5. IF 语句1) IF 的门闩控制格式:IF 条件 THEN顺序执行语句END IF;例:IF (a=1) THENc顺序处理语句ENDCASE;其中 WHEN 的条件表达式可以有 4 种形式:WHEN值=顺序处理语句值|值|值|值=顺序处理语句WHENWHEN值 TO 值=顺序处理语句WHENOTHERS=顺序处理语句例:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux43 ISPORT(a,b,i0,i1,i2,i3:IN

37、STD_LOGIC;q: OUT STD_LOGIC);END mux43;ARCHITECTURE mux4_behaveOF mux43 ISSIGNAL sel:EGER RANGE 0 TO 3;BEGINnn: PROS(a,b,i0,i1,i2,i3)BEGINsel=0;IF (a=1) THENsel=sel+1;END IF;IF (b=1) THENselqqqq=i3;ENDCASE;END PROS nn;ENDmux4_behave;7. LOOP 语句格式一:标号: FOR 循环变量 IN离散范围LOOP顺序处理语句END LOOP 标号;例: ASUM: FORi

38、 IN 1 TO 9 LOOPsum=1+sum;END LOOP ASUM;例:位奇偶校验电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY pcISPORT(a: IN STD_LOGIC_VECTOR(7DOWNTO0);y: OUT STD_LOGIC);END pc;ARCHITECTUREbehave OF pc ISBEGINcbc:PROS(a)VARIABLE tmp: STD_LOGIC;BEGINtmp:=0;FOR i IN 0 TO 7 LOOPtmp:=tmp XOR a(i);END LOOP;y=tmp;END P

39、ROS cbc;END behave;格式二:标号: WHILE 条件 LOOP顺序处理语句END LOOP 标号;在该语句中,如果条件为真,则进行循环,否则结束循环.例:sum:=0abcd: WHILE (I10) LOOPsum:=I+sum;I:=I+1;END LOOP abcd;8. NEXT 语句在 LOOP 语句中用 NEXT 语句跳出循环.格式: NEXT 标号WHEN 条件;NEXT 语句用于控制内循环的结束.例:PROS (a,b)CONSTANT max_limit:EGER:=255BEGINFOR I IN 0 TO max_limit LOOPIF (done(I

40、)=TRUE) THENNEXT;ELSE done(I):=TRUE;END IF;q(I)=a(I) AND b(I);END LOOP;END PROS;9.EXIT 语句EXIT 语句用于结束 LOOP 循环状态.格式: EXIT 标号 WHEN 条件例:PROS(a)VARIABLE_a:EGER;BEGIN_a:=aFOR I=0 IN 0TO max_limitLOOPIF (_a=0) THENEXIT;ELSE_a:=_a-1;q(I)=3.1416/REAL(a*I);END IFEND LOOP;y=q;END PROS;(2)并发描述语句1. 进程语句在一个构造体中多个

41、 PROS 语句可以同时并行的执行,该语句有如下特点:1)可以和其它进程语句同时执行,并可以存取构造体和实体中所定义的信号2)进程中的所有语句都按照顺序执行3)为启动进程,在进程中必须包含一个敏感信号表或 WAIT 语句4)进程之间的通信是通过信号量来实现的2. 并发信号代入代入语句在进程中使用是顺序语句,但是在进程外即在构造体中使用就是并发语句,相当于一个进程.例:ARCHITECTURE behave OF a_var ISBEGINOutput=a(I);END behave;可以等效于:ARCHITECTURE behave OF a_var ISBEGINss PROS(a,I)BE

42、GINOutput=a(I);END PROS ss;END behave;信号代入语句的右边可以是算数表达式,也可以是逻辑表达式,还可以是关系表达式,所以可以仿真加法器、乘法器、除法器、比较器和各种逻辑电路。3. 条件信号代入条件代入语句也是并发语句,它可以将符合条件的表达式代入信号量。格式:目的信号量=表达式 1 WHEN 条件 1ELSE表达式 2 WHEN 条件 2ELSE表达式 3 WHEN 条件 3:ELSE表达式 n;例:四选一电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux44 ISPORT(i0,i1,i2,i3,a,

43、b:IN STD_LOGIC;q: OUT STD_LOGIC);END mux44;ARCHITECTURE aa OF mux44 ISSIGNAL sel: STD_LOGIC_VECTOR(1DOWNTO0);BEGINsel=b & a;q= i0WHENsel=00ELSEi1WHENsel=01ELSEi2WHENsel=10ELSEi3WHENsel=11;END aa;4. 选择信号代入格式: WITH 表达式样 SELECT目的信号量=表达式 1WHEN条件 1表达式 2WHEN条件 2:表达式 nWHEN条件 n;该语句很象 CASE 语句.例:LIBRARY IEEE;

44、USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux45 ISPORT(i0,i1,i2,i3,a,b:IN STD_LOGIC;q:OUTSTD_LOGIC);END mux45;ARCHITECTURE bb OF mux45ISSIGNAL sel:EGER range0 to 3;BEGINWITH sel SELECTq=i0 WHEN 0,i1 WHEN 1,i2 WHEN 2,i3 WHEN 3;sel=0WHENa=0ANDb=0ELSE1WHENa=1ANDb=0ELSE2WHENa=0ANDb=1ELSE3WHENa=1ANDb=1;END bb;5

45、. 并发过程调用语句过程调用语句可以并发执行,但要注意如下问题:并发过程调用是一个完整的语句,在它之前可以加标号并发过程调用语句应带有IN,OUT 或INOUT 的参数,他们应该列在过程名后的括号内并发过程调用可以有多个返回值例:ARCHITECTURE.BEGINvector_to_(z,x_flag,q);:END;等同于:ARCHITECTURE.BEGINPROS(z,q)BEGINvector_to_(z,x_flag,q);:END PROS;END;1.4.7 基本逻辑电路设计(1)组合逻辑电路例1 2 输入与非门电路LIBRARY ieee;USE ieee.std_logic

46、_1164.all;entity xx1isport(a,b:in std_logic;y:out std_logic);end xx1;architecture nand2pp OF xx1isbeginy=a nand b;end nand2pp;例 2: 2 输入或非门LIBRARY ieee;use ieee.std_logic_1164.all;entity nor2 isport(a,b: in std_logic;y: out std_logic);end nor2;architecture nor_behave of nor2isbeginy=a nor b;end nor_b

47、ehave;例3 2 输入异或门电路library ieee;use ieee.std_logic_1164.all;entity xor2 isport(a,b: in std_logic;y: out std_logic);end xor2;architecture xor_behave ofxor2isbeginy=a xor b;end xor_behave;例 4 3-8 译LIBRARY ieee;USE ieee.std_logic_1164.all;entity decoder38 isport(a,b,c,g1,g2a,g2b: in std_logic;y: out std

48、_logic_vector(7 downto0);end decoder38;architecture behave38 OF decoder38 issignal indata: std_logic_vector(2 downto0);beginindatayyyyyyyyy=XX;end case;elsey=11111111;end if;end pros;end behave38;例 5 优先编LIBRARY ieee;USE ieee.std_logic_1164.all;entity prior isport( input: in std_logic_vector(7downto0

49、);y: out std_logic_vector(2 downto 0);end prior;architecture be_prior OF prior isbeginpros(input)beginif(input(0)=0) theny=111;elsif (input(1)=0)theny=110;elsif (input(2)=0)theny=101;elsif (input(3)=0)theny=100;elsif (input(4)=0)theny=011;elsif (input(5)=0)theny=010;elsif (input(6)=0)theny=001;elsif

50、 (input(7)=0)theny=000;end if;end pros;end be_prior;例7四选一选择器LIBRARY ieee;USE ieee.std_logic_1164.all;entity mux4 isport( input: in std_logic_vector(3downto0);a,b: in std_logic;y: out std_logic);end mux4;architecture be_mux4 OF mux4 issignal sel: std_logic_vector(1 downto 0);beginsel=b&a;pros(input,s

51、el)beginif(sel=00) theny=input(0);elsif (sel=01)theny=input(1);elsif (sel=10)theny=input(2);elsey=input(3);endif;endpros;endbe_mux4;例8:加法器LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arill;ENTITY adder ISPORT (op1, op2: INUNSIGNED(7downto0);result:OUTEGER);END adder;ARCHITECTUREmaxpld

52、OF adder ISBEGINresult =CONV_EGER(op1 +op2);END maxpld;例9半加器LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY half ISPORT (a, b: INstd_LOGIC;s,co: OUT std_LOGIC);END half;ARCHITECTUREhalf1 OF half ISsignal c,d:std_logic;BEGINc=a or b;d=a nand b;co=not d;s=c and d;end half1;例 10 全加器,由半加器组成,以元件方式调用.LIBR

53、ARY ieee;USE ieee.std_logic_1164.all;ENTITY half ISPORT (a, b: INstd_LOGIC;s,co: OUT std_LOGIC);END half;ARCHITECTURE half1 OF half ISsignalc,d:std_logic;BEGINc=aor b;d=anand b;co=not d;s=c and d;end half1;LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY full ISPORT (a, b,cin: INstd_LOGIC;s,co: OUT s

54、td_LOGIC);END full;ARCHITECTURE full1 OF full IScomponenlfPORT (a, b: INstd_LOGIC;s,co: OUT std_LOGIC);end component;signal u0_co,u0_s,u1_co:std_logic;beginu0:half port map(a,b,u0_s,u0_co);u1:half port map(u0_s,cin,s,u1_co);co=u0_co or u1_co;end full1;例 10: 三态门LIBRARY ieee;USE ieee.std_logic_1164.al

55、l;ENTITY tri ISPORT (din, en:INstd_LOGIC;dout: OUTstd_LOGIC);END tri;ARCHITECTURE tri1 OFtri ISBEGINtri_gate: pros(din,en)beginif (en=1) thendout=din;elsedout=Z;end if;end pros;end tri1;例 11 三态单向总线LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY bufs ISPORT (din: INstd_LOGIC_vector(7downto 0);dout :

56、OUT std_LOGIC_vector(7downto0)bus;en: INstd_LOGIC);END bufs;ARCHITECTURE bufs1 OF bufs ISBEGINpros(en,din)beginif (en=1) thendout=din;elsedout=ZZZZZZZZ;end if;end pros;end bufs1;(2)时序电路设计1. 时钟信号和复位信号1) 时钟信号的描述* 若进程的敏感信号是时钟信号,这时时钟信号出现在 PROS 后的括号中.例: pros (clock_signal)beginif (clock_edge_condition) t

57、hensignal_out=signal_in:其它语句:end if;end pros;* 在进程中用 WAIT ON 语句等待时钟这样的电路没有敏感信号,进程通常停留在 WAIT ON 语句上,只有时钟信号到来且满足一定条件时,其余语句才能执行.例:prosbeginwait on (clock_signal) until (clock_edge_condition)signal_out=signal_in;:其它语句:end pros;*敏感表中只能有一个时钟信号*wait on 语句只能放在进程的最前面或者最后面*时钟的边沿描述描述时钟一定要指明是上升沿还是下降沿上升沿到来的条件:IF

58、 clk=1 AND clkLAST_VALUE=0ANDclkEVENT下降沿到来的条件:IF clk=0 AND clkLAST_VALUE=1clkEVENTAND关于时钟信号的总结:IF clock_signal=current_value ANDclock_signalLAST ANDclock_siganlEVENT可以简单写为:IF clock_signal=clock_siganlEVENTANDcurrent_value例 1:对于上升沿 D 触发器,其描述为:pros(clk,d)beginif(clkevent and clk=1) thenq=d;end if;end

59、pros;例 2:对于上升沿 D 触发器的另一描述为:prosbeginuntil clkevent and clk=1;waitq=d;end pros;2. 复位信号*同步复位当复位信号有效且在给定的时钟边沿到来时,触发器才被复位.例 1:pros (clock)beginif (clock_edge_condition) thenif (reset_condition) thensignal_out=reset_value;elsesignal_out=signal_in;:其它语句:end if;end if;end pros;例 2:pros(clock)(clockeventand

60、 clock=1)ifthenif reset=1 thencount=0;elsecount=count+1;end if;end if;end pros;此例中,敏感表中只有时钟信号,因为只有时钟到来时才能复位.* 异步复位只要复位信号有效,触发器就被复位,所以敏感表中除时钟信号外,还需要复位信号例 1:pros(reset_signal,clock_signal)beginif (reset_signal) thensignal_out=reset_value;elsif (clock_event and clock_edge_condition)thensignal_out=signa

温馨提示

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

评论

0/150

提交评论