《VHDL设计进阶》PPT课件.ppt

上传人:za****8 文档编号:16088118 上传时间:2020-09-18 格式:PPT 页数:96 大小:1.19MB
返回 下载 相关 举报
《VHDL设计进阶》PPT课件.ppt_第1页
第1页 / 共96页
《VHDL设计进阶》PPT课件.ppt_第2页
第2页 / 共96页
《VHDL设计进阶》PPT课件.ppt_第3页
第3页 / 共96页
点击查看更多>>
资源描述
第5章 VHDL设计进阶,第5章 VHDL设计进阶,5.1 VHDL语言要素,5.2 VHDL顺序语句,5.3 VHDL并行语句,5.4 子程序,5.5 库、程序包及其配置,5.6 VHDL描述风格,5.7 单元电路的设计举例,5.8 VHDL与原理图混合设计举例,第5章 VHDL设计进阶,数字的表达可以是整数文字 、实数文字、以数制基数表示的文字和物理量文字。 字符是用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母,如:R, A,*,0。而字符串则是一维的字符数组,须放在双引号中。,5.1 VHDL语言要素,1、VHDL文字规则,标识符是VHDL语言中各种成分的名称,这些成分包括常量、变量、信号、端口、子程序或参数等。定义标识符需要遵循以下规则: l 有效的字符:包括26个大小写英文字母,数字09以及下划线“_”。 l 任何标识符必须以英文字母开头。 l 必须是单一下划线“_”,且其前后都必须有英文字母或数字。 l 标识符中的英文字母不分大小写。 l 允许包含图形符号(如回车符、换行符等),也允许包含空格符。 l VHDL的保留字不能用于作为标识符使用。,以下是几种合法和非法标识符的示例。 合法的标识符:Decoder_1,FFT,abc123。 非法的标识符: _Decoder_1 -起始为非英文字母 2 FET -起始为数字 Not-RST -符号“-”不能作为标识符的构成 RyY_RST_ -标识符的最后不能是下划线 Data_ _BUS -标识符中不能有双下划线 Begin -关键词不能作为标识符 res -使用了无效字符“”,下标名用于指示数组型变量或信号的某一元素,而下标段名则用于指示数组型变量或信号的某一段元素,其语句格式如下: 数组类型信号名或变量名(表达式lTO/DOWNTO 表达式2); 下面是下标名及下标段名使用示例: SIGNAL a, b, c:BIT_VECTOR(0 TO 7); SIGNAL m: INTEGER RANGE 0 TO 3; SIGNAL y,z:BIT; y=a(m);-m是不可计算型下标表示 z=b(3); -3是可计算型下标表示 c(0 TO 3)a(4 TO 7);-以段的方式进行赋值 c(4 TO 7)= a(0 TO 3);-以段的方式进行赋值,常量的定义形式如下: CONSTANT 常量名:数据类型:=表达式; 例如: CONSTANT fbt:STD_LOGIC_VECTOR :=“010110”; -标准位矢类型 CONSTANT vcc:REAL:=5.0; -实数类型 CONSTANT dely:TIME:=25ns; -时间类型 常量定义语句所允许的设计单元有实体、结构体、程序包、块、进程和子程序。,2、VHDL数据对象,(1)常量(CONSTANT),定义变量的语法格式如下: VARIABLE 变量名:数据类型:=初始值; 例如: VARIABLE a :INTEGER RANGE 0 TO 15; VARIABLE b,c : INTEGER:=2; VARIABLE d :STD_LOGIC; 变量赋值的一般表达式如下: 目标变量名:=表达式; 变量作为局部量,其适用范围仅限于定义了变量的进程或子程序的顺序语句中,(2)变量(VARIABLE),信号的定义格式如下: SIGNAL 信号名:数据类型:=初始值; 以下是信号的定义示例: SIGNAL s1:STD_LOGIC:=0;-定义了一个标准位的单值信号s1,初始值为低电平 SIGNAL s2,s3: BIT; -定义了两个位(BIT)的信号 s2和 s3 SIGNAL s4:STD_LOGIC_VECTOR(15 DOWNTO 0); 信号的赋值语句表达式如下: 目标信号名=表达式; 信号的使用和定义范围是实体、结构体和程序包。在进程和子程序中不允许定义信号。,(3)信号(SIGNAL),(6)信号赋值和变量赋值分别使用不同的赋值符号“=”和“:=”,信号类型和变量类型可以完全一致,也允许两者之间相互赋值,但要保证两者的类型相同。,(4)信号与变量的区别,(1)信号赋值至少有延时,而变量赋值没有延时。,(2)信号除当前值外有许多相关的信息,而变量只有当前值。,(3)进程对信号敏感而对变量不敏感。,(4)信号可以是多个进程的全局信号;而变量只在定义它们的顺序域可见(共享变量除外)。,(5)信号是硬件中连线的抽象描述,它们的功能是保存变化的数据和连接子元件,信号在元件的端口连接元件。变量在硬件中没有类似的对应关系,它们用于硬件特性的高层次建模所需要的计算中。,(4)用户自定义数据类型 :枚举类型 ,整数与实数类型 ,数组类型 ,记录类型,3、VHDL数据类型,四大类:标量、复合、存取、文件类型,每类分为两种。 (1)VHDL的预定义数据类型 :布尔(BOOLEAN)数据类型,位(BIT)数据类型,位矢量(BIT_VECTOR)数据类型 ,字符(CHARACTER)数据类型 ,整数(INTEGER)数据类型,自然数(NATURAL)和正整数(POSITIVE)数据类型 ,实数(REAL)数据类型 ,字符串(STRING)数据类型 ,时间(TIME)数据类型,(2)IEEE预定义标准逻辑位与矢量 :标准逻辑位 STD_LOGIC数据类型 ,标准逻辑矢量STD_LOGIC_VECTOR数据类型,(3)其他预定义标准数据类型 :无符号数据类型(UNSIGNED TYPE),有符号数据类型(SIGNED TYPE)。,数据类型的转换 函数转换法(P114:例5-1),在VHDL语言中的类型标记转换法是直接使用类型名进行数据类型的转换,这与高级语言中的强制类型转换类似。其语句格式如下: 数据类型标志符(表达式); 下面几个语句说明了标记类型转换的例子。 VARIABLE a:INTEGER; VARIABLE b:REAL; a:=INTEGER(b); b:=REAL(a); (常数转换法) 数据类型限定(P115),类型标记转换法,4、VHDL操作符,表53VHDL操作符优先级,例5-2: 逻辑运算VHDL描述(p118),例5-3: 四位二进制数比较程序1(p118),例5-4: 四位二进制数比较程序2(p119),例5-5: 整数加法运算电路(p119),重载操作符:重新定义(p120),变量赋值语句和信号赋值语句的语法格式如下: 变量赋值目标 :=赋值源; 信号赋值目标 =赋值源;,5.2 VHDL顺序语句,1、赋值语句,信号和变量的赋值,六类基本顺序语句:赋值语句、转向控制语句、等待语句、子程序调用语句、返回语句、空操作语句。,例5-6: SIGNAL s1,s2:STD_LOGIC; SIGNAL svec:STD_LOGIC_VECTOR(0 TO 3); PROCESS(s1,s2) VARIABLE v1,v2:STD_LOGIC; BEGIN v1:=1; -立即将变量v1置位为1 v2:=1; -立即将变量v2置位为1 s1=1; -信号s1被赋值为1 s2=1; -由于在本进程中,这里的s2不是最后一个赋值语句故不作任何赋值操作,svec(0)=v1; -将变量v1在上面的赋值1,赋给svec(0) svec(1)=v2; -将变量v2在上面的赋值1,赋给svec(1) svec(2)=s1; -将信号s1在上面的赋值1,赋给svec(2) svec(3)=s2; -将最下面的赋予s2的值0,赋给svec(3) v1:=0; -将变量v1置入新值0 v2:=0; -将变量v2置入新值0 s2:=0; -由于这是信号s2最后一次赋值,赋值有效,此0将-上面准备赋入的1覆盖掉 END PROCESS;,IF语句是一种条件语句,它根据语句中所设置的一种或多种条件,有选择地执行指定的顺序语句,常见的IF语句有以下种形式。 (1) IF 条件 THEN 语句 END IF; (2) IF 条件 THEN 语句 ELSE 语句 END IF; (3) IF 条件THEN 语句 ELSIF 条件THEN 语句 ELSE 语句 END IF;,2、转向控制语句(五种),(1)IF语句,例57 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY eqcomp4 IS PORT( a,b:IN STD_LOGIC_VECTOR (3 DOWNTO 0); equals:OUT STD_LOGIC); END eqcomp4; ARCHITECTURE behave OF eqcomp4 IS BEGIN comp:PROCESS(a,b) BEGIN equals=0;,IF a=b THEN equals=1; END IF; END PROCESS comp; END behave; 例58 ARCHITECTURE behave OF eqcomp4 IS BEGIN comp:PROCESS(a,b) BEGIN IF a=b THEN equals=1; ELSE equals=0; END IF; END PROCESS comp; END behave;,例59 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT( a,b,c,d:IN STD_LOGIC_VECTOR (3 DOWNTO 0); s:IN STD_LOGIC_VECTOR(1 DOWNTO 0); X:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); END mux4; ARCHITECTURE behave OF mux4 IS BEGIN Mux4:PROCESS(a,b,c,d),BEGIN IF s=00 THEN -第3种IF语句,实现多选1功能 X=a; ELSIF s=01 THEN X=b; ELSIF s=10 THEN X=c; ELSE X=d; END IF; END process mux4; END behave;,CASE语句是VHDL提供的另一种形式的条件控制语句,它根据所给表达式的值选择执行语句集。CASE语句与IF语句的相同之处在于:它们都根据某个条件在多个语句中集中进行选择。CASE语句与IF语句的不同之处在于:CASE语句根据某个表达式的值来选择执行体。CASE语句的一般形式为 CASE 表达式 IS WHEN 值1= 语句A; WHEN 值2= 语句B; . WHEN OTHERS= 语句C; END CASE,(2)CASE语句,(4)CASE语句执行中必须选中,且只能选中所列条件语句中的一条。,CASE语句使用中应注意以下几点:,(1)WHEN条件句中的选择值或标识符所代表的值必须在表达式的取值范围内。,(2)除非所有条件句中的选择值能完整覆盖CASE语句中表达式的取值,否则最后一个条件句中的选择必须用关键词OTHERS表示以上已列的所有条件句中未能列出的其它可能的取值。,(3)CASE语句中的选择值只能出现一次,不允许有相同选择值的条件语句出现。,例510 -4选1多路选择器描述方式2 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY test_case IS PORT( s1,s2:IN STD_LOGIC; a,b,c,d: IN STD_LOGIC; z:OUT STD_LOGIC ); END test_case; ARCHITECTURE behave OF test_case IS,SIGNAL s:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN Szzzzz=x; END CASE; END PROCESS; END behave;,LOOP语句就是循环语句,它用于实现重复的操作,由FOR循环或WHILE循环组成。FOR语句的执行根据控制值的规定数目重复;WHILE语句将连续执行操作,直到控制逻辑条件判断为TRUE。下面给出FOR循环语句和WHILE循环语句的一般形式。 (a)FOR 循环 FOR循环语句的一般形式为: 循环标号: FOR 循环变量 IN 循环次数范围 LOOP 顺序处理语句 END LOOP循环标号; FOR循环语句中的循环变量的值在每次循环中都将发生变化,而IN后面的循环次数范围则表示循环变量在循环过程中依次取值的范围。,(3)LOOP语句,【例5-11】-8位奇偶校验电路 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY p_check IS PORT(a: IN STD_LOGIC_VECTOR(7 DOWNTO 0); y: OUT STD_LOGIC); END p_check; ARCHITECTURE behave OF p_check IS SIGNAL tmp: STD_LOGIC;,BEGIN PROCESS(a) BEGIN tmp=0; FOR n IN 0 TO 7 LOOP-FOR循环语句 tmp=tmp XOR a(n); END LOOP; y=tmp; END PROCESS; END behave;,WHILE循环语句的一般形式为: 循环标号:WHILE 条件LOOP 顺序处理语句 END LOOP循环标号; 在WHILE循环中,如果条件为“真”,则进行循环;如果条件为“假”,则结束循环。 WHILE循环语句在这里可用于替代FOR循环语句,但需要有附加的说明、初始化和递增循环变量的操作。 请注意:一般的综合工具可以对FOR LOOP循环语句进行综合;而对WHILE LOOP循环语句来说,只有一些高级的综合工具才能对它进行综合,所以,一般使用FOR LOOP循环语句,而很少使用WHILE LOOP循环语句。,(b)WHILE循环,【例5-12】 -8位奇偶校验电路 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY p_check2 IS PORT(a: IN STD_LOGIC_VECTOR(7 DOWNTO 0); y: OUT STD_LOGIC); END p_check2; ARCHITECTURE behave OF p_check2 IS SIGNAL tmp: STD_LOGIC; BEGIN,PROCESS(a) VARIABLE i:INTEGER:=0; BEGIN tmp=0; WHILE i8 LOOP-WHILE循环 tmp=tmp XOR a(i); i:=i+1; END LOOP; y=tmp; END PROCESS; END behave;,EXIT语句与NEXT语句具有十分相似的语句格式和跳转功能,它们都是LOOP语句的内部循环控制语句。EXIT的语句格式也有三种: (1) EXIT; (2) EXIT LOOP 标号; (3) EXIT LOOP标号WHEN条件表达式;,(4)NEXT语句,有时候由于某种情况需要跳出循环,而去执行另外的操作,这就需要采用跳出循环的操作。VHDL语言提供了两种跳出循环的操作,一种是NEXT语句,另一种是EXIT语句。NEXT语句主要用于在LOOP语句执行中有条件的或无条件的转向控制。它的语句格式有以下三种: (1)NEXT; (2)NEXT LOOP标号; (3)NEXT LOOP标号 WHEN 条件表达式;,(5)EXIT语句,() 多条件WAIT语句,即上述条件中有多个同时出现,此时只要多个条件中有一个成立,则终止挂起。,3、WAIT语句,WAIT语句的格式如下: WAITON 信号表UNTIL 条件表达式FOR 时间表达式; WAIT语句有以下几种形式。,() 单独的WAIT,未设置停止挂起的条件,表示永远挂起。,() WAIT ON信号表,即敏感信号等待语句,当敏感信号变化时,结束挂起。 例如:WAIT ON a,b;,() WAIT UNTIL条件表达式,即条件等待语句,当条件表达式中所含的信号发生了变化,并且条件表达式为真时,进程才能脱离挂起状态,继续执行此语句后面的语句。 例如:WAIT UNTIL(x*10)100);,() WAIT FOR时间表达式,直到指定的时间到时,挂起才结束。,函数调用与过程调用十分相似,不同之处是,调用函数将返回一个指定数据类型的值,函数的参量只能是输入值。,4、子程序调用语句,子程序包括过程和函数,可以在VHDL的结构体或程序包中的任何位置对子程序进行调用。,1(1)过程调用,过程调用就是执行一个给定名字和参数的过程。调用过程的语句格式如下: 过程名(形参名=实参表达式 ,形参名=实参表达式); 一个过程的调用有三个步骤: 将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参; 执行这个过程; 将过程中IN和INOUT模式的形参值返回给对应的实参。,(2) 函数调用,返回语句只能用于子程序中,并用来结束当前子程序的执行。其语句有两种格式: (1)RETURN; (2)RETURN表达式; 第一种语句格式只能用于过程,它只是结束过程,并不返回任何值;第二种语句格式只能用于函数,并且必须返回一个值。,5、返回语句,空操作语句不完成任何操作,它唯一的功能就是使程序执行下一个语句。NULL常用于CASE语句中,利用NULL来表示所余的不用的条件下的操作行为,以满足CASE语句对条件值全部列举的要求。 空操作语句格式如下: NULL;,6、 NULL语句,7、其它语句,并行语句在结构体中的使用格式如下: ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 并行语句; END ARCHITECTURE 结构体名; 结构体中的并行语句主要有:进程语句、并行信号赋值语句、块语句、元件例化语句、生成语句、并行过程调用语句等,5.3 VHDL并行语句,PROCESS语句格式 PROCESS语句的表达格式如下: 进程标号:PROCESS(敏感信号参数表)IS 进程说明部分 BEGIN 顺序描述语句 END PROCESS进程标号;,1、进程语句,(4)进程是重要的建模工具。进程结构不但为综合器所支持,而且进程的建模方式将直接影响仿真和综合结果。,进程的设计需要注意以下几方面的问题:,(1)虽然同一结构体中的进程之间是并行运行的,但同一进程中的逻辑描述语句则是顺序运行的,因而在进程中只能设放置顺序语句。,(2)进程的激活必须由敏感信号表中定义的任一敏感信号的变化来启动,否则必须有一显式的WAIT语句来激活。,(3)结构体中多个进程之所以能并行同步运行,一个很重要的原因是进程之间的通信是通过传递信号和共享变量值来实现的。,【例5-22】-进程的应用 ENTITY mul IS PORT(a,b,c,selx,sely:IN BIT; data_out:OUT BIT); END mul; ARCHITECTURE ex OF mul IS SIGNAL temp:BIT; BEGIN p_a:PROCESS(a,b,selx) BEGIN,IF(SELX=0)THEN temp=a; ELSE temp=b; END IF; END PROCESS p_a; p_b:PROCESS(temp,c,sely) BEGIN IF (sely=0) THEN data_out=temp; ELSE data_out=c; END IF; END PROCESS p_b; END ex;,作为另一种并行赋值语句,条件信号赋值语句的表达方式如下: 赋值目标=表达式1 WHEN 赋值条件1 ELSE 表达式2 WHEN赋值条件2 ELSE . 表达式n;,2、并行信号赋值语句,(1) 简单信号赋值语句,简单信号赋值语句是VHDL并行语句结构的最基本的单元,它的语句格式如下: 赋值目标=表达式;,(2)条件信号赋值语句,【例5-24】-条件信号赋值 ENTITY mux IS PORT(a,b,c: IN BIT; p1,p2:IN BIT; z: OUT BIT); END mux; ARCHITECTURE behave OF mux IS BEGIN z=a WHEN p1=1 ELSE b WHEN p2=1 ELSE c; END;,选择信号赋值语句的语句格式如下: WITH 选择表达式SELECT 赋值目标信号=表达式1 WHEN 选择值1, 表达式2 WHEN 选择值2, . 表达式n WHEN 选择值n;,(3)选择信号赋值语句,【例5-25】-选择信号赋值 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY decoder IS PORT(a,b,c:IN STD_LOGIC; data1,data2:IN STD_LOGIC; dataout:OUT STD_LOGIC); END decoder; ARCHITECTURE concunt OF decoder IS SIGNAL instruction: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN,instruction=c,块标号:BLOCK(块保护表达式) 说明语句 BEGIN 并行语句 END BLOCK 块标号; 利用BLOCK语句可以将结构体中的并行语句划分多个并列方式BLOCK,每一个BLOCK都像一个独立的设计实体,具有自己的类属参数说明和界面端口,以及与外部环境的衔接描述。,3、块语句结构(BLOCK),【例5-26】-块的应用 ARCHITECTURE behave OF cpu IS SIGNAL ibus,dbus;tw32; BEGIN alu:BLOCK SIGNAL qbus;tw32; BEGIN -ALU 行为描述 END BLOCK alu; reg8:BLOCK SIGNAL zbus;tw32; BEGIN reg1:BLOCK SIGNAL qbus;tw32;,BEGIN -REG行为描述 END BLOCK reg1; -其他REG行为描述语句 END BLOCK reg8; END behave;,4、并行过程调用语句,过程标号:过程名(关联参量名);,【例5-27】-并行过程的调用 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY mft IS PORT(a,b,c:IN STD_LOGIC; q:OUT STD_LOGIC); END mft; ARCHITECTURE behave OF mft IS PROCEDURE max(ina,inb:IN STD_LOGIC; SIGNAL ouc:OUT STD_LOGIC)IS VARIABLE temp:STD_LOGIC ; BEGIN,IF(inainb) THEN temp:=inb; ELSE temp:=ina; END IF; ouc=temp; end max; SIGNAL temp1,temp2:STD_LOGIC; BEGIN max(a,b,temp1); max(temp1,c,temp2); q=temp2; END behave;,元件例化语句由两部分组成,前一部分是把一个现成的设计实体定义为一个元件,第二部分则是此元件与当前设计实体中的连接说明,它们的完整的语句格式如下: COMPONENT 元件名 IS -元件定义语句 GENERIC (类属表); PORT(端口名表); END COMPONENT 元件名; 例化名:元件名 PORT MAP( -元件例化语句 端口名=连接端口名,.); 第一部分语句是元件定义语句,相当于对一个现成的设计实体进行封装,使其只留出对外的接口界面。元件例化的第二部分语句即为元件例化语句,其中的例化名是必须存在的,PORT MAP是端口映射的意思,其中的端口名是在元件定义语句中的端口名表中已定义好的元件端口的名字,连接端口名则是当前系统与准备接入的元件对应端口相连的通信端口,相当于插座上各插针的引脚名。,5、元件例化语句,【例5-28】-元件例化语句 ENTITY shifter IS PORT(din,clk:IN BIT; dout:OUT BIT); END shifter; ARCHITECTURE a OF shifter IS COMPONENT dff PORT(d,clk:IN BIT; q:OUT BIT); END COMPONENT; SIGNAL d:BIT_VECTOR(0 TO 4);,BEGIN d(0)d(2),clk=clk,q=d(3); -名字关联方式 U3:dff PORT MAP(d=d(3),clk=clk,q=d(4); dout=d(4); END a;,(1)标号:FOR 循环变量 IN取值范围 GENERATE 说明 BEGIN 并行语句 END GENERATE 标号; (2)标号: IF 条件 GENERATE 说明 BEGIN 并行语句 END GENERATE 标号;,6 、生成语句,【例5-29】-1位锁存器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY latch IS PORT(d:IN STD_LOGIC; ena:IN STD_LOGIC; q:OUT STD_LOGIC); END ENTITY latch; ARCHITECTURE one OF latch IS SIGNAL sig_save STD_LOGIC; BEGIN,PROCESS(d,ena) BEGIN IF ena=1 THEN sig_save=d; END IF; q=sig_save; END PROCESS; END one;,【例5-30】-顶层文件 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY SN74373 IS END ENTITY SN74373; ARCHITECTURE two OF SN74373 IS BEGIN END ARCHITECTURE two,ARCHITECTURE one OF SN74373 IS BEGIN Gelatch:FOR inum IN 1 to 8 GENERATE Latchx:latch PORT MAP(d(inum),g,sig_mid(inum); END GENERATE; END ARCHITECTURE one;,【例5-31】-D触发器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY d-ff IS PORT(clk,d:IN STD_LOGIC; q:OUT STD_LOGIC); END d_ff; ARCHITECTURE behave OF d_ff IS SIGNAL q_in: STD_LOGIC; BEGIN,q=q_in; PROCESS(clk) BEGIN IF(clkEVENT AND clk=1) THEN q_in=d; END IF; END PROCESS; END behave;,【例5-32】-4位移位寄存器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY shift_reg IS PORT(d1:IN STD_LOGIC; clk:IN STD_LOGIC; d0:OUT STD_LOGIC); END shift; ARCHITECTURE behave OF shift_reg IS COMPONENT d_ff PORT(d:IN STD_LOGIC; clk:IN STD_LOGIC; q:OUT STD_LOGIC); END COMPONENT;,SIGNAL q:STD_LOGIC_VECTOR(3 DOWNTO 1); BEGIN l:FOR i IN 0 TO 3 GENERATE m:IF(i=0) GENERATE dffx:d_ff PORT MAP(d1,cp,q(i+1); END GENERATE m; n: o: END GENERATE l; END behave;,子程序是一个VHDL程序模块,它是利用顺序语句来定义和完成算法的,应用它能更有效地完成重复性的设计工作。 子程序有两种类型,即过程(PROCEDURE)和函数(FUNCTION)。,5.4 子程序,一般地,函数定义由两部分组成,即函数首和函数体。 FUNCTION 函数名(参数表) RETURN 数据类型;-函数首 FUNCTION 函数名(参数表) RETURN 数据类型IS -函数体开始 说明部分; BEGIN 顺序语句; END FUNCTION 函数名;,1 、函数(FUNCTION),【例5-33】-函数的应用 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY func IS PORT(a:IN STD_LOGIC_VECTOR(0 TO 2); m:OUT STD_LOGIC_VECTOR(0 TO 2); END func; ARCHITECTURE demo OF func IS FUNCTION sam(x,y,z:STD_LOGIC) RETURN STD_LOGIC IS BEGIN,RETURN(x AND y) OR z; END FUNCTION sam; BEGIN PROCESS(a) END PROCESS; END ARCHITECTURE demo;,2 、重载函数(OVERLOADED FUNCTION),VHDL允许以相同的函数名定义不同的函数,即重载函数。,【例5-34】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; function “+”(1:STD_LOGIC_VECTOR;r:INTEGER) RETURN STD_LOGIC_VECTOR; function “+” function “+” function SHR ,LIBRARY IEEE; function maximum (1,r:INTEGER) RETURN INTEGER IS BEGIN IF END IF; END;,【例5-35】-重载函数使用 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL ENTITY CNT4 IS END cnt4; ARCHITECTURE one OF cnt4 IS BEGIN,PROCESS(clk) BEGIN IF q=15 THEN q=q+1; END PROCESS; END one;,过程的语句格式是: PROCEDURE过程名(参数表); -过程首 PROCEDURE过程名(参数表)IS -过程体开始 说明部分; BEGIN 顺序语句; END PROCEDURE过程名; -过程体结束,3、过程(PROCEDURE),PROCEDURE pro1(VARIABLE a,b:INOUT REAL); PROCEDURE pro2(CONSTANT a1:IN INTEGER; VARIABLE b1:OUT INTEGER); PROCEDURE pro3(SIGNAL sig:INOUT BIT);,【例5-36】-过程体 PROCEDURE shift( ) IS VARIABLE sc:INTEGER; BEGIN sc:=conv_integer(s); FOR IN LOOP IF END IF; END LOOP END shift;,【例5-37】-过程体 PROCEDURE comp( ) IS VARIABLE cnt:INTEGER; BEGIN v1:=1.6*a; v2:=1.0; q1:FOR IN LOOP v2:=v2*v1; EXIT q1 WHEN v2v1; END LOOP q1; ASSERT REPORT SEVERITY ERROR; END PROCEDURE comp;,两个或两个以上有相同的过程名和互不相同的参数量及数据类型的过程为重载过程,对于重载过程,也是靠参数类型来辨别究竟调用哪一个过程。,4、重载过程,PROCEDURE calcu(v1,v2:IN REAL; SIGNAL out1:INOUT INTEGER); PROCEDURE calcu(v1,v2:IN REAL; SIGNAL out1:INOUT REAL); calcu(20.15,1.42,sign1); calcu(23,320,sign2); ,(1)IEEE库 (2)STD库 (3) WORK库 (4) VITAL库 (5)用户定义库 库的用法 :USE库名程序包名项目名; USE库名程序包名ALL;,5.5 库、程序包及其配置,1、库(LIBRARY),程序包由两部分组成:程序包首和程序包体,程序包首为程序包定义接口,声明包中的类型、元件、函数和子程序。程序包体规定程序包的实际功能,存放说明中的函数和子程序,其方式与结构体语句模块方式相同。 定义程序包首的一般语句结构如下: PACKAGE 程序包名IS -程序包首 程序包首说明部分 END 程序包名; 定义程序包体的一般语句结构如下: PACKAGE BODY 程序包名IS -程序包体 程序包体说明部分以及包体内容 END 程序包名;,、程序包(PACKAGE),常用的预定义的程序包有4种。 STD_LOGIC_1164程序包 STD_LOGIC_ARITH程序包 STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包 STANDARD和TEXTIO程序包,【例5-38】 PACKAGE pacl IS TYPE ; SUBTYPE ; CONSTANT ; SIGNAL ; COMPONENT byte_adder PORT END COMPONENT; FUNCTION END pacl;,LIBRARY WORK; USE WORK.pacl.ALL; ENTITY ARCHITECTURE ,配置语句的一般格式如下: CONFIGURATION 配置名OF实体名IS 配置说明 END 配置名; 配置主要为顶层设计实体指定结构体,该配置的书写格式如下: CONFIGURATION 配置名OF实体名IS FOR 选配结构体名 END FOR; END 配置名;,3、配置(CONFIGURATION),【例5-39】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand1 IS END ENTITY nand1; ARCHITECTURE one OF nand1 IS END ARCHITECTURE one; ARCHITECTURE two OF nand1 IS END ARCHITECTURE two;,CONFIGURATION second OF nand1 IS FOR two END FOR; END second; CONFIGURATION first OF nand1 IS FOR one END FOR; END first;,【例5-40】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY rs1 IS END rs1; ARCHITECTURE rsf OF rs1 IS COMPONENT nand1 END COMPONENT BEGIN u1:nand1 PORT MAP( ); u2:nand1 PORT MAP( ); END ARCHITECTURE rfs;,CONFIGURATION sel OF rs1 IS FOR rsf FOR u1,u2:nand1 USE CONFIGURATION WORK.first; END FOR END FOR; END sel;,行为描述只表示输入与输出间转换的行为,它不包含任何结构信息。行为描述主要使用函数、过程和进程语句,以算法形式描述数据的变换和传送。,5.6 VHDL描述风格,1、行为描述,【例5-41】-1位全加器行为描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY onebitadder IS PORT(x,y,cin:IN STD_LOGIC; sum,count:OUT STD_LOGIC); END onebitadder; ARCHITECTURE behave OF onebitadder IS BEGIN,PROCESS(x,y,cin) BEGIN END PROCESS; END behave;,数据流描述方式,也称RTL描述方式,主要使用并行的信号赋值语句,既显式地表示了该设计单元的行为,又隐含了该设计单元的结构。,2、数据流描述,【例5-42】-1位全加器数据流描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY onebitadder1 IS PORT(x,y,cin:IN BIT; sum,count:OUT BIT); END onebitadder1; ARCHITECTURE dataflow OF onebitadder1 IS BEGIN,sum=x XOR y XOR cin; count=(x AND y) OR (x AND cin) OR (y AND cin); END dataflow;,所谓结构描述是描述该设计单元的硬件结构,即该硬件是如何构成的。其主要使用元件例化语句及配置语句来描述元件的类型及元件的互连关系。在层次设计中,高层次的设计模块调用低层次的设计模块,或者直接用门电路设计单元来构成一个复杂的逻辑电路的描述方法。,3、结构描述,【例5-43】-1位全加器结构描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY onebitadder2 IS PORT(x,y,cin:IN BIT; sum,count:OUT BIT); END onebitadder2; ARCHITECTURE structure OF onebitadder2 IS COMPONENT xor3 COMPONENT and2 COMPONENT or3 ,SINGAL s1,s2,s3:BIT; BEGIN G1: G2: G3: G4: G5: END structure;,(1)基本门电路,【例5-44】-二输入与门 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY andgate IS PORT(a,b:IN STD_LOGIC;-a,b为输入端口 c:OUT STD_LOGIC);-c为输出端口 END andgate; ARCHITECTURE and_2 OF andgate IS BEGIN c=a AND b; END and_2;,5.7 常用单元的设计举例,1 、组合逻辑电路设计,图5-3 与门工作时序,(2)8-3线优先编码器,【例5-45】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY encoder IS PORT(a,b,c,d,e,f,g,h:IN STD_LOGIC; out0,out1,out2:OUT STD_LOGIC); END encoder; 方法1 使用条件赋值语句 ARCHITECTURE behave1 OF encoder IS SIGNAL outvec:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN outvec(2 downto 0)=111WHEN h=1 ELSE-条件赋值语句,110 WHEN g=1 ELSE 101 WHEN f=1 ELSE 100 WHEN e=1 ELSE 011 WHEN d=1 ELSE 010 WHEN c=1 ELSE 001 WHEN b=1 ELSE 000 WHEN a=1 ELSE 000; out0=outvec(0); out1=outvec(1); out2=outvec(2); END behave1;,图5-4 优先编码器工作时序,【例5-46】-七段显示译码器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY decoder IS PORT( d:IN STD_LOGIC_VECTOR(3 DOWNTO 0);-输入4位二进制数据 x:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);-七段译码输出 END decoder; ARCHITECTURE a OF decoder IS BEGIN WITH d SELECT,x=1111110WHEN 0000, 0110000WHEN 0001, 1101101WHEN 0010, 1111001WHEN 0011, 0110011WHEN 0100, 1011011WHEN 0101, 1011111WHEN 0110, 1110000WHEN 0111, 1111111WHEN 1000, 1111011WHEN 1001, 0000000WHEN OTHERS; END a;,七段显示译码器是对一个4位二进制数进行译码,并在七段显示器上显示出相应的十进制数。一个七段显示译码器的设计方框图如图5-5所示。根据图5-5可知,输入信号D3、D2、D1、D0是二进制BCD码的集合,可表示为D3D0。输出信号a、b、c、d、e、f、g也是用二进制数表示,为书写代码方便起见,输出信号用x的集合来表示。,(3)七段显示译码器,多路分配器的作用是为输入信号选择输出,在计算机和通信设备中往往用于信号的分配。一个1-8多路分配器如图所示。,(4) 多路分配器,【例5-47】-多路分配器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY dmux1to8 IS PORT(data,enable:IN STD_LOGIC;-分别为输入和使能端口 s:IN STD_LOGIC_VECTOR(2 DOWNTO 0);-选择信号端口 y0,y1,y2,y3,y4,y5,y6,y7:OUT STD_LOGIC);-输出端口 END dmux1to8; ARCHITECTURE a OF dmux1to8 IS BEGIN PROCESS(enable,s,data) BEGIN IF enable=0 THEN y0=1;y1=1;y2=1;y3=1;y4=1; y5=1;y6=1;y7=1;,ELSIF s=000 THEN y0=NOT(data); ELSIF s=001 THEN y1=NOT(data); ELSIF s=010 THEN y2=NOT(data); ELSIF s=011 THEN y3=NOT(data);,ELSIF s=100 THEN y4=NOT(data); ELSIF s=101 THEN y5=NOT(data); ELSIF s=110 THEN y6=NOT(data); ELSIF s=111 THEN y7=NOT(data); END IF; END PROCESS; END a;,例5-42的工作时序如图5-8所示。从图中可以看出,根据不同的选择信号s,可以把输入信号在不同的输出端输出。,【例5-48】-多位加法运算 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY adder IS PORT(a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);-输入两个8位二进制数 cin:IN STD_LOGIC;-低位来的进位 s:OUT STD_LOGIC_VECTOR(8 DOWNTO 0);-输出8位结果及产生的进位 END adder; ARCHITECTURE behave OF adder IS BEGIN s=(0,(5)多位加法运算,【例5-49】-三态门电路 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY tristate IS PORT(en,din:IN STD_LOGIC;-en为使能端口,din为输入端口 dout:OUT STD_LOGIC);-输出端口 END tristate;,ARCHITECTURE tri OF tristate IS BEGIN PROCESS(en,din) BEGIN IF en=1 THEN dout=din; ELSE dout=Z; END IF; END PROCESS; end tri;,(6) 三态门及总线缓冲器,【例5-50】-单向总线缓冲器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY trl_buf8 IS PORT(din:IN STD_LOGIC_VECTOR(7 DOWNTO 0);-输入8位二进制数 dout:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);-输出8位二进制数 en:IN STD_LOGIC);-使能端口 END trl_buf8;,ARCHITECTURE behave OF trl_buf8 IS BEGIN PROCESS(en,din) BEGIN IF(en=1)THEN dout=din; ELSE dout=ZZZZZZZZ; END IF; END PROCESS; END behave;,2、 时序逻辑电路设计,【例5-52】-JK触发器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!